Konwertuj plik .xlsx (MS Excel) do .csv w wierszu polecenia z polami oddzielonymi średnikami

31

Zdaję sobie sprawę, że nie jest to pytanie całkowicie związane z Uniksem / Linuksem. Ale ponieważ jest to coś, co zrobię na Linuksie, mam nadzieję, że ktoś ma odpowiedź.

Mam plik Excel ( .xlsx), który jest okresowo aktualizowany (przez kogoś innego). Chcę napisać skrypt i umieścić go jako cronjob w celu przetworzenia tego arkusza programu Excel. Ale żeby to zrobić, muszę przekonwertować to na plik tekstowy (więc a .csv) z kolumnami oddzielonymi średnikami. Niestety nie można go oddzielić przecinkami, ponieważ niektóre kolumny zawierają przecinki. Czy w ogóle można wykonać tę konwersję z powłoki? Mam zainstalowany pakiet Open Office i mogę to zrobić za pomocą GUI, ale chcę wiedzieć, czy można to zrobić z wiersza polecenia. Dzięki!

PS: Mam również komputer Mac, więc jeśli jakieś rozwiązanie może tam działać, to też dobrze. :)

allrite
źródło

Odpowiedzi:

21

OpenOffice jest dostarczany z programem unoconv do wykonywania konwersji formatu w wierszu poleceń.

unoconv -f csv filename.xlsx

W przypadku bardziej złożonych wymagań można analizować pliki XLSX Spreadsheet::XLSXw Perlu lub openpyxlw Pythonie. Na przykład, tutaj jest szybki skrypt do wydrukowania arkusza roboczego jako plik CSV oddzielony średnikami (ostrzeżenie: nieprzetestowane, wpisane bezpośrednio w przeglądarce):

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- przestań być zły”
źródło
unoconv nie przyszedł z moim OO, ale zainstalowałem go i działa świetnie (konwertuje do pliku oddzielonego przecinkami, ale nie średnikiem)! Dzięki! Nadal będę musiał dowiedzieć się, w jaki sposób otrzymam moje pola zawierające przecinki. Ale i tak dzięki.
allrite
@allrite Och, przegapiłem wymóg średników jako separatorów. Moja sugestia dotycząca przetwarzania w języku Python lub Perl nadal obowiązuje. Ale dodałem również skrypt (niesprawdzony) do konwersji na CSV ;jako separator.
Gilles „SO- przestań być zły”
Dzięki! Użyłem Arkusza kalkulacyjnego :: XLSX, ale użyłem kodu w podanym linku CPAN. Działa :)
allrite,
1
Anonimowy użytkownik miał z tym problemy
Michael Mrozek
9

https://github.com/dilshod/xlsx2csv

Działa dobrze dla mnie. Około 85 MB pliku XLSX przekonwertowanego po około 3 minutach na dysku Mac Book Pro SSD.

Bohumir Zamecnik
źródło
1
Działa dobrze w OSX $ python xlsx2csv.py -d ";" my.xlsx my.csvdziałało dobrze i możliwość zdefiniowania ogranicznika, dziękuję +!
hhh
6

Używam xls2csv Perla do konwersji xlsplików csv.

Nie jestem pewien, czy to też działa xlsx.

O:

Niestety nie można go oddzielić przecinkami, ponieważ niektóre kolumny zawierają przecinki

dlatego wprowadzono cytowanie:

1,2,"data,data, more data"
neurino
źródło
dzięki za wskazówkę, spróbuję tego. Nadal wolę separację średnikami, ponieważ po konwersji csv plik przechodzi przez awkskrypty. A po prostu łatwiej jest przekazać średnik jako separator pola awk. Mógłbym szukać przecinków w cudzysłowie, aby zastąpić je czymś innym ... teraz to kolejne pytanie :)
allrite
Dzięki @neurino. Zamiast tego użyłem metody Gillesa, ale i tak dziękuję za odpowiedź.
allrite
1

Używam PHP. Wystarczy zainstalować bibliotekę PHPExel ze strony http://phpexcel.codeplex.com/ i prawdopodobnie potrzebujesz również funkcji XML.

To jest mój kod:

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

Możesz cofnąć proces lub użyć innego formatu Excel / CSV. Spójrz na różne pliki php w katalogu PHPExcel.

magilda
źródło