我正在寻找一种在Linux上将XLSX文件转换为CSV文件的方法。
我不想使用php/perl或类似的东西,因为我正在处理数百万行,所以我需要一些快速的东西。我在Ubuntu repos上找到一个名为xls2csv的程序,但它只能转换XLS(Office2003)文件(我目前正在使用),但我需要对更新的Excel文件的支持。
有什么想法吗?
- 认为用脚本语言实现的任何东西在本质上都会变慢…有点误入歧途,特别是那些语言中有趣的库往往有用C编写的后端。
- Excel过去限制为65536行。现在是1048576(support.microsoft.com/kb/120596)。这将是很难适应"切断数百万线"在其中。只是说…
- @帕维尔可能在几个文件上。
- …就我个人而言,我会使用针对Python的XLSV库来实现这一点,但是由于基于脚本的方法被描述为不可能的……耸肩。(如果不包括编程工具,这是一个编程问题吗?)
- @CharlesDuffy我目前正在使用一个PHP库来完成这项工作,需要1秒钟的时间,需要10分钟的时间。字面意思。
- @用户1390150我相信——php是一堆…好。但是,仅仅因为有一个非常糟糕的PHP库,并不是注销所有解释语言的一个有效理由。
- (错误,该库名称应该是xslw,而不是xlsv)
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
- 实际上是转换电子表格最简单的方法。结合一个bash脚本,它将允许您批量处理多个文件。for f in *.csv; do ssconvert"$f""${f%.csv}.xlsx"; donelibreoffice方法可能可以处理其他格式,但我无法使其工作(它每次只打开一个空白文件,即使使用--headless参数也是如此)。
- 确实很好。谢谢
- @Sebleblanc不是很轻松。考虑到依赖项的数量(如果您在无头服务器上执行此操作),安装是一个难题。到目前为止,gcc,intltool,zlib devel,gtk…GTK需要glib、atk、pango、cairo、cairo对象、gdk-pixbuf-2.0…
- 现在似乎有办法防止ssconvert在转换为csv之前重新计算工作表…参见stackoverflow.com/questions/22344918/…
- 我设法把它安装在一个带apt-get install gnumeric --no-install-recommends的无头debian服务器上。唯一的缺点是它会发出大量警告gconf warning**:客户端在运行时未能连接到D-Bus守护进程。一个简单的ssconvert oldfile.xlsx newfile.csv > /dev/null 2>&1就可以做到这一点。
- 我找不到cygwin的ssconvert:screencast.com/t/4ggsojnla screencast.com/t/seib1ghkoi
- 我还尝试在Windows上安装gnumeric,但仍然没有screencast.com/t/4qcjzvxhoh…我想是个笑话吧?
- @是的-不知道你的屏幕截图想说明什么(它只显示你的cygwin路径中没有二进制文件),但我刚尝试过本机gnumeric-1.12.17-20140610.exe(没有cygwin),它工作得很完美。
- 要写入csv,您可能需要-S标志写入多个工作表。每个文件都有自己的文件。
- 我在Ubuntu 12.04中尝试过使用这个,但得到以下错误:ssconvert test.xlsb newfile.csv using exporter gnumeric_stf:stf_csv**(ssconvert:4973):warning**:format gnumeric_excel:xlsx的探针将输入参考计数从1更改为3。**(ssconvert:4973):警告**:格式gnumeric_excel:xlsx的探针将输入参考计数从3更改为5。不支持的文件格式。有什么想法吗?
- 也支持XLS
- 如何指定分隔符?$ ssconvert -O 'separator=;' file.csv file.xlsx或$ ssconvert -O 'separator=; format=raw' file.csv file.xlsx不工作。
- @hh分隔符选项仅适用于txt导出类型。您可以使用它打印到标准输出:ssconvert -O"separator=;" -T Gnumeric_stf:stf_assistant file.xlsx fd://1。
您可以使用libreoffice执行此操作:
1
| libreoffice --headless --convert-to csv $filename --outdir $outdir |
因为我不清楚的原因,你可能需要用sudo来运行这个。通过向sudoers文件中添加以下行,可以使libreoffice与sudo一起工作,而无需密码:
1
| users ALL=(ALL) NOPASSWD: libreoffice |
- 我怎样才能告诉Libreoffice我要第二张纸?
- 允许sudo在没有密码的情况下为每个人创建libreoffice正在打开一个蠕虫罐头。请注意后果,包括在多用户平台上获取根权限的可能性
- 这对我有效(不需要sudo)。我的版本:libreoffice-calc-3.6.7.2-4.fc18.x86_64
- 我刚试过,首先我需要苏多。然后,我是因为我当前的用户有一个libreoffice实例在运行(播放一个ods)。关闭后,不需要sudo。
- /Applications/LibreOffice.app/Contents/MacOS/soffice --headless --convert-to csv $filename为我开发了OS X。
- 这个方法很好,但是afaik会破坏非ASCII字符
- 确保所有libreoffice实例都已关闭,否则将无法工作。
- libreoffice --convert-to可以很好地在一种电子表格格式和另一种电子表格格式之间进行转换(我使用它来读取.xlsb文件,首先将它们转换为.xls)。但对于写入csv,仅限于输出第一页。
- 要转换为UTF-8,保留非ASCII字符,请使用--convert-to"csv:Text - txt - csv (StarCalc):44,34,76,1,1/1"。有关详细信息,请参见打开Office wiki。
- 如何阅读多张纸?也就是说,我只想读第7页,创建一个.csv。
- @如果你需要的话,你可以使用另一种工具,比如xlsx2csv。xlsx2csv工具有-s或--sheet选项,可用于选择工作表(0代表"所有工作表",默认值为1)。xlsx2csv采用了流行的Linux发行版,如debian、ubuntu和arch linux。
- @dmeu:使用这个脚本。像魅力一样工作:./libreconverter.py Spreadsheet.xls:"Sheet Name" output.csv。
- 在使用这个答案之后,我在csv中遇到了编码问题,ssconvert的答案解决了这个问题。
- libreoffice没有理由需要根shell,它可以很容易地进行调试,但使用用户帐户失败。
如果您已经有了桌面环境,那么我相信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中的几种替代方案。
- 很好,但我只能以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也有同样的错误。
- ….对我来说工作得很好,允许使用-s选项将每个工作表提取到单个文件中——在libreoffice无法处理工作表大小的情况下,XLSX2csv没有问题。
- 谢谢!在Ubuntu非常方便。
- 很好,干得很好
- 但不支持XLS
- 在Debian和Ubuntu中有xlsx2csv包,因此您不需要通过easy_install手动安装它,但可以使用包管理器。
在bash中,我使用libreoffice命令转换当前目录中的所有XLSX文件:
1
| for i in *.xlsx; do libreoffice --headless --convert-to csv"$i" ; done |
它处理文件名中的空格。
几年后又试了一次,但没用。这个线程提供了一些提示,但最快的解决方案是作为根运行(或运行sudo libreoffice)。不优雅,但很快。
在Windows中使用命令scalc.exe
- 请确保在尝试此操作之前关闭所有OpenOffice窗口,否则它将自动失败。
- 谢谢!我试了很多次,仍然没有生成csv。
- 很有魅力,谢谢:)
- 此外,在Windows上,命令是scalc.exe,而不是libreoffice。今天为我工作在当前稳定的低版本。
使用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 {} \; |
你完了!
- 非常有用,谢谢你,帕斯卡·路易斯·佩雷斯先生
- 上面的命令'ssconvert'只转换65536行,但我有多行缺少行,你能帮我吗?
如果你可以运行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窗口,它会出现一秒钟,然后退出。对我来说没关系,这是唯一能快速完成任务的工具。