如何在终端上将ODS电子表格文件拆分为每个工作表的CSV文件?

我想将电子表格(ods或xlsx)拆分成多个csv文件,每个工作表一个文件。
我希望能够在不启动图形应用程序的情况下完成此操作,并且最好是一行命令。
有什么想法吗?
虽然链接的重复问题提供了可能的解决方案之一(不在被接受的答案中),并且很有帮助。但该解决方案无法处理我所要求的ODS文件,因此我认为这个问题足够不同。

3个回答

嗯,libreoffice可以从脚本中转换文档(即在无界面模式下进行转换而不打开GUI)。要将任何电子表格格式转换为CSV,最简单的形式可能如下所示。
libreoffice --convert-to csv PATH/TO/YOUR.ODS

然而,这只是提取您文档的第一页并进行转换,忽略其他所有页。可悲的是,它也缺乏选择要转换的页面的选项。
所以我们需要一个外部工具,比如xlsx2csv。它是一个开源的Python(支持2和3版本)脚本,用于将XLSX文件转换为CSV,并支持将所有工作表提取到单独的文件中。
Ubuntu已经预装了Python,但也许你需要先安装pip,它是Python的包管理器。我选择使用Python 3,但你可以根据需要将下面的命令改为在Python 2上运行。
sudo apt install python3-pip

然后,您可以使用pip3xlsx2csv安装到您的用户包目录中,使用以下命令:
pip3 install --user xlsx2csv

之后,可在~/.local/bin/xlsx2csv中找到可执行脚本。
现在如果你还没有以XLSX格式的文件,让我们用libreoffice将那个ODS电子表格转换一下:
libreoffice --convert-to xlsx PATH/TO/YOUR.ods

然后我们使用 xlsx2csv 来提取所有的工作表。它会创建一个名为 OUTPUTFOLDER 的文件夹,并将所有提取出来的 SHEETNAME.csv 放在其中:
~/.local/bin/xlsx2csv -a YOUR.xlsx OUTPUTFOLDER

apt-get install xlsx2csv已经返回一个软件包,有什么理由我不应该尝试一下呢? - Bruni
好的,我试过了,正如你所描述的那样,它运行正常。 - Bruni
1@Bruni 好的观察,我没有意识到它在存储库中。然而,像往常一样,Ubuntu 软件包相当过时(Ubuntu 存储库中的版本号为 2012 年的 0.20 版本,而 PyPI 上的 Python 软件包版本为 2017 年的 0.7.3 版本(不要质疑这个编号方案...))。我使用了 PyPI 版本进行了测试,你可能会遇到已经修复的 bug,不确定。大部分时间可能都能正常工作。你可以查看更改日志 - Byte Commander

使用xls2csv(用于转换.XLS文件)工具,该工具属于catdoc软件包,安装命令为sudo apt install catdoc
xls2csv -b '
' EXCEL.xls | awk '{print >"sheet"NR}' RS='\n\n'

这个 xls2csv -b ' ' EXCEL.xls 读取 MS-Excel 文件,并将其内容作为逗号分隔的数据输出到标准输出,使用 -b STRING 我们告诉工具以什么字符(或字符串;在这里我们定义了一个实际的换行符)来分隔表格。
使用xlsx2csv(用于转换.XLSX);安装sudo apt install xlsx2csv
xlsx2csv -s 0 EXCEL.xlsx |
    awk '!/,/ { nextSheet++; next } { print >"sheet"nextSheet }'

-s 0 的意思是打印所有的工作表。


看一下
ssconvert -O 'separator=:: format=raw quoting-mode=never' -S x.ods  out%n.txt

\感谢{Bruni}

  • -O 'separator= format= ...'用于控制csv格式的细节
  • -S为每个工作表创建一个不同的输出文件

奇怪的是,我尝试使用xlsx文件时它没有起作用,而且在与ods一起使用时只转换了最后一个工作表。 - Bruni
未定义的数字格式ID '43' 未定义的数字格式ID '41' 未定义的数字格式ID '44' 未定义的数字格式ID '42' 在状态中出现意外元素 'workbookProtection': workbook - Bruni
它在ods上使用了-S标志,所以+1。 - Bruni
@布鲁尼,帮我:你能否修正我的不完整回答?ssconvert -O 'separator=:: format=raw quoting-mode=never' x.xlsx -S 'out-%n.txt' - user216043
这样做按照我修改的方式来运作,虽然结果的命名方案不够理想。 - Bruni
@Bruni,如果输出名称是'out-%n.txt''out-%n.txt',它应该包含工作表的编号或名称。 - user216043
你是对的。我现在修改过了,它可以工作了。 - Bruni