Converti un file .xlsx (MS Excel) in .csv sulla riga di comando con campi separati da punto e virgola


31

Mi rendo conto che questa non è una domanda interamente relativa a Unix / Linux. Ma poiché questo è qualcosa che farò su Linux, spero che qualcuno abbia una risposta.

Ho un file Excel online ( .xlsx) che viene aggiornato periodicamente (da qualcun altro). Voglio scrivere una sceneggiatura e inserirla come cronjob per elaborare quel foglio Excel. Ma per farlo, devo convertirlo in un file di testo (quindi a .csv) con colonne separate da punto e virgola. Purtroppo non può essere separato da virgola poiché alcune colonne contengono virgole. È possibile fare questa conversione dalla shell? Ho Open Office installato e posso farlo usando la sua GUI, ma voglio sapere se è possibile farlo dalla riga di comando. Grazie!

PS: Ho anche un computer Mac, quindi se qualche soluzione può funzionare lì, va bene lo stesso. :)

Risposte:


21

OpenOffice viene fornito con il programma unoconv per eseguire conversioni di formato sulla riga di comando.

unoconv -f csv filename.xlsx

Per requisiti più complessi, è possibile analizzare i file XLSX con Spreadsheet::XLSXin Perl o openpyxlin Python. Ad esempio, ecco uno script rapido per stampare un foglio di lavoro come file CSV separato da punto e virgola (avviso: non testato, digitato direttamente nel 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

unoconv non è venuto con il mio OO, ma l'ho installato e funziona benissimo (converte in file separato da virgola, non con punto e virgola)! Grazie! Dovrò ancora capire come otterrò i miei campi che contengono virgole. Ma grazie comunque.
allrite il

@allrite Oh, avevo perso il requisito dei punti e virgola come separatori. Il mio suggerimento di eseguire l'elaborazione in Python o Perl è ancora valido. Ma ho anche aggiunto uno script (non testato) da convertire in CSV ;come separatore.
Gilles 'SO- smetti di essere malvagio' il

Grazie! Ho usato Spreadsheet :: XLSX, ma ho usato il codice nel collegamento CPAN che hai fornito. Funziona :)
allrite il

1
Un utente anonimo ha avuto problemi con questo
Michael Mrozek

9

https://github.com/dilshod/xlsx2csv

Ha funzionato bene per me. Circa 85 MB di file XLSX convertiti in circa 3 minuti su un SSD Mac Book Pro.


1
Ha funzionato bene in OSX ha $ python xlsx2csv.py -d ";" my.xlsx my.csvfunzionato bene e capacità di definire il deliminatore, grazie +!
hhh,

6

Sto usando xls2csv di Perl per convertire i xlsfile in csv.

Non sono sicuro che se funziona xlsxanche con .

Di:

Purtroppo non può essere separato da virgola poiché alcune colonne contengono virgole

ecco perché è stata introdotta la citazione:

1,2,"data,data, more data"

grazie per la punta, ci proverò. Preferisco ancora il punto e virgola separato, poiché dopo la conversione CSV, il file passa attraverso gli awkscript. Ed è semplicemente più semplice passare il punto e virgola come separatore di campo awk. Potrei cercare virgole tra virgolette per sostituirle con qualcos'altro ... ora questa è un'altra domanda :)
allrite

Grazie @neurino. Ho usato invece il metodo Gilles, ma grazie comunque per la risposta.
Allrite il

1

Io uso PHP. Installa la libreria PHPExel da http://phpexcel.codeplex.com/ e probabilmente avrai bisogno anche delle funzioni XML.

Questo è il mio codice:

<?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));
?>

È possibile ripristinare il processo o utilizzare un formato Excel / CSV diverso. Guarda i diversi file php nella directory PHPExcel.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.