338

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

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

有任何想法吗?

4

11 回答 11

291

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
于 2012-05-14T09:34:41.440 回答
167

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

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

由于我不清楚的原因,您可能需要使用 sudo 运行它。您可以通过将此行添加到您的 sudoers 文件来使 LibreOffice 与 sudo 一起工作而无需密码:

users ALL=(ALL) NOPASSWD: libreoffice
于 2013-02-13T14:54:56.460 回答
161

如果您已经拥有桌面环境,那么我确信 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 构建的几个替代方案。

于 2014-02-14T18:34:32.243 回答
46

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

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

在执行之前关闭所有 Libre Office 打开的实例,否则它将静默失败。

该命令处理文件名中的空格。

几年后又试了一次,还是不行。该线程提供了一些提示,但最快的解决方案是以 root 身份运行(或运行 a sudo libreoffice)。不优雅,但很快。

在 Windows 中使用命令 scalc.exe

于 2014-02-08T20:54:22.347 回答
45

使用csvkit

in2csv data.xlsx > data.csv

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

于 2014-11-06T09:10:29.557 回答
12

为方便起见,另一种选择是通过小型 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
于 2014-09-02T15:03:26.317 回答
8

如果.xlsx文件有很多工作表,-s可以使用标志来获取您想要的工作表。例如:

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

second_sheet.csv将包含第二张纸的数据my_file.xlsx

于 2014-11-12T21:43:58.410 回答
7

使用名为 ssconvert 的命令行实用程序附带的Gnumeric电子表格应用程序确实非常简单:

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

你就完成了!

于 2016-06-11T15:45:08.703 回答
4

如果您可以运行 Java 命令行,那么您可以使用 Apache POI HSSF 的Excel Extractor来完成。它有一个main方法说是命令行提取器。这似乎只是把所有东西都倾倒了。他们指出这个转换为 CSV 的例子。您必须先编译它,然后才能运行它,但它也有一个main方法,因此您本身不必进行太多编码即可使其工作。

另一个可能可行但需要在另一端进行一些工作的选项是让您的 Excel 文件以 Excel XML 数据或XML 电子表格的形式提供给您,这些数据是 MS 所称的任何格式。它将为您打开一个全新的机会世界,以您想要的方式对其进行切片和切块。

于 2012-05-11T19:42:22.103 回答
3

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

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

用法是:

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

唯一的缺点(就我而言)是这--headless似乎不起作用。我有一个显示一秒钟然后退出的 LO 窗口。
这对我来说没问题,它是唯一能够快速完成工作的工具。

于 2016-12-16T10:22:57.670 回答
1

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

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

参数--headless表示我们不需要GUI

于 2021-12-30T04:17:30.583 回答