Converti xlsx in csv in Linux con riga di comando


266

Sto cercando un modo per convertire i file xlsx in file CSV su Linux.

Non voglio usare PHP / Perl o qualcosa del genere poiché sto cercando di elaborare diversi milioni di linee, quindi ho bisogno di qualcosa di veloce. Ho trovato un programma sui repository di Ubuntu chiamato xls2csv ma ​​convertirà solo i file xls (Office 2003) (che sto attualmente utilizzando) ma ho bisogno del supporto per i file Excel più recenti.

Qualche idea?


10
Pensare che tutto ciò che viene implementato con un linguaggio di scripting sarà lento per natura sembra ... un po 'fuorviato, soprattutto perché le biblioteche interessanti in quelle lingue tendono ad avere backend scritti in C.
Charles Duffy,

2
Excel era limitato a 65536 righe. Ora sono 1.048.576 ( support.microsoft.com/kb/120596 ). sarà difficile adattarsi a "recidere milioni di linee" al suo interno. sto solo dicendo ...
Pavel Veller,

1
@Pavel potrebbe essere su più file.
Charles Duffy,

2
... personalmente, lo farei usando la libreria xlsv per Python, ma poiché gli approcci basati sugli script sono descritti come fuori discussione ... scrollare le spalle . (Come è una domanda di programmazione se gli strumenti programmatici sono esclusi dalla risposta?)
Charles Duffy,

1
@CharlesDuffy Attualmente sto usando una libreria PHP per fare questo, e ciò che richiede xls2csv 1 secondo per fare, richiede php 10 minuti per farlo. Letteralmente.
user1390150,

Risposte:


239

L' applicazione per fogli di calcolo Gnumeric include un'utilità da riga di comando chiamata ssconvert che può convertire tra diversi formati di fogli di calcolo:

$ 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

Per installare su Ubuntu:

apt-get install gnumeric

Per installare su Mac:

brew install gnumeric

