我在 Ubuntu 15.10 Docker 容器中使用 LibreOffice 5.0.5.2 将任意传入的电子表格文件转换为规范的 CSV 文件:
/usr/lib/libreoffice/program/soffice.bin \
--convert-to 'csv:Text - txt - csv (StarCalc):44,34,76,1,1/2/2/2/3/2,1031,true,false,true' \
--outdir '/tmp/outgoing' \
'incoming.csv'
我认为文档,此命令行应忠实地将电子表格转换为 CSV,使用:
,
作为字段分隔符(“44”)"
作为括号字符(“34”)- UTF-8 作为传入编码(“76”)
- 从文件的第一行开始(“1”)
- 将第 1、2 和 3 列格式化为文本(“1/2/2/2/3/2”),
- 使用 UTF-8 进行传出编码(“1031”)
- 引用所有文本单元格(“true”)
- 不检测特殊数字(“false”)
- 保存单元格内容如图所示(“true”)
这种方法效果很好,但包含某些前导零的文本的列除外。例如,如果incoming.csv
是这样的:
"0123456789"
最终导出的文件如下:
123456789
我的理解是,如果列被标记为文本进口,这将保留前导零,然后反过来,在出口将保留这些保留的零。但对于某些输入集来说,情况似乎并非如此。
例如,它们保留其前导零,我认为这是因为它们包含非数字字符:
0x3E
0 123 456
使用命令行,如何诱导 LibreOffice 在导出期间保留前导零?
答案1
最后,我找到了三个可以帮助我整理的资料来源:
- https://stackoverflow.com/a/30465397/2908724
- https://bugs.documentfoundation.org/show_bug.cgi?id=36313
- https://unix.stackexchange.com/a/259434/50240
上面的命令中缺少的是--infilter
,它指示 LibreOffice 在进口设置。该--convert-to
标志仅指定出口设置。
此命令会完全保留所有测试用例的前导零。神奇的是终端true
,意思是“引用所有文本单元格”,相当于导入对话框中同名的复选框。
/usr/lib/libreoffice/program/soffice.bin \
--convert-to 'csv:Text - txt - csv (StarCalc):44,34,76,1' \
--infilter='CSV:44,34,76,1,,1031,true' \
--outdir '/tmp/outgoing' 'incoming.csv'
附注:参数顺序很重要:--outdir
必须遵循--infilter
和--convert-to
。
此外,似乎--infilter
可以指定多个来声明允许的特定组合和设置。