如何通过 Linux 命令行将 xlsx 文件中的特定工作表转换为 csv?

如何通过 Linux 命令行将 xlsx 文件中的特定工作表转换为 csv?

我的目录中有大约 16,000 个 .xlsx 文件。每个文件都遵循相同的结构。第一张表是空的,称为“表 1”。第二个是有趣的数据所在,它被称为“合作伙伴”。我需要将它们转换为文本/csv。

我尝试过在网上找到的各种解决方案,包括 ssconvert、xlsx2csv,这两种解决方案都会产生运行时错误。我还用 Libre Office Calc 创建的虚拟文件尝试过这些,只是为了检查我的文件是否已损坏(并且这些文件可以正常打开)。

我该怎么做呢?

答案1

LibreOffice 有一个内置功能可以转换为 csv:

localc --headless --convert-to csv input.xlsx

然而,这只会导出第一张纸。要获得第二张纸,您需要宏的帮助。打开 LibreOffice Calc 并转到Tools -> Macros -> Edit Macros.

这应该打开一个编辑器,用以下代码替换编辑器中的任何内容:

REM  *****  BASIC  *****

Sub Main
    sheets = ThisComponent.Sheets
    sheets.removeByName("Sheet1")
    ThisComponent.storeSelf(Array())
    ThisComponent.close(true)
End Sub

然后保存宏( ctrl+s)。这应该将其保存到Standard.Module1.Main(左下角所示)。

然后您可以再次关闭 LibreOffice 并运行以下命令:

localc --headless input.xlsx macro:///Standard.Module1.Main

这将删除第一个工作表(好吧,任何名为Sheet1- 如果需要更改代码的工作表)。

所以你的 bash 脚本最终可能看起来像这样:

mkdir csvs
for i in *.xlsx ; do
    localc --headless $i macro:///Standard.Module1.Main
    localc --convert-to csv $i
done
mv *.csv csvs/

答案2

您可以使用 csvkit (https://csvkit.readthedocs.io/en/latest/)并运行

in2csv -I --sheet "sheetName" ./input.xlsx >./output.csv

由你来编写一个 bash for 循环。

相关内容