Konwertuj xlsx na csv w systemie Linux za pomocą wiersza polecenia

266

Szukam sposobu na konwersję plików xlsx do plików csv w systemie Linux.

Nie chcę używać PHP / Perla ani niczego podobnego, ponieważ patrzę na przetwarzanie kilku milionów linii, więc potrzebuję czegoś szybkiego. Znalazłem program w repozytoriach Ubuntu o nazwie xls2csv, ale będzie on konwertować tylko pliki xls (Office 2003) (z których obecnie korzystam), ale potrzebuję wsparcia dla nowszych plików Excel.

Jakieś pomysły?

użytkownik1390150
źródło
10
Myślenie, że cokolwiek zaimplementowane w języku skryptowym będzie z natury powolne, wydaje się ... trochę mylące, szczególnie, że interesujące biblioteki w tych językach mają zwykle napisy napisane w C.
Charles Duffy
2
Excel był ograniczony do 65536 wierszy. Teraz jest to 1 048 576 ( support.microsoft.com/kb/120596 ). ciężko będzie w nim zmieścić „przeciąć miliony linii”. tylko mówię ...
Pavel Veller
1
@Pavel może mieć więcej niż kilka plików.
Charles Duffy
2
... osobiście zrobiłbym to przy użyciu biblioteki xlsv dla Pythona, ale ponieważ podejścia oparte na skryptach są opisane jako wykluczone ... wzruszają ramionami . (Jak to jest pytanie programistyczne, jeśli narzędzia programistyczne są wykluczone z odpowiedzi?)
Charles Duffy
1
@CharlesDuffy Obecnie używam do tego biblioteki PHP, a to, co zajmuje xls2csv 1 sekunda, zajmuje php 10 minut. Dosłownie
user1390150

Odpowiedzi:

239

Aplikacja arkusza kalkulacyjnego Gnumeric jest dostarczana z narzędziem wiersza polecenia o nazwie ssconvert, które może konwertować różne formaty arkuszy kalkulacyjnych:

$ ssconvert Book1.xlsx newfile.csv
Using exporter Gnumeric_stf:stf_csv

$ cat newfile.csv 
Foo,Bar,Baz
1,2,3
123.6,7.89,
2012/05/14,,
The,last,Line

Aby zainstalować na Ubuntu:

apt-get install gnumeric

Aby zainstalować na komputerze Mac:

brew install gnumeric
jmcnamara
źródło
19
Naprawdę najbardziej bezproblemowa metoda konwersji arkuszy kalkulacyjnych. W połączeniu ze skryptem bash pozwala na wsadowe przetwarzanie wielu plików. for f in *.csv; do ssconvert "$f" "${f%.csv}.xlsx"; doneMetoda LibreOffice prawdopodobnie mogłaby przetwarzać inne formaty, ale nie mogłem sprawić, by działała (po prostu otwierałby pusty plik za każdym razem, nawet z --headlessargumentem).
sleblanc
6
@sebleblanc Niezupełnie bezproblemowo. Instalacja jest uciążliwa, biorąc pod uwagę liczbę zależności (jeśli robisz to na bezgłowym serwerze). Do tej pory gcc, intltool, zlib-devel, GTK ... GTK wymaga glib, atk, pango, cairo, cairo-object, gdk-pixbuf-2.0 ...
andrewtweber
11
Udało mi się zainstalować go na bezgłowym serwerze debian z apt-get install gnumeric --no-install-recommends. Jedyną wadą jest to, że wywołuje wiele ostrzeżeń. GConf-WARNING **: Klient nie mógł połączyć się z demonem D-BUS podczas działania. Prosty ssconvert oldfile.xlsx newfile.csv > /dev/null 2>&1załatwi sprawę.
Benjamin Delichere
7
Aby pisać do csv, możesz chcieć, aby -Sflaga zapisała wiele arkuszy. Każdy idzie do własnego pliku.
Ed Avis,
5
@ hhh Opcja separatora działa tylko z typem eksportu txt. Można to wykorzystać, aby drukować na stdout: ssconvert -O "separator=;" -T Gnumeric_stf:stf_assistant file.xlsx fd://1.
exic
135

