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?
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
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
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.
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
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.
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
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!
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.
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.