【问题标题】:Convert xlsx to csv in Linux with command line在 Linux 中使用命令行将 xlsx 转换为 csv
【发布时间】:2012-05-20 09:42:24
【问题描述】:

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

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

有什么想法吗?

【问题讨论】:

  • Excel 曾经被限制为 65536 行。现在是 1,048,576 (support.microsoft.com/kb/120596)。将“切断数百万行”放入其中将很困难。只是说...
  • @Pavel 可能跨越多个文件。
  • ...就个人而言,我会使用 Python 的 xlsv 库来执行此操作,但由于基于脚本的方法被描述为不可能... 耸耸肩。 (如果答案中排除了编程工具,这怎么算编程问题?)
  • @CharlesDuffy 我目前正在使用 PHP 库来执行此操作,而 xls2csv 需要 1 秒才能完成,而 php 需要 10 分钟才能完成。从字面上看。

标签: linux excel csv converter xlsx


【解决方案1】:

如果您可以运行 Java 命令行,那么您可以使用 Apache POI HSSF 的 Excel Extractor 来完成。它有a main method that says to be the command line extractor。这似乎只是把所有东西都倾倒了。他们指出this example that converts to CSV。您必须先编译它,然后才能运行它,但它也有一个 main 方法,因此您不必进行大量编码即可使其正常工作。

另一个可能可行但需要在另一端进行一些工作的选项是让您的 Excel 文件以 Excel XML 数据或XML Spreadsheet 的形式提供给您,这些日子 MS 称之为该格式。它将为您打开一个全新的机会世界,让您按照自己的方式进行切片和切块。

【讨论】:

  • 不知道这是否也支持.xlsx?
【解决方案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

【讨论】:

  • 确实是最轻松的电子表格转换方法。结合 bash 脚本,它可以让您批处理多个文件。 for f in *.csv; do ssconvert "$f" "${f%.csv}.xlsx"; done LibreOffice 方法可能可以处理其他格式,但我无法让它工作(它每次都会简单地打开一个空白文件,即使使用 --headless 参数也是如此)。
  • @sebleblanc 不太容易。鉴于依赖项的数量(如果您在无头服务器上执行此操作),安装过程很痛苦。到目前为止 gcc, intltool, zlib-devel, GTK... GTK 需要 glib, atk, pango, cairo, cairo-object, gdk-pixbuf-2.0...
  • 我设法用apt-get install gnumeric --no-install-recommends将它安装在一个无头debian服务器上。唯一的缺点是它在运行时会触发大量警告GConf-WARNING **: Client failed to connect to the D-BUS daemon。一个简单的ssconvert oldfile.xlsx newfile.csv > /dev/null 2>&1 就可以了。
  • 要写入 csv,您可能希望 -S 标志写入多个工作表。每个文件都有自己的文件。
  • @hhh 分隔符选项仅适用于 txt 导出类型。您可以使用它打印到标准输出:ssconvert -O "separator=;" -T Gnumeric_stf:stf_assistant file.xlsx fd://1.
【解决方案3】:

您可以使用 LibreOffice 做到这一点:

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

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

users ALL=(ALL) NOPASSWD: libreoffice

【讨论】:

  • 我如何告诉 libreoffice 我想要第二张纸?
  • 允许 sudo 为每个没有密码的人使用 libreoffice 是在打开一罐蠕虫病毒。请注意后果,包括在多用户平台上获得 root 权限的可能性
  • 这对我有用(不需要 sudo)。我的版本:libreoffice-calc-3.6.7.2-4.fc18.x86_64
  • /Applications/LibreOffice.app/Contents/MacOS/soffice --headless --convert-to csv $filename 为我在 OS X 上工作。
  • 要转换为 utf-8,保留非 ascii 字符,请改用 --convert-to "csv:Text - txt - csv (StarCalc):44,34,76,1,1/1"。详情请见open office wiki
【解决方案4】:

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

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

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

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

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

在 Windows 中使用命令 scalc.exe

【讨论】:

  • 请确保在尝试此操作之前关闭所有 openoffice 窗口,否则它会静默失败。
  • 另外,在 Windows 上,命令是 scalc.exe 而不是 libreoffice。今天在当前稳定的 LO 版本上为我工作。
  • fwiw,这对我有用,在 ubuntu 上
  • 注意:只导出第一页。
【解决方案5】:

如果您已经拥有桌面环境,那么我确信 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 出现了同样的错误。
  • ....对我来说工作得很好,并允许使用 -s 选项将每个工作表提取到单个文件中——其中 libreoffice 无法处理工作表的大小,xlsx2csv 没有问题
  • 谢谢!在ubuntu中很方便。
  • 在Debian和Ubuntu中有xlsx2csv包,所以你不需要通过easy_install手动安装,但是可以使用你的包管理器。
  • 在 MacOS 上,您需要sudo easy_install xlsx2csv
【解决方案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

【讨论】:

    【解决方案7】:

    使用csvkit

    in2csv data.xlsx > data.csv
    

    详情请查看他们的优秀docs

    【讨论】:

      【解决方案8】:

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

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

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

      【讨论】:

        【解决方案9】:

        使用 Gnumeric 电子表格应用程序,其中一个名为 ssconvert 的命令行实用程序确实超级简单:

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

        你就完成了!

        【讨论】:

        • 非常有用,谢谢Pascal-Louis Perez先生
        • 以上命令 'ssconvert' 只转换 65536 行,但我有不止一个缺少行,你能帮帮我吗?
        【解决方案10】:

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

        libreoffice Python script 在将单张工作表转换为 CSV 方面做得很好。

        用法是:

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

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

        【讨论】:

          【解决方案11】:

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

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2013-03-22
            • 2018-05-04
            • 2010-12-23
            • 2015-01-20
            • 2021-07-25
            • 1970-01-01
            • 2017-01-11
            • 2012-01-21
            相关资源
            最近更新 更多