Możesz to zrobić za pomocą LibreOffice:

libreoffice --headless --convert-to csv $filename --outdir $outdir

Z powodów, które nie są dla mnie jasne, być może będziesz musiał uruchomić to z sudo. Możesz ustawić LibreOffice na pracę z sudo bez konieczności podawania hasła, dodając ten wiersz do pliku sudoers:

users ALL=(ALL) NOPASSWD: libreoffice
spiffytech
źródło
35
jak mam powiedzieć libreoffice, że chcę drugi arkusz?
dmeu
30
Zezwolenie sudo na libreoffice dla wszystkich bez hasła otwiera puszkę robaków. Uważaj na konsekwencje, w tym możliwość uzyskania uprawnień roota na platformie dla wielu użytkowników
Interarticle
5
to zadziałało dla mnie (sudo nie jest wymagane). Moja wersja: libreoffice-calc-3.6.7.2-4.fc18.x86_64
Brad Hein
5
/Applications/LibreOffice.app/Contents/MacOS/soffice --headless --convert-to csv $filenamepracował dla mnie na OS X.
Nobu,
12
Aby przekonwertować na utf-8, zachowując znaki inne niż ascii, użyj zamiast tego --convert-to "csv:Text - txt - csv (StarCalc):44,34,76,1,1/1". Aby uzyskać szczegółowe informacje, zobacz wiki open office .
Aryeh Leib Taurog
132

Jeśli masz już środowisko Desktop, to jestem pewien, że Gnumeric / LibreOffice działałoby dobrze, ale na bezgłowym serwerze (takim jak Amazon Web Services) wymagają one dziesiątek zależności, które również musisz zainstalować.

Znalazłem tę alternatywę dla Pythona:

https://github.com/dilshod/xlsx2csv

$ easy_install xlsx2csv
$ xlsx2csv file.xlsx > newfile.csv

Instalacja zajęła 2 sekundy i działa jak urok.

Jeśli masz wiele arkuszy, możesz je eksportować jednocześnie lub pojedynczo:

$ xlsx2csv file.xlsx --all > all.csv
$ xlsx2csv file.xlsx --all -p '' > all-no-delimiter.csv
$ xlsx2csv file.xlsx -s 1 > sheet1.csv

Odsyła także do kilku alternatyw wbudowanych w Bash, Python, Ruby i Java.

andrewtweber
źródło
Działa świetnie, ale mogę uruchomić tylko jako sudo ( IOError: [Errno 13] Permission denied: '/usr/local/lib/python2.7/dist-packages/prettytable-0.7.2-py2.7.egg/EGG-INFO/top_level.txt'). Teraz, gdy o tym myślę, mam ten sam błąd csvkit.
user2105469
2
.... Działa świetnie dla mnie i pozwalając na ekstrakcję każdego arkusza do pojedynczych plików za pomocą opcji -s - gdzie libreoffice nie był w stanie obsłużyć rozmiaru arkusza, xlsx2csv nie miał problemów
Soren
Dzięki! Bardzo wygodny w Ubuntu.
zhuguowei
5
W Debianie i Ubuntu jest xlsx2csvpakiet, więc nie trzeba go ręcznie instalować, easy_installale można użyć menedżera pakietów.
josch
W systemie MacOS potrzebujeszsudo easy_install xlsx2csv
Franka Hintscha
32

W bash użyłem tej komendy libreoffice do konwersji wszystkich moich plików xlsx w bieżącym katalogu:

for i   in *.xlsx; do  libreoffice --headless --convert-to csv "$i" ; done

Dba o spacje w nazwie pliku.

