Convertir xlsx en csv sous Linux avec la ligne de commande

266

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

Je ne veux pas utiliser PHP / Perl ou quelque chose comme ça car je regarde le traitement de plusieurs millions de lignes, 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 convertira que les fichiers xls (Office 2003) (que j'utilise actuellement) mais j'ai besoin de prise en charge pour les fichiers Excel plus récents.

Des idées?

user1390150
la source
10
Penser que tout ce qui est implémenté avec un langage de script va être lent par nature semble ... un peu erroné, d'autant plus que les bibliothèques intéressantes dans ces langues ont tendance à avoir des backends écrits en C.
Charles Duffy
2
Excel était auparavant limité à 65 536 lignes. Maintenant, c'est 1.048.576 ( support.microsoft.com/kb/120596 ). il va être difficile d'y intégrer "couper des millions de lignes". je dis juste ...
Pavel Veller
1
@Pavel peut contenir plusieurs fichiers.
Charles Duffy
2
... personnellement, je le ferais en utilisant la bibliothèque xlsv pour Python, mais comme les approches basées sur les scripts sont décrites comme hors de question ... haussement d'épaules . (Comment est-ce une question de programmation si les outils de programmation sont exclus de la réponse?)
Charles Duffy
1
@CharlesDuffy J'utilise actuellement une bibliothèque PHP pour ce faire, et ce qui prend xls2csv 1 seconde à faire, prend php 10 minutes à faire. Au sens propre.
user1390150

Réponses:

239

L' application de feuille de calcul Gnumeric est livrée avec un utilitaire de ligne de commande appelé ssconvert qui peut convertir entre une variété de formats de feuille 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
jmcnamara
la source
19
Vraiment la méthode la plus simple pour convertir des feuilles de calcul. Combiné avec un script bash, il vous permettra de traiter plusieurs fichiers par lots. for f in *.csv; do ssconvert "$f" "${f%.csv}.xlsx"; doneLa méthode LibreOffice pourrait probablement traiter d'autres formats, mais je ne pouvais pas la faire fonctionner (elle ouvrirait simplement un fichier vierge à chaque fois, même avec l' --headlessargument).
sleblanc
6
@sebleblanc Pas tout à fait sans tracas. L'installation est pénible compte tenu du nombre de dépendances (si vous faites cela sur un serveur sans tête). Jusqu'à présent gcc, intltool, zlib-devel, GTK ... GTK nécessite glib, atk, pango, cairo, cairo-object, gdk-pixbuf-2.0 ...
andrewtweber
11
J'ai réussi à l'installer sur un serveur Debian sans tête avec apt-get install gnumeric --no-install-recommends. Le seul inconvénient est qu'il déclenche de nombreux avertissements GConf-WARNING **: le client n'a pas pu se connecter au démon D-BUS lors de son exécution. Un simple ssconvert oldfile.xlsx newfile.csv > /dev/null 2>&1fera l'affaire.
Benjamin Delichere
7
Pour écrire dans csv, vous pouvez souhaiter que le -Sdrapeau écrive plusieurs feuilles. Chacun va dans son propre fichier.
Ed Avis
5
@hhh L'option de séparation ne fonctionne qu'avec le type d'exportation txt. Vous pouvez l' utiliser pour imprimer stdout: ssconvert -O "separator=;" -T Gnumeric_stf:stf_assistant file.xlsx fd://1.
exic
135

Vous pouvez le faire avec LibreOffice:

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

Pour des raisons qui ne me paraissent pas claires, vous devrez peut-être exécuter ceci avec sudo. Vous pouvez faire fonctionner LibreOffice avec sudo sans avoir besoin d'un mot de passe en ajoutant cette ligne à votre fichier sudoers:

users ALL=(ALL) NOPASSWD: libreoffice
spiffytech
la source
35
comment pourrais-je dire à libreoffice que je veux la deuxième feuille?
dmeu
30
Autoriser sudo à libreoffice pour tout le monde sans mot de passe, c'est ouvrir une boîte de vers. Attention aux conséquences, notamment à la possibilité d'acquérir des droits root sur une plateforme multi-utilisateurs
Interarticle
5
cela a fonctionné pour moi (sudo non requis). Ma version: libreoffice-calc-3.6.7.2-4.fc18.x86_64
Brad Hein
5
/Applications/LibreOffice.app/Contents/MacOS/soffice --headless --convert-to csv $filenametravaillé sur OS X pour moi.
Nobu
12
Pour convertir en utf-8, en préservant les caractères non ascii, utilisez plutôt --convert-to "csv:Text - txt - csv (StarCalc):44,34,76,1,1/1". Voir le wiki du bureau ouvert pour plus de détails.
Aryeh Leib Taurog du
132

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

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

