提问人:user1390150 提问时间:5/12/2012 最后编辑:Matthias Braunuser1390150 更新时间:2/27/2023 访问量:354970
在 Linux 中使用命令行将 xlsx 转换为 csv
Convert xlsx to csv in Linux with command line
问:
我正在寻找一种在 Linux 上将 xlsx 文件转换为 csv 文件的方法。
我不想使用 PHP/Perl 或类似的东西,因为我正在考虑处理数百万行,所以我需要一些快速的东西。我在 Ubuntu 存储库上找到了一个名为 xls2csv 的程序,但它只会转换 xls (Office 2003) 文件(我目前正在使用),但我需要支持较新的 Excel 文件。
有什么想法吗?
答:
如果您可以运行 Java 命令行,那么您可以使用 Apache POI HSSF 的 Excel 提取器来完成。它有一个 main
方法,据说是命令行提取器。这个似乎只是把所有东西都倾倒了。他们指出了这个转换为 CSV 的示例。您必须先编译它才能运行它,但它也有一种方法,因此您本身不必进行太多编码即可使其工作。main
另一个可能飞起来但需要在另一端做一些工作的选择是让您的 Excel 文件以 Excel XML 数据或 XML 电子表格的形式出现,这些天 MS 称之为该格式。它将为您打开一个全新的机会世界,让您以自己想要的方式进行切片和切块。
评论
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
评论
for f in *.csv; do ssconvert "$f" "${f%.csv}.xlsx"; done
--headless
apt-get install gnumeric --no-install-recommends
ssconvert oldfile.xlsx newfile.csv > /dev/null 2>&1
-S
ssconvert -O "separator=;" -T Gnumeric_stf:stf_assistant file.xlsx fd://1
您可以使用 LibreOffice 执行此操作:
libreoffice --headless --convert-to csv $filename --outdir $outdir
由于我不清楚的原因,您可能需要使用 sudo 运行它。您可以通过将以下行添加到 sudoers 文件中,使 LibreOffice 在不需要密码的情况下与 sudo 一起工作:
users ALL=(ALL) NOPASSWD: libreoffice
评论
/Applications/LibreOffice.app/Contents/MacOS/soffice --headless --convert-to csv $filename
在OS X上为我工作。
--convert-to "csv:Text - txt - csv (StarCalc):44,34,76,1,1/1"
在 Bash 中,我使用这个 LibreOffice 命令(可执行文件)来转换当前目录中的所有 .xlsx 文件:libreoffice
for i in *.xlsx; do libreoffice --headless --convert-to csv "$i" ; done
在执行之前关闭所有 LibreOffice 打开的实例,否则它将以静默方式失败。
该命令负责文件名中的空格。
几年后我又试了一次,但没有用。这个问题提供了一些提示,但最快的解决方案是以 root 身份运行(或运行 )。它不优雅,但很快。sudo libreoffice
在 Windows 中使用命令 scalc.exe。
评论
scalc.exe
libreoffice
如果您已经有一个桌面环境,那么我相信 Gnumeric 或 LibreOffice 会运行良好,但在无头服务器(例如任何基于云的环境)上,它们需要您还需要安装数十个依赖项。
我找到了这个 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 构建的几个替代方案。
评论
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
xlsx2csv
easy_install
sudo easy_install xlsx2csv
为了方便起见,另一种选择是通过一个小的 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
使用 csvkit:
in2csv data.xlsx > data.csv
有关详细信息,请查看他们的优秀文档。
评论
brew install csvkit
.并完成了。
如果文件有许多工作表,则可以使用该标志来获取所需的工作表。例如:.xlsx
-s
xlsx2csv "my_file.xlsx" -s 2 second_sheet.csv
second_sheet.csv
将包含 中第二张工作表的数据。my_file.xlsx
使用Gnumeric电子表格应用程序,它带有一个名为ssconvert的命令行实用程序,确实非常简单:
find . -name '*.xlsx' -exec ssconvert -T Gnumeric_stf:stf_csv {} \;
大功告成!
评论
正如其他人所说,可执行文件可以将Excel文件(.xls)文件转换为CSV。对我来说,问题在于纸张的选择。libreoffice
这个 LibreOffice Python 脚本在将单个工作表转换为 CSV 方面做得很好。
用法是:
./libreconverter.py File.xls:"Sheet Name" output.csv
唯一的缺点(在我这边)是这似乎不起作用。我有一个 LibreOffice 窗口,它显示了一秒钟,然后退出。--headless
这对我来说没关系;它是唯一可以快速完成工作的工具。
您可以使用可执行文件将 .xlsx 文件转换为 csv:libreoffice
libreoffice --headless --convert-to csv ABC.xlsx
参数 --headless 表示我们不需要 GUI。
评论
您可以使用脚本 getsheets.py。首先添加依赖:
pip3 install pandas xlrd openpyxl
然后调用脚本:python3 getsheets.py <file.xlsx>
评论