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


266

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

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

有任何想法吗?


10
思考与脚本语言会自然将是缓慢实现的是什么,似乎......有点误导,特别是因为这些语言的有趣的库往往有C语言编写的后端
查尔斯·达菲

2
Excel过去仅限于65536行。现在是1,048,576(support.microsoft.com/kb/120596)。要容纳“数百万条线”将非常困难。只是说...
Pavel Veller 2012年

1
@Pavel可能有多个文件。
查尔斯·达菲

2
...个人而言,我会使用Python的xlsv库来执行此操作,但是由于基于脚本的方法被描述为不可能... 耸耸肩。(如果答案中未包含编程工具,这是一个编程问题吗?)
Charles Duffy

1
@CharlesDuffy我当前正在使用PHP库来执行此操作,而xls2csv需要1秒钟来完成,php需要10分钟来完成。从字面上看。
user1390150 2012年

Answers:


239

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

19
确实是转换电子表格的最轻松的方法。与bash脚本结合使用,它将使您可以批量处理多个文件。for f in *.csv; do ssconvert "$f" "${f%.csv}.xlsx"; doneLibreOffice方法可能可以处理其他格式,但是我无法使其工作(它每次都会打开一个空白文件,即使带有--headless参数也是如此)。
sleblanc

6
@sebleblanc不太麻烦。考虑到依赖项的数量,安装很麻烦(如果您在无头服务器上执行此操作)。到目前为止,gcc,intltool,zlib-devel,GTK ... GTK需要glib,atk,pango,cairo,cairo-object,gdk-pixbuf-2.0 ...
andrewtweber 2014年

11
我设法通过安装在无头Debian服务器上apt-get install gnumeric --no-install-recommends。唯一的缺点是,它会发出大量警告GConf-WARNING **:客户端在运行时无法连接到D-BUS守护程序。一个简单ssconvert oldfile.xlsx newfile.csv > /dev/null 2>&1的技巧就可以了。
本杰明·德利彻

7
要写入csv,您可能希望-S标志写入多张纸。每个都转到其自己的文件。
Ed Avis 2015年

5
@hhh分隔符选项仅适用于txt导出类型。您可以使用它来打印到标准输出:ssconvert -O "separator=;" -T Gnumeric_stf:stf_assistant file.xlsx fd://1
exic

135

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

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

由于我不清楚的原因,您可能需要使用sudo运行它。通过将以下行添加到您的sudoers文件中,可以使LibreOffice在sudo上工作而无需输入密码:

users ALL=(ALL) NOPASSWD: libreoffice

35
我如何告诉libreoffice我想要第二张纸?
dmeu

30
允许sudo在没有密码的情况下为每个人提供libreoffice可以打开蠕虫罐。请注意后果,包括在多用户平台上获得root权限的可能性
Interarticle

5
这对我有用(不需要sudo)。我的版本:libreoffice-calc-3.6.7.2-4.fc18.x86_64
Brad Hein

5
/Applications/LibreOffice.app/Contents/MacOS/soffice --headless --convert-to csv $filename为我在OS X上工作。
Nobu 2014年

12
要转换为utf-8(保留非ASCII字符),请改用--convert-to "csv:Text - txt - csv (StarCalc):44,34,76,1,1/1"。有关详细信息,请参见开放式办公室Wiki
Aryeh Leib Taurog

132

如果您已经有一个桌面环境,那么我确定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内置的几种替代方案。


效果很好,但我只能以sudo(IOError: [Errno 13] Permission denied: '/usr/local/lib/python2.7/dist-packages/prettytable-0.7.2-py2.7.egg/EGG-INFO/top_level.txt')的身份运行。现在我考虑了一下,我也遇到了同样的错误csvkit
user2105469 2014年

2
....对我工作的伟大,并允许每一张使用-s选项单个文件的提取-其中的LibreOffice无法处理纸张的大小,xlsx2csv没有问题
索伦

谢谢!在ubuntu中非常方便。
zhuguowei 2015年

5
在Debian和Ubuntu中有xlsx2csv软件包,因此您不需要手动安装它,easy_install但可以使用软件包管理器。
josch

在MacOS上,您需要sudo easy_install xlsx2csv
Frank Hintsch

32

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

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

它照顾文件名中的空格。

几年后再次尝试,但没有成功。该线程提供了一些技巧,但最快的解决方案是以root身份运行(或运行sudo libreoffice)。不优雅,但快速。

在Windows中使用命令scalc.exe


13
尝试执行此操作之前,请确保关闭所有openoffice窗口,否则它将自动失败。
tacone

另外,在Windows上,命令scalc.exe不是libreoffice。今天为我工作,当前稳定的LO版本。
AronVanAmmers


8

为了方便起见,另一种选择是通过一个小的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

8

如果.xlsx文件有很多图纸,-s可以使用flag获取所需的图纸。例如:

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

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



4

如果可以运行Java命令行,则可以使用Apache POI HSSF的Excel Extractor进行。它有一个main称为命令行提取器的方法。这似乎只是将所有内容转储出去。他们指出了转换为CSV的此示例。您必须先编译它,然后才能运行它,但它也有一个main方法,因此您不必自己进行大量编码即可使其工作。

另一个可行的选择,但另一方面,它还需要进行一些工作,这是使您的Excel文件以Excel XML Data或XML Spreadsheet的形式出现在您眼前,而无论MS如何称呼这种格式。它将为您打开一个全新的机会世界,让您以自己想要的方式进行切片和切块。


1
您知道这是否还支持.xlsx吗?
dimroc 2014年

1

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

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

用法是:

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

唯一的缺点(对我而言)--headless似乎不起作用。我有一个LO窗口,显示一秒钟然后退出。
没关系,这是唯一可以快速完成工作的工具。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.