Si vous disposez de plusieurs feuilles, vous pouvez les exporter toutes à la fois, 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 établit également des liens vers plusieurs alternatives intégrées à Bash, Python, Ruby et Java.

andrewtweber
la source
Fonctionne très bien, mais je peux exécuter uniquement en tant que 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'). Maintenant que j'y pense, j'ai eu la même erreur avec csvkit.
user2105469
2
.... fonctionnait très bien pour moi et permettait l'extraction de chaque feuille dans des fichiers individuels en utilisant l'option -s - où libreoffice n'était pas en mesure de gérer la taille de la feuille, xlsx2csv n'a eu aucun problème
Soren
Merci! Très pratique dans ubuntu.
zhuguowei
5
Dans Debian et Ubuntu, il y a le xlsx2csvpaquet, vous n'avez donc pas besoin de l'installer manuellement, easy_installmais vous pouvez utiliser votre gestionnaire de paquets.
josch
Sur MacOS, vous aurez besoin d'unsudo easy_install xlsx2csv
Frank Hintsch
32

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

Il prend soin des espaces dans le nom de fichier.

Réessayé quelques années plus tard, et cela n'a pas fonctionné. Ce fil donne quelques conseils, mais la solution la plus rapide a été de s'exécuter en tant que root (ou en exécutant a sudo libreoffice). Pas élégant, mais rapide.

Utilisez la commande scalc.exe dans Windows

neves
la source
13
Assurez-vous de fermer toutes les fenêtres openoffice avant d'essayer, car cela échouera en silence sinon.
tacone
De plus, sous Windows, la commande est scalc.exeplutôt que libreoffice. A travaillé pour moi aujourd'hui sur la version LO stable actuelle.
AronVanAmmers
31

Utilisez csvkit

in2csv data.xlsx > data.csv

Pour plus de détails, consultez leurs excellents documents

Holger Brandl
la source
8

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
Holger Brandl
la source
8

Si le .xlsxfichier contient plusieurs feuilles, le -sdrapeau peut être utilisé pour obtenir la feuille souhaitée. Par exemple:

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

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

Akavall
la source
5

L'utilisation de la feuille de calcul Gnumeric fournie avec un utilitaire de ligne de commande appelé ssconvert est en effet super simple:

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

et tu as fini!

Pascal-Louis Perez
la source
Très utile et merci Mr.Pascal-Louis Perez
Karthickkumar Nagaraj
1
La commande ci-dessus 'ssconvert' ne convertit que 65536 lignes mais j'ai plusieurs lignes manquantes, pouvez-vous m'aider?
Karthickkumar Nagaraj
4

Si vous êtes d'accord pour exécuter la ligne de commande Java, vous pouvez le faire avec l' Extracteur Excel d'Apache POI HSSF . Il a une mainméthode qui dit être l'extracteur de ligne de commande . Celui-ci semble simplement tout déverser. Ils soulignent cet exemple qui se convertit en CSV . Vous devrez le compiler avant de pouvoir l'exécuter, mais il a aussi unmain méthode, vous ne devriez donc pas avoir à faire beaucoup de codage en soi pour le faire fonctionner.

Une autre option qui pourrait voler mais nécessitera un certain travail à l'autre extrémité est de faire en sorte que vos fichiers Excel vous parviennent sous forme de données XML Excel ou de feuille de calcul XML de tous les appels MS qui formatent ces jours-ci. Cela vous ouvrira un tout nouveau monde d'opportunités pour le découper et le découper comme vous le souhaitez.

Pavel Veller
la source
1
Savez-vous si cela prend également en charge .xlsx?
dimroc
1

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

Ce script Python libreoffice fait un excellent travail pour convertir une seule feuille en CSV.

L'utilisation est:

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

Le seul inconvénient (de mon côté) est que --headlesscela ne semble pas fonctionner. J'ai une fenêtre LO qui apparaît pendant une seconde puis se ferme.
Ça ne me dérange pas, c'est le seul outil qui fait le travail rapidement.

Benoit Duffez
la source