Konversikan xlsx ke csv di Linux dengan baris perintah

266

Saya mencari cara untuk mengkonversi file xlsx ke file csv di Linux.

Saya tidak ingin menggunakan PHP / Perl atau sesuatu seperti itu karena saya sedang mencari pemrosesan jutaan baris, jadi saya perlu sesuatu yang cepat. Saya menemukan sebuah program di repo Ubuntu yang disebut xls2csv tetapi hanya akan mengonversi file xls (Office 2003) (yang saat ini saya gunakan) tetapi saya memerlukan dukungan untuk file Excel yang lebih baru.

Ada ide?

pengguna1390150
sumber
10
Berpikir bahwa apa pun yang diimplementasikan dengan bahasa scripting akan lambat secara alami tampaknya ... agak salah arah, terutama karena perpustakaan yang menarik dalam bahasa tersebut cenderung memiliki backend yang ditulis dalam C.
Charles Duffy
2
Excel dulu dibatasi hingga 65536 baris. Sekarang 1.048.576 ( support.microsoft.com/kb/120596 ). itu akan sulit untuk masuk "putuskan jutaan baris" di dalamnya. hanya mengatakan ...
Pavel Veller
1
@Pavel dapat berupa beberapa file.
Charles Duffy
2
... secara pribadi, saya akan melakukan ini menggunakan pustaka xlsv untuk Python, tetapi karena pendekatan berbasis skrip dijelaskan sebagai keluar dari pertanyaan ... angkat bahu . (Bagaimana ini pertanyaan pemrograman jika alat-alat pemrograman dikecualikan dari jawabannya?)
Charles Duffy
1
@CharlesDuffy Saat ini saya menggunakan perpustakaan PHP untuk melakukan ini, dan apa yang dilakukan xls2csv 1 detik untuk dilakukan, membutuhkan php 10 menit untuk melakukannya. Secara harfiah.
user1390150

Jawaban:

239

The Gnumeric aplikasi spreadsheet hadir dengan utilitas baris perintah yang disebut ssconvert yang dapat mengkonversi antara berbagai format spreadsheet:

$ 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

Untuk menginstal di Ubuntu:

apt-get install gnumeric

Untuk menginstal di Mac:

brew install gnumeric
jmcnamara
sumber
19
Sungguh metode yang paling mudah untuk mengonversi spreadsheet. Dikombinasikan dengan skrip bash, ini akan memungkinkan Anda untuk memproses banyak file sekaligus. for f in *.csv; do ssconvert "$f" "${f%.csv}.xlsx"; doneMetode LibreOffice mungkin dapat memproses format lain, tapi saya tidak bisa membuatnya bekerja (itu hanya akan membuka file kosong setiap kali, bahkan dengan --headlessargumen).
sleblanc
6
@sebleblanc Tidak cukup mudah. Instalasi ini merepotkan mengingat banyaknya dependensi (jika Anda melakukan ini pada server tanpa kepala). Sejauh ini gcc, intltool, zlib-devel, GTK ... GTK membutuhkan glib, atk, pango, cairo, objek cairo, gdk-pixbuf-2.0 ...
andrewtweber
11
Saya berhasil menginstalnya di server debian tanpa kepala dengan apt-get install gnumeric --no-install-recommends. Satu-satunya kelemahan adalah ia mengeluarkan banyak peringatan GConf-WARNING **: Klien gagal terhubung ke daemon D-BUS saat menjalankan. Sederhana ssconvert oldfile.xlsx newfile.csv > /dev/null 2>&1akan melakukan triknya.
Benjamin Delichere
7
Untuk menulis ke csv, Anda mungkin ingin -Sflag untuk menulis beberapa lembar. Masing-masing pergi ke file sendiri.
Ed Avis
5
@ hhh Opsi pemisah hanya berfungsi dengan jenis ekspor txt. Anda dapat menggunakan ini untuk mencetak ke stdout: ssconvert -O "separator=;" -T Gnumeric_stf:stf_assistant file.xlsx fd://1.
exic
135

Anda dapat melakukan ini dengan LibreOffice:

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

Untuk alasan yang tidak jelas bagi saya, Anda mungkin perlu menjalankan ini dengan sudo. Anda dapat membuat LibreOffice berfungsi dengan sudo tanpa memerlukan kata sandi dengan menambahkan baris ini ke file sudoers Anda:

users ALL=(ALL) NOPASSWD: libreoffice
spiffytech
sumber
35
bagaimana saya memberi tahu libreoffice bahwa saya ingin lembar kedua?
dmeu
30
Mengizinkan sudo ke libreoffice untuk semua orang tanpa kata sandi membuka sekaleng cacing. Waspadalah terhadap konsekuensinya, termasuk kemungkinan untuk mendapatkan izin root pada platform multi-pengguna
Interarticle
5
ini bekerja untuk saya (sudo tidak diperlukan). Versi saya: libreoffice-calc-3.6.7.2-4.fc18.x86_64
Brad Hein
5
/Applications/LibreOffice.app/Contents/MacOS/soffice --headless --convert-to csv $filenamebekerja pada OS X untuk saya.
Nobu
12
Untuk mengonversi ke utf-8, mempertahankan karakter non-ascii, gunakan saja --convert-to "csv:Text - txt - csv (StarCalc):44,34,76,1,1/1". Lihat wiki kantor terbuka untuk detailnya.
Aryeh Leib Taurog
132

