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

use*_*150 242 linux csv excel converter xlsx

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

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

有任何想法吗?

jmc*_*ara 219

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
Run Code Online (Sandbox Code Playgroud)

要在Ubuntu上安装:

apt-get install gnumeric
Run Code Online (Sandbox Code Playgroud)

要在Mac上安装:

brew install gnumeric
Run Code Online (Sandbox Code Playgroud)

  • 真的是最轻松的转换电子表格的方法.结合bash脚本,它将允许您批处理多个文件.`for f in*.csv; 做ssconvert"$ f""$ {f%.csv} .xlsx"; 完成`LibreOffice方法可能会处理其他格式,但我无法使其工作(它只会打开一个空白文件,即使使用`--headless`参数). (18认同)
  • 我设法使用`apt-get install gnumeric --no-install-recommended`将它安装在无头debian服务器上.唯一的缺点是它会发出大量警告**GConf-WARNING**:客户端在运行时无法连接到D-BUS守护程序**.一个简单的`ssconvert oldfile.xlsx newfile.csv>/dev/null 2>&1`就可以了. (11认同)
  • @sebleblanc不太麻烦.考虑到依赖项的数量(如果您在无头服务器上执行此操作),安装很痛苦.到目前为止gcc,intltool,zlib-devel,GTK ... GTK需要glib,atk,pango,cairo,cairo-object,gdk-pixbuf-2.0 ...... (6认同)
  • 要写入csv,您可能希望`-S`标志写入多个工作表.每个都转到自己的文件. (6认同)
  • @hhh分隔符选项仅适用于txt导出类型.您可以使用它来打印到stdout:`ssconvert -O"separator =;" -T Gnumeric_stf:stf_assistant file.xlsx fd:// 1`. (5认同)
  • @Yuck - 不确定你的屏幕截图想要说明什么(它只显示你的cygwin PATH中没有二进制文件)但我刚尝试了原生的`gnumeric-1.12.17-20140610.exe`(没有cygwin)它完美无瑕. (2认同)

spi*_*ech 128

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

libreoffice --headless --convert-to csv $filename --outdir $outdir
Run Code Online (Sandbox Code Playgroud)

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

users ALL=(ALL) NOPASSWD: libreoffice
Run Code Online (Sandbox Code Playgroud)

  • 我怎么告诉libreoffice我想要第二张? (31认同)
  • 允许没有密码的每个人都使用sudo来进行libreoffice正在打开一堆蠕虫.请注意后果,包括在多用户平台上获取root权限的可能性 (26认同)
  • 要转换为utf-8,保留非ascii字符,请使用`--convert-to"csv:Text - txt - csv(StarCalc):44,34,76,1,1/1"`.有关详细信息,请参阅[open office wiki](https://wiki.openoffice.org/wiki/Documentation/DevGuide/Spreadsheets/Filter_Options). (11认同)
  • 这对我有用(sudo不需要).我的版本:libreoffice-calc-3.6.7.2-4.fc18.x86_64 (5认同)
  • `/Applications/LibreOffice.app/Contents/MacOS/soffice --headless --convert-to csv $ filename`为我在OS X上工作. (5认同)
  • 我只是尝试过,首先我需要sudo。那是因为我当前的用户有一个libreoffice实例正在运行(播放ods)。关闭它后,不需要sudo。 (2认同)
  • 确保关闭所有libreoffice实例,否则它将无法工作. (2认同)
  • @dmeu你不知道。如果需要,可以使用其他工具,例如`xlsx2csv`。xlsx2csv工具具有-s或--sheet选项,可用于选择工作表(0代表“所有工作表”,默认为1)。xlsx2csv被打包在流行的Linux发行版中,例如Debian,Ubuntu和Arch Linux。 (2认同)

and*_*ber 116

如果您已经拥有桌面环境,那么我确信Gnumeric/LibreOffice可以正常运行,但是在无头服务器(例如Amazon Web Services)上,它们需要您还需要安装的许多依赖项.

我找到了这个Python替代品:

https://github.com/dilshod/xlsx2csv

$ easy_install xlsx2csv
$ xlsx2csv file.xlsx > newfile.csv
Run Code Online (Sandbox Code Playgroud)

花了2秒钟安装并像魅力一样工作.

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

$ xlsx2csv file.xlsx --all > all.csv
$ xlsx2csv file.xlsx --all -p '' > all-no-delimiter.csv
$ xlsx2csv file.xlsx -s 1 > sheet1.csv
Run Code Online (Sandbox Code Playgroud)

他还链接到使用Bash,Python,Ruby和Java构建的几个替代方案.

  • 在Debian和Ubuntu中有`xlsx2csv`包,所以你不需要通过`easy_install`手动安装它,但可以使用你的包管理器. (5认同)
  • 我不知道“xlsx2csv”有多强大或功能完整,但它似乎得到了积极的维护,与通过 Homebrew 在 macOS 上安装 Gnumeric 相比,它涉及 30 多个依赖项,而 LibreOffice 的下载量为数百 MB,“xlsx2csv”的下载量为零(!) 依赖项仅 50 KB,非常适合我的用例(将 PaddleOCR 的输出转换为 csv)。使用“pip install xlsx2csv”安装它或从[存储库](https://github.com/dilshod/xlsx2csv)下载最新的[版本](https://github.com/dilshod/xlsx2csv/releases)并运行“xlsx2csv.py”。 (3认同)
  • ....对我来说很好,允许使用-s选项将每个工作表提取到单个文件 - 其中libreoffice无法处理工作表的大小,xlsx2csv没有问题 (2认同)

nev*_*ves 29

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

for i   in *.xlsx; do  libreoffice --headless --convert-to csv "$i" ; done
Run Code Online (Sandbox Code Playgroud)

它负责文件名中的空格.

几年后再次尝试,但它没有奏效.这个帖子给出了一些提示,但最快的解决方案是以root身份运行(或运行a sudo libreoffice).不优雅,但很快.

在Windows中使用命令scalc.exe

  • 确保在尝试之前关闭所有openoffice窗口,否则它将无声地失败. (13认同)

Hol*_*ndl 28

使用csvkit

in2csv data.xlsx > data.csv
Run Code Online (Sandbox Code Playgroud)

详情请查看他们优秀的文档

  • 这应该是最佳答案 (3认同)
  • `brew 安装 csvkit`。并做了。 (2认同)

Hol*_*ndl 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
Run Code Online (Sandbox Code Playgroud)


Aka*_*all 8

如果.xlsx文件有多张纸,-s可以使用标记来获取所需的纸张.例如:

xlsx2csv "my_file.xlsx" -s 2 second_sheet.csv
Run Code Online (Sandbox Code Playgroud)

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


Ude*_*esh 6

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

libreoffice --headless --convert-to csv ABC.xlsx
Run Code Online (Sandbox Code Playgroud)

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


小智 5

使用随附的Gnumeric电子表格应用程序确实非常简单:命令行工具ssconvert

find . -name '*.xlsx' -exec ssconvert -T Gnumeric_stf:stf_csv {} \;
Run Code Online (Sandbox Code Playgroud)

完成了!


Pav*_*ler 4

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

另一个可能可行但需要在另一端进行一些工作的选项是让您的 Excel 文件以 Excel XML 数据或XML 电子表格的形式提供给您,无论 MS 现在如何调用该格式。它将打开一个全新的机会世界,让您可以按照自己想要的方式对其进行切片和切块。