Konvertieren Sie xlsx unter Linux mit der Befehlszeile in csv

266

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 benötige Unterstützung für die neueren Excel-Dateien.

Irgendwelche Ideen?

user1390150
quelle
10
Der Gedanke, dass alles, was mit einer Skriptsprache implementiert wird, von Natur aus langsam sein wird, scheint ... ein wenig falsch zu sein, zumal die interessanten Bibliotheken in diesen Sprachen Backends in C geschrieben haben
Charles Duffy
2
Excel war früher auf 65536 Zeilen beschränkt. Jetzt sind es 1.048.576 ( support.microsoft.com/kb/120596 ). Es wird schwierig sein, "Millionen von Zeilen abzutrennen". nur sagen ...
Pavel Veller
1
@Pavel kann sich über mehrere Dateien erstrecken.
Charles Duffy
2
... persönlich würde ich dies mit der xlsv-Bibliothek für Python tun, aber da skriptbasierte Ansätze als nicht in Frage kommen ... Achselzucken . (Wie ist es eine Programmierfrage, wenn programmatische Werkzeuge von der Antwort ausgeschlossen sind?)
Charles Duffy
1
@CharlesDuffy Ich verwende derzeit eine PHP-Bibliothek, um dies zu tun, und was xls2csv 1 Sekunde dauert, dauert PHP 10 Minuten. Buchstäblich.
user1390150

Antworten:

239

Die gnumerische Tabellenkalkulationsanwendung enthält ein Befehlszeilenprogramm namens ssconvert , das zwischen verschiedenen Tabellenkalkulationsformaten 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 unter Ubuntu:

apt-get install gnumeric

So installieren Sie auf einem Mac:

brew install gnumeric
jmcnamara
quelle
19
Wirklich die problemloseste Methode zum Konvertieren von Tabellenkalkulationen. In Kombination mit einem Bash-Skript können Sie mehrere Dateien stapelweise verarbeiten. for f in *.csv; do ssconvert "$f" "${f%.csv}.xlsx"; doneDie LibreOffice-Methode könnte wahrscheinlich andere Formate verarbeiten, aber ich konnte sie nicht zum Laufen bringen (sie würde einfach jedes Mal eine leere Datei öffnen, selbst mit dem --headlessArgument).
Sleblanc
6
@sebleblanc Nicht ganz problemlos. Die Installation ist angesichts der Anzahl der Abhängigkeiten (wenn Sie dies auf einem Headless-Server tun) ein Problem. Bisher gcc, intltool, zlib-devel, GTK ... GTK benötigt glib, atk, pango, cairo, cairo-object, gdk-pixbuf-2.0 ...
andrewtweber
11
Ich habe es geschafft, es auf einem kopflosen Debian-Server mit zu installieren apt-get install gnumeric --no-install-recommends. Der einzige Nachteil ist, dass viele Warnungen ausgelöst werden. GConf-WARNING **: Der Client konnte beim Ausführen keine Verbindung zum D-BUS-Dämon herstellen . Ein einfacher ssconvert oldfile.xlsx newfile.csv > /dev/null 2>&1wird den Trick machen.
Benjamin Delichere
7
Um in CSV zu schreiben, möchten Sie möglicherweise, dass das -SFlag mehrere Blätter schreibt. Jeder geht zu seiner eigenen Datei.
Ed Avis
5
@hhh Die Trennoption funktioniert nur mit dem Exporttyp txt. Sie können dies verwenden, um auf stdout zu drucken : ssconvert -O "separator=;" -T Gnumeric_stf:stf_assistant file.xlsx fd://1.
Exic
135

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 Kennwort zu benötigen, indem Sie diese Zeile zu Ihrer sudoers-Datei hinzufügen:

users ALL=(ALL) NOPASSWD: libreoffice
Spiffytech
quelle
35
Wie würde ich libreoffice mitteilen, dass ich das zweite Blatt haben möchte?
dmeu
30
Wenn Sie sudo für alle ohne Passwort libreoffice erlauben, wird eine Dose Würmer geöffnet. Bitte beachten Sie die Konsequenzen, einschließlich der Möglichkeit, Root-Berechtigungen auf einer Mehrbenutzerplattform zu erwerben
Interarticle
5
das hat bei mir funktioniert (sudo nicht erforderlich). Meine Version: libreoffice-calc-3.6.7.2-4.fc18.x86_64
Brad Hein
5
/Applications/LibreOffice.app/Contents/MacOS/soffice --headless --convert-to csv $filenamehat für mich an OS X gearbeitet.
Nobu
12
Verwenden Sie stattdessen, um in utf-8 zu konvertieren und Nicht-ASCII-Zeichen beizubehalten --convert-to "csv:Text - txt - csv (StarCalc):44,34,76,1,1/1". Weitere Informationen finden Sie im Open Office-Wiki .
Aryeh Leib Taurog
132

