我正在寻找一种在 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。