我正在寻找一种在 Linux 上将 xlsx 文件转换为 csv 文件的方法。
我不想使用 PHP/Perl 或类似的东西,因为我正在处理数百万行,所以我需要一些快速的东西。我在 Ubuntu 存储库上找到了一个名为 xls2csv 的程序,但它只会转换 xls (Office 2003) 文件(我目前正在使用),但我需要对较新的 Excel 文件的支持。
有任何想法吗?
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 运行它。您可以通过将此行添加到您的 sudoers 文件来使 LibreOffice 与 sudo 一起工作而无需密码:
users ALL=(ALL) NOPASSWD: libreoffice
如果您已经拥有桌面环境,那么我确信 Gnumeric / LibreOffice 会运行良好,但在无头服务器(例如 Amazon Web Services)上,它们需要您还需要安装的数十个依赖项。
我找到了这个 Python 替代品:
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 中,我使用这个 libreoffice 命令来转换当前目录中的所有 xlsx 文件:
for i in *.xlsx; do libreoffice --headless --convert-to csv "$i" ; done
在执行之前关闭所有 Libre Office 打开的实例,否则它将静默失败。
该命令处理文件名中的空格。
几年后又试了一次,还是不行。该线程提供了一些提示,但最快的解决方案是以 root 身份运行(或运行 a sudo libreoffice)。不优雅,但很快。
在 Windows 中使用命令 scalc.exe
为方便起见,另一种选择是通过小型 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
如果.xlsx文件有很多工作表,-s可以使用标志来获取您想要的工作表。例如:
xlsx2csv "my_file.xlsx" -s 2 second_sheet.csv
second_sheet.csv将包含第二张纸的数据my_file.xlsx。
使用名为 ssconvert 的命令行实用程序附带的Gnumeric电子表格应用程序确实非常简单:
find . -name '*.xlsx' -exec ssconvert -T Gnumeric_stf:stf_csv {} \;
你就完成了!
如果您可以运行 Java 命令行,那么您可以使用 Apache POI HSSF 的Excel Extractor来完成。它有一个main方法说是命令行提取器。这似乎只是把所有东西都倾倒了。他们指出这个转换为 CSV 的例子。您必须先编译它,然后才能运行它,但它也有一个main方法,因此您本身不必进行太多编码即可使其工作。
另一个可能可行但需要在另一端进行一些工作的选项是让您的 Excel 文件以 Excel XML 数据或XML 电子表格的形式提供给您,这些数据是 MS 所称的任何格式。它将为您打开一个全新的机会世界,以您想要的方式对其进行切片和切块。
正如其他人所说,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
参数--headless表示我们不需要GUI。