Sto cercando un modo per convertire i file xlsx in file CSV su Linux.
Non voglio usare PHP/Perl o qualcosa di simile dal momento che sto cercando di elaborare diversi milioni di righe, 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 attualmente sto usando) ma ho bisogno del supporto per i nuovi file Excel.
Qualche idea?
L'applicazione Gnumeric spreadsheet viene fornita con un'utilità della riga di comando chiamata ssconvert che può essere convertita in una varietà di formati di foglio 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
Puoi farlo con LibreOffice:
libreoffice --headless --convert-to csv $filename --outdir $outdir
Per ragioni che non mi sono chiare, potrebbe essere necessario eseguirlo con Sudo. Puoi fare in modo che LibreOffice funzioni con Sudo senza richiedere una password aggiungendo questa riga al file sudoers:
users ALL=(ALL) NOPASSWD: libreoffice
Se si dispone già di un ambiente desktop, sono sicuro che Gnumeric/LibreOffice funzionerebbe bene, ma su un server headless (come Amazon Web Services), richiedono decine di dipendenze che è necessario 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 hai più fogli puoi esportarli tutti in una volta 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 costruite in Bash, Python, Ruby e Java.
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 prende cura degli spazi nel nome del file.
Ho provato ancora alcuni anni più tardi, e non ha funzionato. Questo thread fornisce alcuni suggerimenti, ma la soluzione più rapida era eseguire come root (o eseguire un Sudo libreoffice
). Non elegante, ma veloce.
Utilizzare il comando scalc.exe in Windows
Se il file .xlsx
ha molti fogli, è possibile utilizzare il flag -s
per ottenere il foglio desiderato. Per esempio:
xlsx2csv "my_file.xlsx" -s 2 second_sheet.csv
second_sheet.csv
conterrebbe i dati del 2 ° foglio in my_file.xlsx
.
Un'altra opzione sarebbe quella di utilizzare R tramite un piccolo wrapper 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
Usando l'applicazione Gnumeric spreadsheet che viene fornita da una utility a linea di comando chiamata ssconvert è davvero super semplice:
find . -name '*.xlsx' -exec ssconvert -T Gnumeric_stf:stf_csv {} \;
e hai finito!
Se è possibile eseguire la riga di comando di Java, è possibile farlo con Apache POI HSSF Excel Extractor . Ha un metodo main
che dice di essere l'estrattore da riga di comando . Questo sembra solo scaricare tutto. Indicano a questo esempio che converte in CSV . Dovresti compilarlo prima di poterlo eseguire, ma anch'esso ha un metodo main
, quindi non dovresti fare molta codifica di per sé per farlo funzionare.
Un'altra opzione che potrebbe volare ma richiederà un po 'di lavoro dall'altra parte è di farti venire i file Excel come dati XML Excel o XML Spreadsheet di qualunque MS chiama quel formato in questi giorni. Aprirà un intero nuovo mondo di opportunità per voi di affettarlo e tagliarlo come volete.
Come altri hanno detto, libreoffice
può convertire i file xls in csv. Il problema per me era la selezione del foglio.
Questo script Python libreoffice fa un buon lavoro nella conversione di un singolo foglio in CSV.
L'utilizzo è:
./libreconverter.py File.xls:"Sheet Name" output.csv
L'unico lato negativo (sulla mia estremità) è che --headless
non sembra funzionare. Ho una finestra LO che si presenta per un secondo e poi si chiude.
Va bene con me, è l'unico strumento che fa il lavoro rapidamente.