关于excel:使用命令行在Linux中将xlsx转换为csv

Convert xlsx to csv in Linux with command line

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

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

有什么想法吗?


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

1
2
3
4
5
6
7
8
9
$ 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上安装:

1
apt-get install gnumeric

要在Mac上安装:

2


您可以使用libreoffice执行此操作:

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

因为我不清楚的原因,你可能需要用sudo来运行这个。通过向sudoers文件中添加以下行,可以使libreoffice与sudo一起工作,而无需密码:

1
users ALL=(ALL) NOPASSWD: libreoffice


如果您已经有了桌面环境,那么我相信gnumeric/libreoffice会很好地工作,但是在无头服务器(如Amazon Web Services)上,它们需要几十个您还需要安装的依赖项。

我发现了这条Python替代品:

https://github.com/dilshod/xlsx2csv

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

花了2秒钟安装,工作起来很有魅力。

如果有多个工作表,则可以一次全部导出,也可以一次导出一个工作表:

1
2
3
$ 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中,我使用libreoffice命令转换当前目录中的所有XLSX文件:

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

它处理文件名中的空格。

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

在Windows中使用命令scalc.exe


使用CSVITKIT

1
in2csv data.xlsx > data.csv

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


如果.xlsx文件有许多工作表,则可以使用-s标志获取所需的工作表。例如:

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

second_sheet.csv将包含my_file.xlsx中第2页的数据。


另一种选择是通过一个小型的bash包装器使用r,以方便:

1
2
3
4
5
6
7
8
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

使用gnumeric电子表格应用程序,命令行实用程序ssconvert非常简单:

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

你完了!


如果你可以运行Java命令行,那么你可以用Apache POI HSSF的Excel提取器来完成它。它有一个main方法,称为命令行提取器。这个好像把所有东西都扔掉了。他们指出了这个转换为csv的例子。在运行它之前,您必须编译它,但它也有一个main方法,因此您不必为使它工作而本身进行太多的编码。

另一个可能会飞起来,但需要在另一端做一些工作的选择是让您的Excel文件作为Excel XML数据或XML电子表格,这些数据或XML电子表格是微软最近调用的任何格式。它将为你打开一个全新的机会世界,让你以你想要的方式去切分和掷骰子。


如其他人所说,libreoffice可以将XLS文件转换为CSV。我的问题是纸张的选择。

这个libreoffice python脚本可以很好地将单个工作表转换为csv。

用途是:

1
./libreconverter.py File.xls:"Sheet Name" output.csv

唯一的缺点(在我这边)是,--headless似乎不起作用。我有一个LO窗口,它会出现一秒钟,然后退出。对我来说没关系,这是唯一能快速完成任务的工具。