Próbowałem jeszcze kilka lat później i to nie zadziałało. Ten wątek zawiera kilka wskazówek, ale najszybszym rozwiązaniem było uruchomienie jako root (lub uruchomienie a sudo libreoffice). Nie elegancki, ale szybki.

Użyj polecenia scalc.exe w systemie Windows

Neves
źródło
13
Upewnij się, że zamknąłeś wszystkie okna openoffice, zanim spróbujesz tego zrobić, ponieważ w przeciwnym razie po cichu zawiedzie.
tacone
Również w systemie Windows polecenie jest scalc.exeraczej niż libreoffice. Pracowałem dla mnie dzisiaj nad bieżącą stabilną wersją LO.
AronVanAmmers
31

Użyj csvkit

in2csv data.xlsx > data.csv

Aby uzyskać szczegółowe informacje, sprawdź ich doskonałe dokumenty

Holger Brandl
źródło
8

Inną opcją byłoby użycie R za pomocą małego opakowania bash dla wygody:

xlsx2txt(){
echo '
require(xlsx)
write.table(read.xlsx2(commandArgs(TRUE)[1], 1), stdout(), quote=F, row.names=FALSE, col.names=T, sep="\t")
' | Rscript --vanilla - $1 2>/dev/null
}

xlsx2txt file.xlsx > file.txt
Holger Brandl
źródło
8

Jeśli .xlsxplik ma wiele arkuszy, -smożna użyć flagi, aby uzyskać żądany arkusz. Na przykład:

xlsx2csv "my_file.xlsx" -s 2 second_sheet.csv

second_sheet.csvzawierałby dane z drugiego arkusza w my_file.xlsx.

Akavall
źródło
5

Korzystanie z aplikacji arkusza kalkulacyjnego Gnumeric , która pochodzi z narzędzia wiersza polecenia o nazwie ssconvert, jest naprawdę bardzo proste:

find . -name '*.xlsx' -exec ssconvert -T Gnumeric_stf:stf_csv {} \;

i jesteś skończony!

Pascal-Louis Perez
źródło
Bardzo przydatny i dziękuję Mr.Pascal-Louis Perez
Karthickkumar Nagaraj
1
Powyższe polecenie „ssconvert” konwertuje tylko 65536 linii, ale mam więcej niż jedną linię, czy możesz mi pomóc?
Karthickkumar Nagaraj
4

Jeśli możesz uruchomić wiersz poleceń Java, możesz to zrobić za pomocą programu Extractor Excel HSSF Apache POI . Ma to mainmetoda, która mówi za wyciąg z linii poleceń . Ten wydaje się po prostu zrzucić wszystko. Wskazują na ten przykład, który konwertuje na CSV . Będziesz musiał go skompilować, zanim będziesz mógł go uruchomić, ale ma też mainmetodę, więc nie powinieneś robić dużo kodowania, aby działał.

Inną opcją, która może latać, ale będzie wymagać trochę pracy z drugiej strony, jest sprawienie, aby twoje pliki Excela przychodziły do ​​ciebie jako Excel XML Data lub XML Spreadsheet wszelkich wywołań MS, które formatują te dni. Otworzy przed Tobą zupełnie nowy świat możliwości krojenia i kostkowania w dowolny sposób.

Pavel Veller
źródło
1
Czy wiesz, czy obsługuje to również .xlsx?
dimroc
1

Jak powiedzieli inni, libreofficemożna konwertować pliki xls do csv. Problemem był dla mnie wybór arkusza.

Ten skrypt Python libreoffice wykonuje dobrą robotę przy konwersji pojedynczego arkusza do CSV.

Zastosowanie to:

./libreconverter.py File.xls:"Sheet Name" output.csv

Jedynym minusem (z mojej strony) jest to, że --headlessnie działa. Mam okno LO, które pojawia się na sekundę, a następnie wychodzi.
Nie przeszkadza mi to, to jedyne narzędzie, które wykonuje tę pracę szybko.

Benoit Duffez
źródło