Komut satırı ile Linux'ta xlsx'i csv'ye dönüştürme


266

Linux'ta xlsx dosyalarını csv dosyalarına dönüştürmenin bir yolunu arıyorum.

Ben birkaç milyonlarca satır işleme bakıyorum beri PHP / Perl ya da böyle bir şey kullanmak istemiyorum, bu yüzden hızlı bir şey gerekir. Ubuntu depolarında xls2csv adlı bir program buldum, ancak yalnızca xls (Office 2003) dosyalarını (şu anda kullanıyorum) dönüştürecek, ancak daha yeni Excel dosyaları için desteğe ihtiyacım var.

Herhangi bir fikir?


10
Bir betik dili ile uygulanan herhangi bir şeyin doğası gereği yavaş olacağını düşünmek ... biraz yanlış yönlendirilmiş gibi görünüyor, çünkü özellikle bu dillerdeki ilginç kütüphaneler C'de arka uçlar yazma eğiliminde.
Charles Duffy

2
Excel eskiden 65536 satırla sınırlıydı. Şimdi 1.048.576 ( support.microsoft.com/kb/120596 ). içine "milyonlarca çizgiyi aşmak" zor olacak. sadece
diyorlar

1
@Pavel birkaç dosya üzerinde olabilir.
Charles Duffy

2
... kişisel olarak, bunu Python için xlsv kütüphanesini kullanarak yapardım, ama script tabanlı yaklaşımlar söz konusu değil ... shrug . (Programlı araçların cevabı hariç tutulursa bir programlama sorusu nedir?)
Charles Duffy

1
@CharlesDuffy Şu anda bunu yapmak için bir PHP kütüphanesi kullanıyorum ve xls2csv 1 saniye süren, php yapmak 10 dakika sürüyor. Kelimenin tam anlamıyla.
user1390150

Yanıtlar:


239

Gnumeric tablo uygulaması olarak adlandırılan bir komut satırı programı ile geliyor ssconvert tablo çeşitli biçimlerde arasında dönüştürebilirsiniz:

$ 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

Ubuntu'ya kurmak için:

apt-get install gnumeric

Mac'e yüklemek için:

brew install gnumeric

19
Elektronik tabloları dönüştürmek için en sorunsuz yöntem. Bir bash betiği ile birlikte, birden fazla dosyayı toplu olarak işlemenizi sağlar. for f in *.csv; do ssconvert "$f" "${f%.csv}.xlsx"; doneLibreOffice yöntemi muhtemelen diğer formatları işleyebilir, ancak çalışmasını sağlayamadım ( --headlessargümanla bile her seferinde boş bir dosya açacaktı ).
sleblanc

6
@sebleblanc Çok sorunsuz değil. Yükleme, bağımlılık sayısı göz önüne alındığında bir acıdır (bunu başsız bir sunucuda yapıyorsanız). Şimdiye kadar gcc, intltool, zlib-devel, GTK ... GTK için glib, atk, pango, cairo, cairo-object, gdk-pixbuf-2.0 ...
andrewtweber

11
Başsız bir debian sunucuya kurmayı başardım apt-get install gnumeric --no-install-recommends. Tek dezavantajı çok fazla uyarı vermesidir GConf-WARNING **: İstemci çalışırken D-BUS arka plan programına bağlanamadı . Basit bir ssconvert oldfile.xlsx newfile.csv > /dev/null 2>&1hile yapacak.
Benjamin Delichere

7
CSV'ye yazmak için -Sbayrağın birden çok sayfa yazmasını isteyebilirsiniz . Her biri kendi dosyasına gider.
Ed Avis

5
@hhh Ayırıcı seçeneği yalnızca txt dışa aktarma türüyle çalışır. Sen Stdout'a yazdırmak için kullanabilir: ssconvert -O "separator=;" -T Gnumeric_stf:stf_assistant file.xlsx fd://1.
exic

135

Bunu LibreOffice ile yapabilirsiniz:

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

Bana açık olmayan nedenlerle, bunu sudo ile çalıştırmanız gerekebilir. Bu satırı sudoers dosyasına ekleyerek LibreOffice'in bir şifre gerektirmeden sudo ile çalışmasını sağlayabilirsiniz:

users ALL=(ALL) NOPASSWD: libreoffice

35
libreoffice'e ikinci sayfayı istediğimi nasıl söyleyebilirim?
dmeu

30
Sudo'nun şifresiz herkes için libreoffice'e izin vermesi bir kutu solucan açıyor. Lütfen çok kullanıcılı bir platformda kök izinleri alma olanağı da dahil olmak üzere sonuçlara dikkat edin
Interarticle

5
bu benim için çalıştı (sudo gerekli değildir). Sürümüm: libreoffice-calc-3.6.7.2-4.fc18.x86_64
Brad Hein

5
/Applications/LibreOffice.app/Contents/MacOS/soffice --headless --convert-to csv $filenamebenim için OS X üzerinde çalıştı.
Nobu

