web-dev-qa-db-fra.com

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

Je me rends compte que c'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 le convertir en un fichier texte (donc un .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 également une machine Mac, donc si une solution peut fonctionner, c'est bien aussi. :)

32
allrite

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

unoconv -f csv filename.xlsx

Pour des exigences plus complexes, vous pouvez analyser les fichiers XLSX avec Spreadsheet::XLSX en Perl ou openpyxl en 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

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.

9
Bohumir Zamecnik

J'utilise Perl's xls2csv pour convertir les fichiers xls en csv.

Je ne sais pas si cela fonctionne aussi avec xlsx.

À propos de:

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"
6
neurino

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.

1
magilda