web-dev-qa-db-de.com

Konvertieren Sie xlsx in csv in Linux mit der Befehlszeile

Ich suche nach einer Möglichkeit, Xlsx-Dateien unter Linux in CSV-Dateien zu konvertieren.

Ich möchte kein PHP/Perl oder ähnliches verwenden, da ich mehrere Millionen Zeilen verarbeiten möchte, also brauche ich etwas schnelles. Ich habe auf den Ubuntu-Repos ein Programm namens xls2csv gefunden, das jedoch nur xls-Dateien (Office 2003) konvertiert (die ich derzeit verwende), aber ich brauche Unterstützung für die neueren Excel-Dateien.

Irgendwelche Ideen?

205
user1390150

Die Anwendung Gnumeric Spreadsheet enthält ein Befehlszeilenprogramm namens ssconvert , das zwischen verschiedenen Tabellenformaten konvertieren kann:

$ 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

So installieren Sie auf Ubuntu:

apt-get install gnumeric

So installieren Sie auf einem Mac:

brew install gnumeric
186
jmcnamara

Sie können dies mit LibreOffice tun:

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

Aus Gründen, die mir nicht klar sind, müssen Sie dies möglicherweise mit Sudo ausführen. Sie können LibreOffice mit Sudo arbeiten lassen, ohne ein Passwort zu benötigen, indem Sie diese Zeile zu Ihrer Sudoers-Datei hinzufügen:

users ALL=(ALL) NOPASSWD: libreoffice
117
spiffytech

Wenn Sie bereits über eine Desktop-Umgebung verfügen, bin ich sicher, dass Gnumeric/LibreOffice gut funktionieren würde. Auf einem Headless-Server (wie Amazon Web Services) sind jedoch Dutzende von Abhängigkeiten erforderlich, die Sie ebenfalls installieren müssen.

Ich habe diese Python-Alternative gefunden:

https://github.com/dilshod/xlsx2csv

$ easy_install xlsx2csv
$ xlsx2csv file.xlsx > newfile.csv

Die Installation dauerte 2 Sekunden und funktioniert wie ein Zauber. 

Wenn Sie mehrere Blätter haben, können Sie alle gleichzeitig oder einzeln exportieren:

$ xlsx2csv file.xlsx --all > all.csv
$ xlsx2csv file.xlsx --all -p '' > all-no-delimiter.csv
$ xlsx2csv file.xlsx -s 1 > sheet1.csv

Er verweist auch auf verschiedene Alternativen, die in Bash, Python, Ruby und Java erstellt wurden.

99
andrewtweber

In bash habe ich diesen libreoffice-Befehl verwendet, um alle meine xlsx-Dateien im aktuellen Verzeichnis zu konvertieren:

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

Es kümmert sich um Leerzeichen im Dateinamen. 

Versuchte es einige Jahre später erneut und es funktionierte nicht. Dieser Thread gibt einige Tipps, aber die schnellste Lösung war, als root (oder einen Sudo libreoffice) auszuführen. Nicht elegant, aber schnell. 

Verwenden Sie den Befehl scalc.exe in Windows

25
neves

Verwenden Sie csvkit

in2csv data.xlsx > data.csv

Für Details überprüfen Sie ihre ausgezeichneten Dokumente

24
Holger Brandl

Wenn die .xlsx-Datei viele Blätter enthält, kann mit dem Flag -s das gewünschte Blatt abgerufen werden. Zum Beispiel:

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

second_sheet.csv würde Daten des 2. Blattes in my_file.xlsx enthalten.

7
Akavall

Eine andere Option wäre die Verwendung von R über einen kleinen Bash-Wrapper.

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
Holger Brandl

Die Verwendung der Gnumeric Tabellenkalkulationsanwendung, die ein Kommandozeilenprogramm namens ssconvert enthält, ist in der Tat sehr einfach:

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

und du bist fertig!

4

Wenn Sie die Java-Befehlszeile ausführen können, können Sie dies mit dem Excel Extractor von Apache POI HSSF tun. Es hat die a main-Methode, die sagt, dass sie der Befehlszeilen-Extraktor ist. Dieser scheint alles einfach auszuwerfen. Sie weisen auf dieses Beispiel hin, das in CSV konvertiert wird. Sie müssten es kompilieren, bevor Sie es ausführen können, aber es hat auch eine main-Methode, so dass Sie nicht viel Codeing per se machen müssen, damit es funktioniert.

Eine andere Option, die möglicherweise fliegt, aber am anderen Ende einige Arbeit erfordert, besteht darin, Ihre Excel-Dateien als Excel-XML-Daten oder XML-Spreadsheet eines beliebigen MS-Aufrufs anzufertigen, der in diesen Tagen das Format verwendet. Es eröffnet Ihnen eine völlig neue Welt von Möglichkeiten, um es so zu schneiden, wie Sie es möchten.

3
Pavel Veller

Wie bereits gesagt, kann libreoffice xls-Dateien in csv konvertieren. Das Problem für mich war die Blattauswahl.

Dieses libreoffice Python-Skript erledigt das Konvertieren eines einzelnen Arbeitsblatts in CSV.

Verwendung ist:

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

Der einzige Nachteil (an meinem Ende) ist, dass --headless nicht zu funktionieren scheint. Ich habe ein LO-Fenster, das für eine Sekunde angezeigt wird und dann beendet wird.
Das ist in Ordnung für mich, es ist das einzige Werkzeug, das die Arbeit schnell erledigt.

0
Benoit Duffez