web-dev-qa-db-fra.com

Convertir xlsx en csv sous Linux avec la ligne de commande

Je cherche un moyen de convertir des fichiers xlsx en fichiers csv sous Linux.

Je ne veux pas utiliser PHP/Perl ou quoi que ce soit du genre, car je traite plusieurs millions de lignes, il me faut donc quelque chose de rapide. J'ai trouvé un programme sur le dépôt Ubuntu appelé xls2csv mais il ne convertira que les fichiers xls (Office 2003) (que j'utilise actuellement), mais j'ai besoin de la prise en charge des fichiers Excel les plus récents.

Des idées?

205
user1390150

L'application Gnumeric tableur est livrée avec un utilitaire de ligne de commande appelé ssconvert qui peut effectuer la conversion entre différents formats de tableurs:

$ 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

Pour installer sur Ubuntu:

apt-get install gnumeric

Pour installer sur Mac:

brew install gnumeric
186
jmcnamara

Vous pouvez le faire avec LibreOffice:

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

Pour des raisons qui ne me semblent pas claires, vous devrez peut-être exécuter cela avec Sudo. Vous pouvez faire en sorte que LibreOffice fonctionne avec Sudo sans exiger de mot de passe en ajoutant cette ligne à votre fichier sudoers:

users ALL=(ALL) NOPASSWD: libreoffice
117
spiffytech

Si vous avez déjà un environnement de bureau, je suis certain que Gnumeric/LibreOffice fonctionnerait bien, mais sur un serveur sans interface utilisateur (tel que Amazon Web Services), ils nécessitent des dizaines de dépendances que vous devez également installer.

J'ai trouvé cette alternative en Python:

https://github.com/dilshod/xlsx2csv

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

A pris 2 secondes pour installer et fonctionne comme un charme. 

Si vous avez plusieurs feuilles, vous pouvez tout exporter en même temps ou une à la fois:

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

Il fait également référence à plusieurs alternatives construites en Bash, Python, Ruby et Java.

99
andrewtweber

Sous bash, j’ai utilisé cette commande libreoffice pour convertir tous mes fichiers xlsx du répertoire actuel:

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

Il prend soin des espaces dans le nom du fichier. 

Essayé à nouveau quelques années plus tard, et cela n'a pas fonctionné. Ce fil donne quelques conseils, mais la solution la plus rapide était de s’exécuter en tant que root (ou avec un Sudo libreoffice). Pas élégant, mais rapide. 

Utilisez la commande scalc.exe dans Windows

25
neves

Utilisez csvkit

in2csv data.xlsx > data.csv

Pour plus de détails, consultez leurs excellents docs

24
Holger Brandl

Si le fichier .xlsx contient plusieurs feuilles, vous pouvez utiliser l'indicateur -s pour obtenir la feuille souhaitée. Par exemple:

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

second_sheet.csv contiendrait les données de la 2ème feuille en my_file.xlsx.

7
Akavall

Une autre option consisterait à utiliser R via un petit wrapper bash pour plus de commodité:

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

En utilisant l’application Gnumeric tableur fournie avec un utilitaire de ligne de commande appelé ssconvert, c’est vraiment très simple:

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

et tu as fini!

4
Pascal-Louis Perez

Si vous êtes en mesure d'exécuter la ligne de commande Java, vous pouvez le faire avec Apache POI HSSF Excel Extractor . Il a une méthode main qui dit être l'extracteur de ligne de commande . Celui-ci semble tout vider. Ils soulignent cet exemple qui convertit au format CSV . Vous devriez le compiler avant de pouvoir l'exécuter, mais il a aussi une méthode main et vous ne devriez donc pas avoir à coder beaucoup pour le faire fonctionner.

Une autre option possible mais qui nécessitera un peu de travail à l’autre extrémité est de faire en sorte que vos fichiers Excel vous soient livrés sous forme de données XML Excel ou XML ​​Spreadsheet quel que soit le type d’appel que MS appelle ce format. Cela vous ouvrira un tout nouveau monde d'opportunités pour le découper comme vous le souhaitez.

3
Pavel Veller

Comme d'autres l'ont dit, libreoffice peut convertir des fichiers xls en csv. Le problème pour moi était la sélection des feuilles.

Ce script libreoffice Python fait un travail remarquable pour convertir une seule feuille au format CSV.

L'utilisation est:

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

Le seul inconvénient (de mon côté) est que --headless ne semble pas fonctionner. J'ai une fenêtre LO qui s'affiche pendant une seconde, puis quitte.
C’est bien avec moi, c’est le seul outil qui fait le travail rapidement.

0
Benoit Duffez