我的目录中有大约 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 循环。