Wenn Sie bereits eine Desktop-Umgebung haben, würde Gnumeric / LibreOffice sicher gut funktionieren, aber auf einem kopflosen Server (wie Amazon Web Services) sind 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.

andrewtweber
quelle
Funktioniert super, aber ich kann nur als 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') laufen . Jetzt, wo ich darüber nachdenke, habe ich den gleichen Fehler mit csvkit.
user2105469
2
.... funktionierte großartig für mich und erlaubte das Extrahieren jedes Blattes in einzelne Dateien mit der Option -s - wo libreoffice die Größe des Blattes nicht verarbeiten konnte, hatte xlsx2csv keine Probleme
Soren
Vielen Dank! Sehr praktisch in Ubuntu.
Zhuguowei
5
In Debian und Ubuntu gibt es das xlsx2csvPaket, sodass Sie es nicht manuell installieren müssen, easy_installsondern Ihren Paketmanager verwenden können.
Josch
Unter MacOS benötigen Sie einensudo easy_install xlsx2csv
Frank Hintsch
32

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.

Einige Jahre später erneut versucht, und es hat nicht funktioniert. Dieser Thread gibt einige Tipps, aber die schnellste Lösung bestand darin, als root (oder a sudo libreoffice) auszuführen . Nicht elegant, aber schnell.

Verwenden Sie den Befehl scalc.exe in Windows

neves
quelle
13
Stellen Sie sicher, dass Sie alle Openoffice-Fenster schließen, bevor Sie dies versuchen, da dies sonst stillschweigend fehlschlägt.
Tacone
Unter Windows lautet der Befehl scalc.exeeher als libreoffice. Arbeitete heute für mich an der aktuellen stabilen LO-Version.
AronVanAmmers
31

Verwenden Sie csvkit

in2csv data.xlsx > data.csv

Einzelheiten finden Sie in den ausgezeichneten Dokumenten

Holger Brandl
quelle
8

Eine andere Möglichkeit wäre, R zur Vereinfachung über einen kleinen Bash-Wrapper zu verwenden:

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

Wenn die .xlsxDatei viele Blätter enthält, -skann das Flag verwendet werden, um das gewünschte Blatt abzurufen. Zum Beispiel:

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

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

Akavall
quelle
5

Die Verwendung der Gnumeric- Tabellenkalkulationsanwendung, die mit einem Befehlszeilenprogramm namens ssconvert geliefert wird, ist in der Tat sehr einfach:

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

und du bist fertig!

Pascal-Louis Perez
quelle
Sehr nützlich und danke Herr Pascal-Louis Perez
Karthickkumar Nagaraj
1
Über dem Befehl 'ssconvert' konvertieren Sie nur 65536 Zeilen, aber mir fehlen mehr als eine Zeile. Können Sie mir helfen?
Karthickkumar Nagaraj
4

Wenn Sie die Java-Befehlszeile ausführen können, können Sie dies mit dem Excel-Extraktor von Apache POI HSSF tun . Es gibt eine mainMethode, die besagt, dass sie der Befehlszeilenextraktor ist . Dieser scheint einfach alles rauszuwerfen. 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 mainMethode, sodass Sie nicht viel Codierung per se durchführen müssen, damit es funktioniert.

Eine andere Option, die möglicherweise fliegt, aber am anderen Ende einige Arbeiten erfordert, besteht darin, Ihre Excel-Dateien als Excel-XML-Daten oder XML-Tabellenkalkulation für alle MS-Aufrufe bereitzustellen, die heutzutage dieses Format aufrufen. Es eröffnet Ihnen eine ganz neue Welt von Möglichkeiten, es nach Ihren Wünschen zu schneiden und zu würfeln.

Pavel Veller
quelle
1
Wissen Sie, ob dies auch .xlsx unterstützt?
Dimroc
1

Wie andere sagten, libreofficekönnen XLS-Dateien in CSV konvertieren. Das Problem für mich war die Blattauswahl.

Dieses libreoffice Python-Skript leistet hervorragende Arbeit bei der Konvertierung eines einzelnen Blattes in CSV.

Verwendung ist:

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

Der einzige Nachteil (an meinem Ende) ist, dass --headlesses 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.

Benoit Duffez
quelle