Convertissez un file .xlsx (MS Excel) en .csv sur la command line avec des champs séparés par un point-virgule

Je réalise que ce n'est pas une question entièrement liée à unix / linux. Mais puisque c'est quelque chose que je vais faire sur Linux, j'espère que quelqu'un a une réponse.

J'ai un file 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, j'ai besoin de convertir cela en un file text (donc un .csv ) avec des colonnes séparées par un point-virgule. Il ne peut pas être séparé par des virgules car certaines colonnes contiennent des virgules. Est-ce possible de faire cette conversion à partir de shell? Open Office est installé et je peux le faire en utilisant son interface graphique, mais je veux savoir s'il est possible de le faire à partir de la command line. Merci!

PS: J'ai aussi un Mac, donc si une solution peut fonctionner là-bas, c'est bien aussi. 🙂

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

 unoconv -f csv filename.xlsx 

Pour des besoins plus complexes, vous pouvez parsingr les files XLSX avec Spreadsheet::XLSX en Perl ou openpyxl en Python. Par exemple, voici un script quickie pour imprimer une feuille de calcul en tant que file CSV séparé par un point-virgule (avertissement: non testé, tapé directement dans le browser):

 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 

J'utilise xls2csv de Perl pour convertir les files xls en csv .

Je ne sais pas si cela fonctionne avec xlsx aussi.

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" 

https://github.com/dilshod/xlsx2csv

Bien travaillé pour moi. Environ 85 Mo de file XLSX converti à environ 3 minutes sur un SSD Mac Book Pro.

J'utilise PHP. Il suffit d'installer la librairie PHPExel à partir de http://phpexcel.codeplex.com/ et vous avez probablement aussi besoin de fonctions XML.

C'est 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 prerequirejsites 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 process ou utiliser un format Excel / CSV différent. Regardez les différents files php dans le directory PHPExcel.