使用 LibreOffice 的 'scalc' 从命令行将制表符分隔的文本转换为 Excel



我有一个以LF结尾、以制表符分隔的输入文件,我希望使用scalc --headless将其转换为Excel格式(例如OOXML.xlsx(。

我知道其他选项,比如pyuno,甚至还有一些预先编写的脚本,比如这个,但我认为没有理由为了完成我认为scalc可以使用内置命令行选项完成的任务而使用Python。

以下是我尝试过但没有成功的:

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

最后两个完全是猜测,因为除了scalc --help输出中的两个例子之外,没有关于--infilter选项的真正文档。

最后一个产生了一个错误,但在所有其他情况下,制表符都不会被识别为字段分隔符,生成的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的转换

虽然没有文档,但我能够从几个不同的来源拼凑出这个有效的解决方案:

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)

在那之后的过滤器选项字符串中甚至还有更多的值,这些值属于导入/导出对话框中的各种选项,例如";以文本形式引用的字段"再次参考上面链接的同一篇OpenOfficewiki文章来解释这些,因为我在这里已经没有动力了。

来源

  • 这篇使用pyuno的Linux期刊文章,它让我了解了Text - txt - csv (StarCalc)作为过滤器名称的使用
    • 我基本上是错误地进入LibreOffice源树中的这个目录来证实这一点的,在那里定义了所有的过滤器
  • https://wiki.openoffice.org/wiki/Documentation/DevGuide/Spreadsheets/Filter_Options
    • 特别是CSV过滤器的本节
    • 没有那么有用地标记为";从OpenOffice 4.1.x起不再是最新的;但当前足以解决我的问题
    • 这篇文章给了我尝试将tab的ASCII序数作为"的第一个字符的想法;过滤器选项";--infilter字符串的一部分
    • 我应该使用冒号作为分隔符,这是我从2014年的提交中推断出来的,该提交将两个--infilter示例添加到soffice --help的输出中

最新更新