在Linux中用命令行将xlsx转换为csv

我正在寻找一种方法将xlsx文件转换为Linux上的csv文件。

我不想使用PHP/Perl或类似的东西,因为我正在处理数百万行,所以我需要一些快速的东西。我在Ubuntu repos上找到了一个名为xls2csv的程序,但它只会转换xls (Office 2003)文件(我目前正在使用),但我需要对更新的Excel文件的支持。

什么好主意吗?

324424 次浏览

如果你可以运行Java命令行,那么你可以用Apache POI HSSF的Excel萃取器来做。它有main方法,表示为命令行提取器。这个好像把所有东西都倒出来了。它们指向这个例子转换为CSV。你必须在运行它之前编译它,但它也有main方法,所以你不应该做很多编码本身使它工作。

另一种可能可行但需要在另一端做一些工作的选择是将Excel文件作为Excel XML数据或XML的电子表格格式提供给你,无论MS现在如何称呼这种格式。它将为你打开一个充满机会的全新世界,让你以自己想要的方式来切割它。

Gnumeric电子表格应用程序带有一个名为ssconvert的命令行实用程序,可以在各种电子表格格式之间进行转换:

$ ssconvert Book1.xlsx newfile.csv
Using exporter Gnumeric_stf:stf_csv


$ cat newfile.csv
Foo,Bar,Baz
1,2,3
123.6,7.89,
2012/05/14,,
The,last,Line

在Ubuntu上安装:

apt-get install gnumeric

在Mac上安装:

brew install gnumeric

你可以使用LibreOffice:

libreoffice --headless --convert-to csv $filename --outdir $outdir

出于我不清楚的原因,您可能需要使用sudo运行此程序。你可以让LibreOffice使用sudo而不需要密码,添加这行到你的sudoers文件:

users ALL=(ALL) NOPASSWD: libreoffice

在bash中,我使用这个libreoffice命令来转换当前目录下的所有xlsx文件:

for i  in *.xlsx; do  libreoffice --headless --convert-to csv "$i" ; done

在执行之前关闭所有Libre Office打开实例,否则它将无声地失败。

该命令负责文件名中的空格。

几年后我又试了一次,但没有成功。这个线程提供了一些提示,但最快的解决方案是作为根用户运行(或运行sudo libreoffice)。不优雅,但很快。

在Windows中使用命令scalc.exe

如果你已经有了一个桌面环境,那么我相信Gnumeric / LibreOffice会工作得很好,但是在一个无头服务器(比如Amazon Web Services)上,它们需要几十个依赖项,你也需要安装这些依赖项。

我找到了这个Python替代品:

https://github.com/dilshod/xlsx2csv < a href = " https://github.com/dilshod/xlsx2csv " > < / >

$ easy_install xlsx2csv
$ xlsx2csv file.xlsx > newfile.csv

安装只需2秒钟,工作起来很有魅力。

如果你有多个表,你可以一次全部导出,或者一次导出一个:

$ xlsx2csv file.xlsx --all > all.csv
$ xlsx2csv file.xlsx --all -p '' > all-no-delimiter.csv
$ xlsx2csv file.xlsx -s 1 > sheet1.csv

他还链接了几个用Bash、Python、Ruby和Java构建的替代方案。

另一种选择是通过一个小的bash包装器来使用R:

xlsx2txt(){
echo '
require(xlsx)
write.table(read.xlsx2(commandArgs(TRUE)[1], 1), stdout(), quote=F, row.names=FALSE, col.names=T, sep="\t")
' | Rscript --vanilla - $1 2>/dev/null
}


xlsx2txt file.xlsx > file.txt

使用csvkit

in2csv data.xlsx > data.csv

有关详细信息,请检查他们的优秀文档

如果.xlsx文件有很多页,-s标志可以用来获取你想要的页。例如:

xlsx2csv "my_file.xlsx" -s 2 second_sheet.csv

second_sheet.csv将包含my_file.xlsx中第二表的数据。

使用Gnumeric电子表格应用程序,其中一个命令行实用程序称为ssconvert,确实超级简单:

find . -name '*.xlsx' -exec ssconvert -T Gnumeric_stf:stf_csv {} \;

这样就完成了!

正如其他人所说,libreoffice可以将xls文件转换为csv文件。对我来说,问题在于纸张的选择。

libreoffice Python脚本在将单个表格转换为CSV方面做得很好。

用法是:

./libreconverter.py File.xls:"Sheet Name" output.csv
唯一的缺点(在我这边)是--headless似乎不工作。我有一个LO窗口,它显示了一秒钟,然后退出 这对我来说没问题,这是唯一能快速完成工作的工具

你可以使用libreoffice将你的.xlsx文件转换为csv

$ libreoffice --headless --convert-to csv ABC.xlsx

参数——无头表示不需要GUI

https://gist.github.com/scottming/99c09685360376d4cac2de7c891e8050

您可以使用这个脚本。先添加依赖项:

pip3 install pandas xlrd openpyxl

然后调用脚本:python3 getsheets.py <file.xlsx>