12
Ascii olmayan karakterleri koruyarak utf-8'e dönüştürmek için kullanın --convert-to "csv:Text - txt - csv (StarCalc):44,34,76,1,1/1". Ayrıntılar için açık ofis wiki'sine bakın.
Aryeh Leib Taurog

132

Zaten bir Masaüstü ortamınız varsa, eminim Gnumeric / LibreOffice iyi çalışır, ancak başsız bir sunucuda (Amazon Web Services gibi), onlar da yüklemeniz gereken onlarca bağımlılık gerektirir.

Bu Python alternatifini buldum:

https://github.com/dilshod/xlsx2csv

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

Kurulumu 2 saniye sürdü ve bir cazibe gibi çalışıyor.

Birden fazla sayfanız varsa tümünü bir kerede veya bir kerede bir dışa aktarabilirsiniz:

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

Ayrıca Bash, Python, Ruby ve Java'da oluşturulmuş çeşitli alternatiflere de bağlantı veriyor.


Harika çalışıyor, ama sadece 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') olarak çalıştırabilirim . Şimdi düşünüyorum, aynı hatayı aldım csvkit.
user2105469

2
.... Benim için harika çalışıyordu ve -s seçeneğini kullanarak her bir sayfanın tek tek dosyalara çıkarılmasına izin veriyordu - burada libreoffice sayfanın boyutunu işleyemedi, xlsx2csv hiçbir problem yaşamadı
Soren

Teşekkürler! Ubuntu'da çok uygun.
zhuguowei

5
Debian ve Ubuntu'da xlsx2csvpaket var, bu yüzden manuel olarak yüklemenize gerek yok, easy_installancak paket yöneticinizi kullanabilirsiniz.
josch

sudo easy_install xlsx2csv
MacOS'ta

32

Bash'da, geçerli dizindeki tüm xlsx dosyalarımı dönüştürmek için bu libreoffice komutunu kullandım:

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

Dosya adındaki boşluklarla ilgilenir.

Birkaç yıl sonra tekrar denedim ve işe yaramadı. Bu iş parçacığı bazı ipuçları verir, ancak en hızlı çözüm root (veya a sudo libreoffice) çalıştırmaktı . Zarif değil ama hızlı.

Windows'da scalc.exe komutunu kullanma


13
Bunu denemeden önce tüm openoffice pencerelerini kapattığınızdan emin olun, aksi takdirde sessizce başarısız olur.
tacone

Ayrıca, Windows'da, komut scalc.exeyerine libreoffice. Bugün benim için mevcut kararlı LO sürümü üzerinde çalıştı.
AronVanAmmers


8

Başka bir seçenek de R'yi küçük bir bash sarıcısıyla rahatlık sağlamak için kullanmak olacaktır:

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

8

Eğer .xlsxdosya fazla sayfa var -sbayrak istediğiniz sayfayı almak için kullanılabilir. Örneğin:

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

second_sheet.csviçindeki 2. sayfanın verilerini içerir my_file.xlsx.


5

Ssconvert adlı bir komut satırı yardımcı programının gerçekten çok basit olduğu Gnumeric elektronik tablo uygulamasını kullanmak :

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

ve işiniz bitti!


Çok faydalı ve teşekkürler Mr.Pascal-Louis Perez
Karthickkumar Nagaraj

1
Komutun üstünde 'ssconvert' sadece 65536 satır dönüştürüyor ancak birden fazla satırım yok, Bana yardım edebilir misiniz?
Karthickkumar Nagaraj

4

Java komut satırını çalıştırmakta sorun yoksa, Apache POI HSSF'nin Excel Extractor ile yapabilirsiniz . It has bir mainkomut satırı çıkarıcı olmaya diyor yöntemini . Bu sadece her şeyi boşaltmış gibi görünüyor. Onlar için işaret dönüştürür o CSV bu örnekte . Çalıştırmadan önce derlemeniz gerekir, ancak bunun da bir mainyöntemi vardır, bu yüzden çalışmasını sağlamak için çok fazla kodlama yapmanız gerekmez.

Uçabilecek ancak diğer tarafta biraz çalışma gerektirecek başka bir seçenek, Excel dosyalarınızın size bu günleri formatlayan MS'nin aradığı Excel XML Verileri veya XML Elektronik Tablosu olarak gelmesini sağlamaktır . Dilimlemeniz ve dilediğiniz gibi zar atmanız için yepyeni bir fırsat dünyası açacak.


1
Bunun .xlsx'i de destekleyip desteklemediğini biliyor musunuz?
dimroc

1

Diğerlerinin söylediği gibi, libreofficexls dosyalarını csv'ye dönüştürebilir. Benim için sorun sac seçimi oldu.

Bu libreoffice Python betiği , tek bir sayfayı CSV'ye dönüştürme konusunda iyi bir iş çıkarır.

Kullanımı:

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

Sadece olumsuz (benim ucumda) --headlessçalışmak gibi görünmüyor. Ben bir saniye için geliyor ve sonra çıkar bir lo pencere var.
Benimle sorun yok, işi hızla yapan tek araç bu.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.