Konvertieren Sie eine XLSX-Datei (MS Excel) in der Befehlszeile mit durch Semikolon getrennten Feldern in eine CSV-Datei

31

Mir ist klar, dass dies keine rein auf Unix / Linux bezogene Frage ist. Aber da dies etwas ist, was ich unter Linux machen werde, hoffe ich, dass jemand eine Antwort hat.

Ich habe eine Online-Excel-Datei ( .xlsx), die regelmäßig aktualisiert wird (von jemand anderem). Ich möchte ein Skript schreiben und es als Cronjob einfügen, um dieses Excel-Sheet zu verarbeiten. Aber um das zu tun, muss ich das in eine Textdatei (so a .csv) mit durch Semikolon getrennten Spalten konvertieren . Es kann leider nicht durch Kommas getrennt werden, da einige Spalten Kommas enthalten. Ist es überhaupt möglich, diese Konvertierung von der Shell aus durchzuführen? Ich habe Open Office installiert und kann dies über die Benutzeroberfläche tun, möchte aber wissen, ob dies über die Befehlszeile möglich ist. Vielen Dank!

PS: Ich habe auch einen Mac. Wenn also dort eine Lösung funktioniert, ist das auch gut so. :)

allrite
quelle

Antworten:

21

OpenOffice wird mit dem Programm unoconv geliefert, mit dem Formatkonvertierungen in der Befehlszeile durchgeführt werden können.

unoconv -f csv filename.xlsx

Für komplexere Anforderungen können Sie XLSX-Dateien Spreadsheet::XLSXin Perl oder openpyxlPython analysieren . Beispiel: Hier ist ein Quickie-Skript zum Ausdrucken eines Arbeitsblatts als durch Semikolons getrennte CSV-Datei (Warnung: ungetestet, direkt im Browser eingegeben):

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 'SO - hör auf böse zu sein'
quelle
unoconv kam nicht mit meinem OO, aber ich habe es installiert und es funktioniert großartig (konvertiert in eine durch Kommas getrennte Datei, aber kein Semikolon)! Vielen Dank! Ich muss noch herausfinden, wie ich meine Felder bekomme, die Kommas enthalten. Aber trotzdem danke.
Allrite
@allrite Oh, ich habe die Anforderung von Semikolons als Trennzeichen übersehen. Mein Vorschlag, die Verarbeitung in Python oder Perl durchzuführen, bleibt bestehen. Ich habe aber auch ein Skript (ungetestet) hinzugefügt, das ;als Trennzeichen in CSV konvertiert werden soll .
Gilles 'SO- hör auf böse zu sein'
Vielen Dank! Ich habe Spreadsheet :: XLSX verwendet, aber den Code in dem von Ihnen angegebenen CPAN-Link verwendet. Es funktioniert :)
allrite
1
Ein anonymer Benutzer hatte Probleme damit
Michael Mrozek
9

https://github.com/dilshod/xlsx2csv

Hat bei mir gut funktioniert. Ca. 85 MB XLSX-Datei, konvertiert in ca. 3 Minuten auf einer Mac Book Pro-SSD.

Bohumir Zamecnik
quelle
1
Gut $ python xlsx2csv.py -d ";" my.xlsx my.csvfunktioniert in OSX hat gut funktioniert und die Fähigkeit, das Trennzeichen zu definieren, danke +!
hhh
6

Ich verwende Perls xls2csv , um xlsDateien in zu konvertieren csv.

Ich bin mir nicht sicher, ob es auch funktioniert xlsx.

Über:

Es kann leider nicht durch Kommas getrennt werden, da einige Spalten Kommas enthalten

Deshalb wurde das Zitieren eingeführt:

1,2,"data,data, more data"
Neurino
quelle
danke für den tipp, das werde ich mal probieren. Ich bevorzuge immer noch das durch Semikolons getrennte Format, da die Datei nach der CSV-Konvertierung awkSkripte durchläuft . Und es ist einfacher, ein Semikolon als Feldtrennzeichen einzugeben awk. Ich könnte nach Kommas in Anführungszeichen suchen, um sie durch etwas anderes zu ersetzen ... das ist jetzt eine andere Frage :)
allrite
Danke @neurino. Ich habe stattdessen die Gilles-Methode verwendet, aber trotzdem danke für die Antwort.
allrite
1

Ich benutze PHP. Installieren Sie einfach die PHPExel-Bibliothek von http://phpexcel.codeplex.com/ und wahrscheinlich benötigen Sie auch XML-Funktionen.

Das ist mein 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));
?>

Sie können den Vorgang rückgängig machen oder ein anderes Excel / CSV-Format verwenden. Schauen Sie sich die verschiedenen PHP-Dateien im PHPExcel-Verzeichnis an.

Magilda
quelle