#command-line #export-to-excel #libreoffice #csv
#командная строка #экспорт в Excel #libreoffice #csv
Вопрос:
У меня есть входной файл с разделителями табуляции, который я хочу преобразовать в формат Excel ( .xlsx
например, OOXML), используя scalc --headless
.
Я знаю о других вариантах, таких как pyuno, и даже о некоторых готовых сценариях, подобных этому, но я не вижу причин связываться с Python, чтобы выполнить то, что, я уверен scalc
, можно сделать с помощью встроенных параметров командной строки.
Вот что я пробовал, но это не сработало:
scalc --headless --convert-to xlsx input.tsv
scalc --headless --infilter=tsv --convert-to xlsx input.tsv
scalc --headless --infilter=tsv:Text --convert-to xlsx input.tsv
scalc --headless --infilter=Text:tsv --convert-to xlsx input.tsv # --> Error: no export filter
Последние два были полными предположениями, потому что, ну, нет никакой реальной документации для этой --infilter
опции, кроме двух примеров в выходных scalc --help
данных .
Последнее привело к ошибке, но во всех остальных случаях символ табуляции не распознается как разделитель полей, в результирующей таблице Excel все данные объединены вместе в первом столбце.
Список литературы
- https://help.libreoffice.org/latest/en-US/text/shared/guide/start_parameters.html
- в частности, раздел «Общие аргументы«, в котором показаны два примера:
--infilter="Calc Office Open XML" --infilter="Text (encoded):UTF8,LF,Liberation Mono,en-US"
я предполагаю, что это указывает на преобразование из .xlsx в Calc и преобразование из обычного текста в Writer соответственно
- в частности, раздел «Общие аргументы«, в котором показаны два примера:
Комментарии:
1. В настоящее время я даже не беспокоюсь об этом с помощью LibreOffice из-за отсутствия краткой, легкодоступной документации ( например , справочных страниц или ) для параметров конвертера. Вместо этого я использую свою собственную очень тонкую оболочку Python для библиотек openpyxl и tabulate, что далеко не быстро, но достаточно хорошо для большинства одноразовых преобразований Excel с разделителями табуляции , мой типичный вариант использования.
Ответ №1:
Хотя, к сожалению, без документов, я смог собрать это рабочее решение из нескольких разных источников:
scalc --headless --infilter="Text - txt - csv (StarCalc):9"
--convert-to xlsx input.tsv
«9» — это десятичный код управления ASCII для горизонтальной вкладки. Раньше я python -c 'print(ord("t"))'
находил это, хотя man ascii
это тоже сработало бы.
Как подробно описано здесь, существует ряд параметров, разделенных запятыми, которые можно передать этому фильтру:
╔══════════════╤══════════╤═══════════╤═════════════╤══════════════════╤═════════════════════╗
║ option (pos) │ sep. (1) │ quote (2) │ charset (3) │ 1st line (4) │ cell format (5) ║
╠══════════════╪══════════╪═══════════╪═════════════╪══════════════════╪═════════════════════╣
║ defaults (?) │ 44 (,) │ 34 (") │ 0 (system) │ 1 │ null ("standard") ║
╟──────────────┼──────────┼───────────┼─────────────┼──────────────────┼─────────────────────╢
║ example │ 9 (tab) │ 39 (') │ 76 (UTF-8) │ 2 (skip 1st row) │ 1/9 (skip 1st col.) ║
╚══════════════╧══════════╧═══════════╧═════════════╧══════════════════╧═════════════════════╝
Так, например:
scalc --headless --infilter="Text - txt - csv (StarCalc):9,39,76,2,1/9"
--convert-to xlsx input.tsv
Преобразует входной файл с разделителями табуляции с одинарными кавычками в качестве разделителей текста и кодировкой UTF-8 в файл Excel .xlsx, пропуская первую строку и столбец.
Как упоминалось выше, разделитель входных записей и символ кавычек являются порядковыми номерами ASCII. Коды для набора символов можно посмотреть здесь, но 0
(по умолчанию система), 1
(Windows-1252), 12
(ISO-8859-1) и 76
(UTF-8) интересны для англоговорящих.
5-е место в строке параметров, разделенных запятыми, «формат ячейки», задает формат для определенных столбцов и разделяется косой чертой ( col/fmt/col/fmt
). Это подробно объясняется здесь, но кратко:
1 Standard
2 Text
3 MM/DD/YY
4 DD/MM/YY
5 YY/MM/DD
6 - (unused?)
7 - (" ")
8 - (" ")
9 ignore field (do not import)
10 US-English
(',' as 1000s sep, '.' as decimal, regardless of locale)
После этого в строке параметров фильтра есть еще больше значений, которые относятся к различным параметрам в диалоговом окне импорта / экспорта, таким как «Поле в кавычках как текст». Обратитесь снова к той же статье OpenOffice wiki, на которую ссылались выше, для объяснения этого, потому что я выдыхаюсь здесь.
Источники
- в этой статье Linux Journal используется pyuno, которая подсказала мне использование в
Text - txt - csv (StarCalc)
качестве имени фильтра- что я подтвердил, в основном наткнувшись на этот каталог в дереве исходных текстов LibreOffice, где определены все фильтры
- https://wiki.openoffice.org/wiki/Documentation/DevGuide/Spreadsheets/Filter_Options
- в частности, этот раздел для фильтра CSV
- не очень полезно помечено как «больше не актуально с OpenOffice 4.1.x», но достаточно актуально, чтобы решить мою проблему
- эта статья натолкнула меня на идею попробовать порядковый номер ASCII для tab в качестве первого символа части строки «параметры фильтра»
--infilter
- то, что я должен использовать двоеточие в качестве разделителя, я вывел из этого коммита в 2014 году, который добавил два
--infilter
примера к выводуsoffice --help