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

Convert xlsx to csv in Linux with command line

提问人:user1390150 提问时间:5/12/2012 最后编辑:Matthias Braunuser1390150 更新时间:2/27/2023 访问量:354970

问:

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

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

有什么想法吗?

Excel CSV 转换器 XLSX

评论

11赞 Charles Duffy 5/12/2012
认为使用脚本语言实现的任何内容本质上都会很慢,这似乎......有点误导,特别是因为这些语言中有趣的库往往有用 C 语言编写的后端。
2赞 Pavel Veller 5/12/2012
Excel 过去限制为 65536 行。现在是 1,048,576 (support.microsoft.com/kb/120596)。要把“切断数百万条线”放进去是很困难的。只是说...
1赞 Charles Duffy 5/12/2012
@Pavel可能涉及多个文件。
2赞 Charles Duffy 5/12/2012
...就个人而言,我会使用 Python 的 xlsv 库来做到这一点,但由于基于脚本的方法被描述为不可能......耸耸肩。(如果编程工具被排除在答案之外,那怎么是一个编程问题?
1赞 user1390150 5/12/2012
@CharlesDuffy 我目前正在使用 PHP 库来执行此操作,并且需要 xls2csv 1 秒才能完成的事情,需要 php 10 分钟才能完成。 从字面上看。

答:

4赞 Pavel Veller 5/12/2012 #1

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

另一个可能飞起来但需要在另一端做一些工作的选择是让您的 Excel 文件以 Excel XML 数据或 XML 电子表格的形式出现,这些天 MS 称之为该格式。它将为您打开一个全新的机会世界,让您以自己想要的方式进行切片和切块。

评论

1赞 dimroc 2/5/2014
你知道这是否也支持.xlsx吗?
336赞 jmcnamara 5/14/2012 #2

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

评论

25赞 sleblanc 8/16/2013
真的是转换电子表格最轻松的方法。结合 bash 脚本,它可以让您批处理多个文件。 LibreOffice 方法可能可以处理其他格式,但我无法让它工作(即使有参数,它每次都会打开一个空白文件)。for f in *.csv; do ssconvert "$f" "${f%.csv}.xlsx"; done--headless
9赞 andrewtweber 2/15/2014
@sebleblanc 不是很轻松。考虑到依赖项的数量,安装是一件很痛苦的事情(如果你在无头服务器上执行此操作)。到目前为止,gcc、intltool、zlib-devel、GTK......GTK 需要 glib、atk、pango、cairo、cairo-object、gdk-pixbuf-2.0...
15赞 Benjamin Delichere 3/18/2014
我设法将它安装在带有 .唯一的缺点是它会触发大量警告 GConf-WARNING **: Client failed to connect to the D-BUS daemon when running.一个简单的就可以了。apt-get install gnumeric --no-install-recommendsssconvert oldfile.xlsx newfile.csv > /dev/null 2>&1
12赞 Ed Avis 2/25/2015
要写入 csv,您可能希望该标志写入多个工作表。每个都转到自己的文件。-S
7赞 exic 9/5/2017
@hhh 分隔符选项仅适用于 txt 导出类型。您可以使用它打印到 stdout: 。ssconvert -O "separator=;" -T Gnumeric_stf:stf_assistant file.xlsx fd://1
182赞 spiffytech 2/13/2013 #3

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

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

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

users ALL=(ALL) NOPASSWD: libreoffice

评论

38赞 dmeu 5/8/2013
我该如何告诉 libreoffice 我想要第二张纸?
35赞 Interarticle 8/1/2013
允许 sudo 为没有密码的每个人提供 libreoffice 是打开一罐蠕虫。请注意后果,包括在多用户平台上获取 root 权限的可能性
7赞 Brad Hein 1/9/2014
这对我有用(不需要 sudo)。我的版本:libreoffice-calc-3.6.7.2-4.fc18.x86_64
8赞 Nobu 6/11/2014
/Applications/LibreOffice.app/Contents/MacOS/soffice --headless --convert-to csv $filename在OS X上为我工作。
16赞 Aryeh Leib Taurog 7/15/2015
要转换为 utf-8,保留非 ASCII 字符,请改用 。有关详细信息,请参阅 open office wiki--convert-to "csv:Text - txt - csv (StarCalc):44,34,76,1,1/1"
50赞 neves 2/9/2014 #4

在 Bash 中,我使用这个 LibreOffice 命令(可执行文件)来转换当前目录中的所有 .xlsx 文件:libreoffice

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

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

该命令负责文件名中的空格。

几年后我又试了一次,但没有用。这个问题提供了一些提示,但最快的解决方案是以 root 身份运行(或运行 )。它不优雅,但很快。sudo libreoffice

在 Windows 中使用命令 scalc.exe

评论

13赞 tacone 8/4/2014
在尝试此操作之前,请确保关闭所有 openoffice 窗口,否则它将静默失败。
0赞 AronVanAmmers 4/25/2017
此外,在 Windows 上,该命令是 而不是 .今天在当前稳定的 LO 版本上为我工作。scalc.exelibreoffice
1赞 oma 6/2/2021
FWIW,这现在在 Ubuntu 上对我有用
0赞 e-info128 7/5/2021
注意:仅导出第一页。
180赞 andrewtweber 2/15/2014 #5

如果您已经有一个桌面环境,那么我相信 GnumericLibreOffice 会运行良好,但在无头服务器(例如任何基于云的环境)上,它们需要您还需要安装数十个依赖项。

我找到了这个 Python 替代品:xlsx2csv

easy_install xlsx2csv
xlsx2csv file.xlsx > newfile.csv

安装花了两秒钟,就像一个魅力。

如果您有多个工作表,则可以一次导出所有工作表,也可以一次导出一个工作表:

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 构建的几个替代方案。

评论

0赞 user2105469 5/29/2014
效果很好,但我只能以 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
2赞 Soren 5/30/2014
....对我来说效果很好,并允许使用 -s 选项将每个工作表提取到单个文件 - libreoffice 无法处理工作表的大小,xlsx2csv 没有问题
12赞 josch 5/4/2016
在 Debian 和 Ubuntu 中,有软件包,因此您不需要手动安装它,而是可以使用软件包管理器。xlsx2csveasy_install
1赞 Frank Hintsch 1/8/2020
在 MacOS 上,您将需要一个sudo easy_install xlsx2csv
2赞 Stefan Schmidt 4/13/2023
我不知道它有多强大或功能完整,但它似乎得到了积极的维护,并与通过 Homebrew 在 macOS 上安装 Gnumeric 相比,它涉及 30 多个依赖项,而 LibreOffice 是一个几百 MB 的下载,依赖项为零(!),只有 50 KB,非常适合我的用例(将 PaddleOCR 的输出转换为 csv)。随存储库一起安装或下载最新版本,然后运行 .xlsx2csvxlsx2csvpip install xlsx2csvxlsx2csv.py
14赞 Holger Brandl 9/2/2014 #6

为了方便起见,另一种选择是通过一个小的 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
61赞 Holger Brandl 11/6/2014 #7

使用 csvkit

in2csv data.xlsx > data.csv

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

评论

2赞 greenie-beans 10/13/2022
这应该是最重要的答案
2赞 WestCoastProjects 11/28/2022
brew install csvkit.并完成了。
9赞 Akavall 11/13/2014 #8

如果文件有许多工作表,则可以使用该标志来获取所需的工作表。例如:.xlsx-s

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

second_sheet.csv将包含 中第二张工作表的数据。my_file.xlsx

7赞 Pascal-Louis Perez 6/11/2016 #9

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

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

大功告成!

评论

0赞 Karthickkumar Nagaraj 10/31/2016
非常有用,谢谢Pascal-Louis Perez先生
1赞 Karthickkumar Nagaraj 11/7/2016
上面的命令“ssconvert”只转换了 65536 行,但我有不止一行缺少行,你能帮我吗?
3赞 Benoit Duffez 12/16/2016 #10

正如其他人所说,可执行文件可以将Excel文件(.xls)文件转换为CSV。对我来说,问题在于纸张的选择。libreoffice

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

用法是:

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

唯一的缺点(在我这边)是这似乎不起作用。我有一个 LibreOffice 窗口,它显示了一秒钟,然后退出。--headless

这对我来说没关系;它是唯一可以快速完成工作的工具。

4赞 Udesh 12/30/2021 #11

您可以使用可执行文件将 .xlsx 文件转换为 csv:libreoffice

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

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

评论

0赞 moopet 3/25/2022
这个答案早在 8 年前就已经给出了。
1赞 kaiya 4/1/2022 #12

您可以使用脚本 getsheets.py。首先添加依赖:

pip3 install pandas xlrd openpyxl

然后调用脚本:python3 getsheets.py <file.xlsx>