Convertir un fichier .xlsx (MS Excel) en .csv sur la ligne de commande avec des champs séparés par des points-virgules

31

Je me rends compte que ce n'est pas une question entièrement liée à Unix / Linux. Mais comme c'est quelque chose que je ferai sur Linux, j'espère que quelqu'un aura une réponse.

J'ai un fichier Excel en ligne ( .xlsx) qui est mis à jour périodiquement (par quelqu'un d'autre). Je veux écrire un script et le mettre en tant que cronjob afin de traiter cette feuille Excel. Mais pour ce faire, je dois convertir cela en un fichier texte (donc a .csv) avec des colonnes séparées par des points-virgules. Il ne peut malheureusement pas être séparé par des virgules car certaines colonnes contiennent des virgules. Est-il possible de faire cette conversion à partir du shell? J'ai installé Open Office et je peux le faire en utilisant son interface graphique, mais je veux savoir s'il est possible de le faire à partir de la ligne de commande. Merci!

PS: J'ai aussi une machine Mac, donc si une solution peut fonctionner, c'est bien aussi. :)

d'accord
la source

Réponses:

21

OpenOffice est livré avec le programme unoconv pour effectuer des conversions de format sur la ligne de commande.

unoconv -f csv filename.xlsx

Pour des exigences plus complexes, vous pouvez analyser des fichiers XLSX avec Spreadsheet::XLSXen Perl ou openpyxlen Python. Par exemple, voici un script rapide pour imprimer une feuille de calcul en tant que fichier CSV séparé par des points-virgules (avertissement: non testé, tapé directement dans le navigateur):

perl -MSpreadsheet::XLSX -e '
    $\ = "\n"; $, = ";";
    my $workbook = Spreadsheet::XLSX->new()->parse($ARGV[0]);
    my $worksheet = ($workbook->worksheets())[0];
    my ($row_min, $row_max) = $worksheet->row_range();
    my ($col_min, $col_max) = $worksheet->col_range();
    for my $row ($row_min..$row_max) {
        print map {$worksheet->get_cell($row,$_)->value()} ($col_min..$col_max);
    }
' filename.xlsx >filename.csv
Gilles, arrête de faire le mal
la source
unoconv n'est pas venu avec mon OO, mais je l'ai installé et cela fonctionne très bien (convertit en fichier séparé par des virgules, pas en point-virgule cependant)! Merci! Je devrai encore trouver comment obtenir mes champs contenant des virgules. Mais merci quand même.
allrite
@allrite Oh, j'avais manqué l'exigence de points-virgules comme séparateurs. Ma suggestion de faire le traitement en Python ou Perl est toujours valable. Mais j'ai également ajouté un script (non testé) pour convertir en CSV avec ;comme séparateur.
Gilles 'SO- arrête d'être méchant'
Merci! J'ai utilisé Spreadsheet :: XLSX, mais j'ai utilisé le code dans le lien CPAN que vous avez fourni. Ça marche :)
allrite
1
Un utilisateur anonyme a eu des problèmes avec cela
Michael Mrozek
9

https://github.com/dilshod/xlsx2csv

A bien fonctionné pour moi. Environ 85 Mo de fichier XLSX converti en environ 3 minutes sur un SSD Mac Book Pro.

Bohumir Zamecnik
la source
1
A bien fonctionné dans OSX $ python xlsx2csv.py -d ";" my.xlsx my.csvet a bien fonctionné pour définir le déliminateur, merci +!
hhh
6

J'utilise xls2csv de Perl pour convertir des xlsfichiers csv.

Je ne sais pas si cela fonctionne xlsxaussi.

Sur:

Il ne peut pas être séparé par des virgules, car certaines colonnes contiennent des virgules

c'est pourquoi la citation a été introduite:

1,2,"data,data, more data"
neurino
la source
merci pour le conseil, je vais essayer ça. Je préfère toujours les points-virgules séparés, car après la conversion csv, le fichier passe par des awkscripts. Et c'est juste plus facile de passer le point-virgule comme séparateur de champ awk. Je pourrais chercher des virgules dans les guillemets pour les remplacer par autre chose ... maintenant c'est une autre question :)
allrite
Merci @neurino. J'ai utilisé la méthode Gilles à la place, mais merci pour la réponse quand même.
allrite
1

J'utilise PHP. Installez simplement la bibliothèque PHPExel depuis http://phpexcel.codeplex.com/ et vous aurez probablement aussi besoin de fonctions XML.

Voici mon code:

<?php

error_reporting(E_ALL);
date_default_timezone_set('Europe/London');

/** PHPExcel_IOFactory */

require_once '/home/markov/Downloads/1.7.6/Classes/PHPExcel/IOFactory.php';

$file="RIF394305.xlsx"; //PATH TO CSV FILE

// Check prerequisites

if (!file_exists($file)) {
    exit("Please run 06largescale.php first.\n");
}

$objReader = PHPExcel_IOFactory::createReader('Excel2003XML');

$objPHPExcel = $objReader->load($file);

$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'CSV');

$objWriter->save(str_replace('.xlsx', '.csv',$file));
?>

Vous pouvez annuler le processus ou utiliser un format Excel / CSV différent. Regardez les différents fichiers php dans le répertoire PHPExcel.

magilda
la source