Jika Anda sudah memiliki lingkungan Desktop maka saya yakin Gnumeric / LibreOffice akan bekerja dengan baik, tetapi pada server tanpa kepala (seperti Amazon Web Services), mereka memerlukan banyak dependensi yang juga harus Anda instal.

Saya menemukan alternatif Python ini:

https://github.com/dilshod/xlsx2csv

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

Butuh 2 detik untuk menginstal dan bekerja seperti pesona.

Jika Anda memiliki beberapa lembar, Anda dapat mengekspor sekaligus, atau satu per satu:

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

Ia juga menautkan ke beberapa alternatif yang dibangun di Bash, Python, Ruby, dan Java.

andrewtweber
sumber
Berfungsi bagus, tapi saya bisa menjalankan hanya sebagai 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'). Sekarang saya berpikir tentang itu, saya mendapat kesalahan yang sama csvkit.
user2105469
2
.... Berfungsi bagus untuk saya dan memungkinkan ekstraksi setiap lembar ke file individual menggunakan opsi -s - di mana libreoffice tidak dapat menangani ukuran lembar, xlsx2csv tidak memiliki masalah
Soren
Terima kasih! Sangat nyaman di ubuntu.
zhuguowei
5
Di Debian dan Ubuntu ada xlsx2csvpaketnya, jadi Anda tidak perlu menginstalnya secara manual easy_installtetapi bisa menggunakan manajer paket Anda.
josch
Pada MacOS Anda membutuhkansudo easy_install xlsx2csv
Frank Hintsch
32

Dalam bash, saya menggunakan perintah libreoffice ini untuk mengonversi semua file xlsx saya di direktori saat ini:

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

Ini menangani spasi dalam nama file.

Mencoba lagi beberapa tahun kemudian, dan itu tidak berhasil. Utas ini memberikan beberapa kiat, tetapi solusi tercepat adalah berjalan sebagai root (atau menjalankan asudo libreoffice ). Tidak elegan, tapi cepat.

Gunakan perintah scalc.exe di Windows

neves
sumber
13
Pastikan Anda menutup semua jendela kantor sebelum mencoba, karena ini akan gagal jika tidak.
tacone
Juga, pada Windows, perintahnya scalc.exebukan libreoffice. Bekerja untuk saya hari ini di versi LO stabil saat ini.
AronVanAmmers
31

Gunakan csvkit

in2csv data.xlsx > data.csv

Untuk detail, periksa dokumen luar biasa mereka

Holger Brandl
sumber
8

Opsi lain adalah menggunakan R melalui bungkus bash kecil untuk kenyamanan:

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
sumber
8

Jika .xlsxfile memiliki banyak sheet, -sflag dapat digunakan untuk mendapatkan sheet yang Anda inginkan. Sebagai contoh:

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

second_sheet.csvakan berisi data lembar ke-2 di my_file.xlsx.

Akavall
sumber
5

Menggunakan aplikasi spreadsheet Gnumeric yang datang yang mana utilitas commandline bernama ssconvert memang super sederhana:

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

dan kamu selesai!

Pascal-Louis Perez
sumber
Sangat berguna dan Terima kasih Mr.Pascal-Louis Perez
Karthickkumar Nagaraj
1
Perintah di atas 'ssconvert' hanya mengkonversi 65536 baris tetapi saya memiliki lebih dari satu baris yang kurang, Bisakah Anda membantu saya?
Karthickkumar Nagaraj
4

Jika Anda OK untuk menjalankan baris perintah Java maka Anda dapat melakukannya dengan Excel Extractor Apache POI HSSF . Ia memiliki sebuah mainmetode yang mengatakan menjadi extractor baris perintah . Yang ini sepertinya hanya membuang semuanya. Mereka menunjukkan contoh ini yang mengkonversi ke CSV . Anda harus mengkompilasinya sebelum Anda dapat menjalankannya tetapi ia juga memilikimain metode sehingga Anda tidak perlu melakukan banyak pengkodean per se untuk membuatnya bekerja.

Opsi lain yang mungkin terbang tetapi akan membutuhkan beberapa pekerjaan di ujung yang lain adalah untuk membuat file Excel Anda mendatangi Anda sebagai Data XML XML atau XML Spreadsheet dari apa pun MS panggilan format yang hari ini. Ini akan membuka seluruh dunia peluang baru bagi Anda untuk mengiris dan memotongnya seperti yang Anda inginkan.

Pavel Veller
sumber
1
Apakah Anda tahu jika ini juga mendukung .xlsx?
dimroc
1

Seperti yang orang lain katakan, libreoffice dapat mengkonversi file xls ke csv. Masalahnya bagi saya adalah pemilihan lembar.

Script Python libreoffice ini melakukan pekerjaan yang baik di mengkonversi satu lembar ke CSV.

Penggunaannya adalah:

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

Satu-satunya downside (di ujung saya) adalah yang --headlesstampaknya tidak berhasil. Saya memiliki jendela LO yang muncul sebentar dan kemudian berhenti.
Tidak apa-apa dengan saya, itu satu-satunya alat yang melakukan pekerjaan dengan cepat.

Benoit Duffez
sumber