316 votes

Convertir xlsx en csv sous Linux avec une 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 d'autre, car il s'agit de traiter plusieurs millions de lignes, et j'ai donc besoin de quelque chose de rapide. J'ai trouvé un programme sur les dépôts Ubuntu appelé xls2csv mais il ne convertit que les fichiers xls (Office 2003) (que j'utilise actuellement) mais j'ai besoin d'un support pour les fichiers Excel plus récents.

Des idées ?

10 votes

Penser que tout ce qui est implémenté avec un langage de script va être lent par nature semble... un peu erroné, en particulier parce que les bibliothèques intéressantes dans ces langages ont tendance à avoir des backends écrits en C.

2 votes

Excel était autrefois limité à 65536 lignes. Maintenant, c'est 1 048 576 ( support.microsoft.com/kb/120596 ). il va être difficile d'y faire entrer "des millions de lignes". je dis ça comme ça...

1 votes

@Pavel pourrait être sur plusieurs dossiers.

276voto

jmcnamara Points 6100

Le site Gnumeric est livré avec un utilitaire de ligne de commande appelé ssconvert qui peut convertir entre une variété de formats de feuilles de calcul :

$ 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

21 votes

C'est vraiment la méthode la plus simple pour convertir des feuilles de calcul. Combiné à un script bash script, il vous permettra de traiter plusieurs fichiers par lots. for f in *.csv; do ssconvert "$f" "${f%.csv}.xlsx"; done La méthode de LibreOffice pourrait probablement traiter d'autres formats, mais je n'ai pas réussi à la faire fonctionner (elle ouvrait simplement un fichier vide à chaque fois, même avec l'option --headless argument).

7 votes

@sebleblanc Pas tout à fait sans tracas. L'installation est une douleur étant donné le nombre de dépendances (si vous faites cela sur un serveur headless). Jusqu'à présent, gcc, intltool, zlib-devel, GTK... GTK nécessite glib, atk, pango, cairo, cairo-object, gdk-pixbuf-2.0...

0 votes

Il semble qu'il n'y ait pas de moyen d'empêcher ssconvert de recalculer la feuille avant de la convertir en csv... Voir stackoverflow.com/questions/22344918/

150voto

spiffytech Points 1238

Vous pouvez le faire avec LibreOffice :

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

Pour des raisons qui ne sont pas claires pour moi, vous pourriez avoir besoin de l'exécuter avec sudo. Vous pouvez faire en sorte que LibreOffice fonctionne avec sudo sans demander de mot de passe en ajoutant cette ligne à votre fichier sudoers :

users ALL=(ALL) NOPASSWD: libreoffice

37 votes

Comment puis-je dire à libreoffice que je veux la deuxième feuille ?

33 votes

Autoriser sudo à libreoffice pour tout le monde sans mot de passe, c'est ouvrir une boîte de Pandore. Veuillez faire attention aux conséquences, y compris la possibilité d'acquérir des autorisations Root sur une plateforme multi-utilisateurs.

5 votes

Ceci a fonctionné pour moi (sudo non requis). Ma version : libreoffice-calc-3.6.7.2-4.fc18.x86_64

150voto

andrewtweber Points 2850

Si vous avez déjà un environnement de bureau, je suis sûr que Gnumeric / LibreOffice fonctionnerait bien, mais sur un serveur sans tête (comme Amazon Web Services), ils nécessitent des dizaines de dépendances que vous devez également installer.

J'ai trouvé cette alternative Python :

https://github.com/dilshod/xlsx2csv

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

Il a fallu 2 secondes pour l'installer et il fonctionne comme un charme.

Si vous avez plusieurs feuilles, vous pouvez les exporter toutes en même temps, ou une par une :

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

Il propose également des liens vers plusieurs alternatives construites en Bash, Python, Ruby et Java.

0 votes

Cela fonctionne très bien, mais je peux faire en sorte que l'exécution se fasse uniquement en tant que sudo ( IOError: [Errno 13] Permission denied: '/usr/local/lib/python2.7/dist-packages/prettytable-0.7.2-py‌​2.7.egg/EGG-INFO/top‌​_level.txt' ). Maintenant que j'y pense, j'ai eu la même erreur avec csvkit .

2 votes

....Fonctionne très bien pour moi et permet l'extraction de chaque feuille vers des fichiers individuels en utilisant l'option -s -- là où libreoffice n'était pas capable de gérer la taille de la feuille, xlsx2csv n'a eu aucun problème.

0 votes

Merci ! Très pratique dans ubuntu.

40voto

neves Points 3075

En bash, j'ai utilisé cette commande libreoffice pour convertir tous mes fichiers xlsx dans le répertoire courant :

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

Fermez toutes vos instances ouvertes de Libre Office avant de l'exécuter, ou il échouera silencieusement.

La commande prend en compte les espaces dans le nom du fichier.

J'ai réessayé quelques années plus tard, et ça n'a pas marché. Ce fil donne quelques conseils, mais la solution la plus rapide était de s'exécuter en tant que Root (ou d'exécuter un fichier sudo libreoffice ). Pas élégant, mais rapide.

Utilisez la commande scalc.exe dans Windows

13 votes

Assurez-vous de fermer toutes les fenêtres d'openoffice avant de tenter cette opération, car sinon elle échouera silencieusement.

0 votes

De même, sous Windows, la commande est scalc.exe plutôt que libreoffice . Cela a fonctionné pour moi aujourd'hui sur la version stable actuelle de LO.

1 votes

En passant, ceci a fonctionné pour moi en ce moment, sur ubuntu.

11voto

Holger Brandl Points 124

Une autre option serait d'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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X