19
Davvero il metodo più semplice per convertire fogli di calcolo. Combinato con uno script bash, ti permetterà di elaborare in batch più file. for f in *.csv; do ssconvert "$f" "${f%.csv}.xlsx"; doneIl metodo LibreOffice potrebbe probabilmente elaborare altri formati, ma non sono riuscito a farlo funzionare (aprirebbe semplicemente un file vuoto ogni volta, anche con l' --headlessargomento).
slitta,

6
@sebleblanc Non del tutto privo di problemi. L'installazione è una seccatura dato il numero di dipendenze (se lo stai facendo su un server senza testa). Finora gcc, intltool, zlib-devel, GTK ... GTK richiede glib, atk, pango, cairo, cairo-object, gdk-pixbuf-2.0 ...
andrewtweber

11
Sono riuscito a installarlo su un server debian senza testa con apt-get install gnumeric --no-install-recommends. L'unico inconveniente è che genera molti avvisi GConf-WARNING **: il client non è riuscito a connettersi al demone D-BUS durante l'esecuzione. Un semplice ssconvert oldfile.xlsx newfile.csv > /dev/null 2>&1farà il trucco.
Benjamin Delichere,

7
Per scrivere su csv potresti volere che il -Sflag scriva più fogli. Ognuno va al proprio file.
Ed Avis,

5
@hhh L'opzione separatore funziona solo con il tipo di esportazione txt. È possibile utilizzare questo per stampare su stdout: ssconvert -O "separator=;" -T Gnumeric_stf:stf_assistant file.xlsx fd://1.
exic,

135

Puoi farlo con LibreOffice:

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

Per motivi che non mi sono chiari, potrebbe essere necessario eseguirlo con sudo. Puoi far funzionare LibreOffice con sudo senza richiedere una password aggiungendo questa riga al tuo file sudoers:

users ALL=(ALL) NOPASSWD: libreoffice

35
come direi a libreoffice che voglio il secondo foglio?
dmeu

30
Consentire a sudo di libreoffice per tutti senza password sta aprendo una lattina di worm. Fai attenzione alle conseguenze, inclusa la possibilità di acquisire i permessi di root su una piattaforma multiutente
Interarticle

5
questo ha funzionato per me (sudo non richiesto). La mia versione: libreoffice-calc-3.6.7.2-4.fc18.x86_64
Brad Hein

5
/Applications/LibreOffice.app/Contents/MacOS/soffice --headless --convert-to csv $filenameha lavorato su OS X per me.
Nobu,

12
Per convertire in utf-8, preservando caratteri non ascii, utilizzare invece --convert-to "csv:Text - txt - csv (StarCalc):44,34,76,1,1/1". Vedi wiki di open office per i dettagli.
Aryeh Leib Taurog,

132

Se hai già un ambiente desktop, sono sicuro che Gnumeric / LibreOffice funzionerà bene, ma su un server senza testa (come Amazon Web Services), richiedono dozzine di dipendenze che devi anche installare.

Ho trovato questa alternativa a Python:

https://github.com/dilshod/xlsx2csv

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

Ci sono voluti 2 secondi per l'installazione e funziona come un fascino.

Se disponi di più fogli, puoi esportarli tutti contemporaneamente o uno alla volta:

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

Si collega anche a diverse alternative integrate in Bash, Python, Ruby e Java.


Funziona benissimo, ma posso eseguire solo 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'). Ora che ci penso, ho avuto lo stesso errore con csvkit.
user2105469,

2
.... Funzionava perfettamente per me e consentiva l'estrazione di ogni foglio in singoli file usando l'opzione -s - dove libreoffice non era in grado di gestire le dimensioni del foglio, xlsx2csv non ha avuto problemi
Soren,

Grazie! Molto conveniente in Ubuntu.
zhuguowei,

5
In Debian e Ubuntu c'è il xlsx2csvpacchetto, quindi non è necessario installarlo manualmente easy_installma è possibile utilizzare il proprio gestore pacchetti.
Josch

Su MacOS avrai bisogno di:sudo easy_install xlsx2csv
Frank Hintsch, il

32

In bash, ho usato questo comando libreoffice per convertire tutti i miei file xlsx nella directory corrente:

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

Si occupa degli spazi nel nome del file.

Ho provato di nuovo alcuni anni dopo, e non ha funzionato. Questo thread fornisce alcuni suggerimenti, ma la soluzione più rapida era eseguire come root (o eseguendo a sudo libreoffice). Non elegante, ma veloce.

Utilizzare il comando scalc.exe in Windows


13
Assicurati di chiudere tutte le finestre di openoffice prima di tentare questo, poiché altrimenti fallirà silenziosamente.
Tacone,

Inoltre, su Windows, il comando è scalc.exeanziché libreoffice. Ha funzionato per me oggi sull'attuale versione LO stabile.
AronVanAmmers


8

Un'altra opzione sarebbe quella di usare R tramite un piccolo involucro bash per comodità:

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

8

Se il .xlsxfile ha molti fogli, -sè possibile utilizzare flag per ottenere il foglio desiderato. Per esempio:

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

second_sheet.csvconterrebbe i dati del 2 ° foglio in my_file.xlsx.


5

Usare l' applicazione per fogli di calcolo Gnumeric che arriva che un'utilità a riga di comando chiamata ssconvert è davvero super semplice:

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

e hai finito!


Molto utile e grazie Mr.Pascal-Louis Perez
Karthickkumar Nagaraj

1
Sopra il comando 'ssconvert' converto solo 65536 righe ma ne ho più di una mancante, puoi aiutarmi?
Karthickkumar Nagaraj

4

Se sei OK per eseguire la riga di comando Java, puoi farlo con Excel Extractor POI HSSF di Apache . Ha un mainmetodo che dice di essere l'estrattore della riga di comando . Questo sembra scaricare tutto. Indicano questo esempio che viene convertito in CSV . Dovresti compilarlo prima di poterlo eseguire, ma ha anche un mainmetodo, quindi non dovresti fare molta codifica di per sé per farlo funzionare.

Un'altra opzione che potrebbe volare ma richiederà un po 'di lavoro all'altra estremità è quella di rendere i tuoi file Excel disponibili come Excel XML Data o XML Spreadsheet di qualunque MS chiama quel formato in questi giorni. Ti aprirà un nuovo mondo di opportunità per tagliarlo e tagliarlo nel modo desiderato.


1
Sai se questo supporta anche .xlsx?
Dimroc

1

Come altri hanno già detto, libreofficepuò convertire i file xls in CSV. Il problema per me era la selezione del foglio.

Questo script libreoffice Python fa un ottimo lavoro nel convertire un singolo foglio in CSV.

L'utilizzo è:

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

L'unico aspetto negativo (dalla mia parte) è che --headlessnon sembra funzionare. Ho una finestra LO che si presenta per un secondo e poi si chiude.
Per me va bene, è l'unico strumento che fa il lavoro rapidamente.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.