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?
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
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
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.
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
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
.
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
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!
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.
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.