Chuyển đổi xlsx sang csv trong Linux bằng dòng lệnh


266

Tôi đang tìm cách chuyển đổi các tệp xlsx thành các tệp csv trên Linux.

Tôi không muốn sử dụng PHP / Perl hoặc bất cứ thứ gì tương tự vì tôi đang xem xét xử lý hàng triệu dòng, vì vậy tôi cần một cái gì đó nhanh chóng. Tôi đã tìm thấy một chương trình trên repos Ubuntu có tên xls2csv nhưng nó sẽ chỉ chuyển đổi các tệp xls (Office 2003) (mà tôi hiện đang sử dụng) nhưng tôi cần hỗ trợ cho các tệp Excel mới hơn.

Có ý kiến ​​gì không?


10
Nghĩ rằng bất cứ điều gì được thực hiện với một ngôn ngữ kịch bản sẽ bị chậm lại bởi bản chất dường như ... hơi sai lầm, đặc biệt là khi các thư viện thú vị trong các ngôn ngữ đó có xu hướng có phần phụ trợ được viết bằng C.
Charles Duffy

2
Excel được sử dụng giới hạn ở 65536 hàng. Bây giờ là 1.048.576 ( support.microsoft.com/kb/120596 ). sẽ rất khó khăn để phù hợp với "hàng triệu dòng" trong đó. chỉ cần nói ...
Pavel Veller

1
@Pavel có thể qua một số tệp.
Charles Duffy

2
... cá nhân, tôi sẽ làm điều này bằng cách sử dụng thư viện xlsv cho Python, nhưng vì các cách tiếp cận dựa trên kịch bản được mô tả là không nằm trong câu hỏi ... nhún vai . (Làm thế nào là một câu hỏi lập trình nếu các công cụ lập trình được loại trừ khỏi câu trả lời?)
Charles Duffy

1
@CharlesDuffy Tôi hiện đang sử dụng thư viện PHP để thực hiện việc này và mất xls2csv 1 giây để làm, mất 10 phút để làm php. Nghĩa đen
user1390150

Câu trả lời:


239

Các Gnumeric ứng dụng bảng tính đi kèm với một tiện ích dòng lệnh gọi ssconvert có thể chuyển đổi giữa nhiều định dạng bảng tính:

$ 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

Để cài đặt trên Ubuntu:

apt-get install gnumeric

Để cài đặt trên Mac:

brew install gnumeric

19
Thực sự là phương pháp chuyển đổi bảng tính rắc rối nhất. Kết hợp với tập lệnh bash, nó sẽ cho phép bạn xử lý hàng loạt nhiều tệp. for f in *.csv; do ssconvert "$f" "${f%.csv}.xlsx"; donePhương thức LibreScript có thể có thể xử lý các định dạng khác, nhưng tôi không thể làm cho nó hoạt động được (đơn giản là nó sẽ mở một tệp trống mỗi lần, ngay cả với --headlessđối số).
sleblanc

6
@sebleblanc Không rắc rối lắm. Việc cài đặt là một nỗi đau với số lượng phụ thuộc (nếu bạn đang làm điều này trên một máy chủ không đầu). Cho đến nay gcc, intltool, zlib-devel, GTK ... GTK yêu cầu glib, atk, pango, cairo, cairo-object, gdk-pixbuf-2.0 ...
andrewtweber 14/214

11
Tôi quản lý để cài đặt nó trên một máy chủ debian không đầu apt-get install gnumeric --no-install-recommends. Hạn chế duy nhất là nó kích hoạt rất nhiều cảnh báo GConf-CẢNH BÁO **: Máy khách không thể kết nối với trình nền D-BUS khi chạy. Một đơn giản ssconvert oldfile.xlsx newfile.csv > /dev/null 2>&1sẽ làm các mẹo.
Benjamin Delichere

7
Để viết thư cho csv, bạn có thể muốn -Scờ viết nhiều trang. Mỗi người đi đến tập tin riêng của mình.
Ed Avis

5
@hhh Tùy chọn phân tách chỉ hoạt động với loại xuất txt. Bạn có thể sử dụng điều này để in ra thiết bị xuất chuẩn : ssconvert -O "separator=;" -T Gnumeric_stf:stf_assistant file.xlsx fd://1.
exic

135

Bạn có thể làm điều này với LibreOffice:

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

Vì những lý do không rõ ràng với tôi, bạn có thể cần chạy nó với sudo. Bạn có thể làm cho LibreScript hoạt động với sudo mà không cần mật khẩu bằng cách thêm dòng này vào tệp sudoers của bạn:

users ALL=(ALL) NOPASSWD: libreoffice

35
Làm thế nào tôi có thể nói với libreoffice rằng tôi muốn tờ thứ hai?
dmeu

30
Cho phép sudo để libreoffice cho mọi người mà không cần mật khẩu đang mở một lon giun. Xin lưu ý về hậu quả, bao gồm khả năng có được quyền root trên nền tảng nhiều người dùng
Interarticle

5
điều này làm việc cho tôi (sudo không bắt buộc). Phiên bản của tôi: libreoffice-calc-3.6.7.2-4.fc18.x86_64
Brad Hein

5
/Applications/LibreOffice.app/Contents/MacOS/soffice --headless --convert-to csv $filenamelàm việc trên OS X cho tôi.
Nobu

12
Để chuyển đổi sang utf-8, giữ nguyên các ký tự không phải mã ascii, sử dụng thay thế --convert-to "csv:Text - txt - csv (StarCalc):44,34,76,1,1/1". Xem wiki văn phòng mở để biết chi tiết.
Aryeh Leib Taurog

132

Nếu bạn đã có môi trường Máy tính để bàn thì tôi chắc chắn Gnumeric / LibreOffice sẽ hoạt động tốt, nhưng trên máy chủ không đầu (như Dịch vụ web của Amazon), họ yêu cầu hàng tá phụ thuộc mà bạn cũng cần cài đặt.

Tôi tìm thấy thay thế Python này:

https://github.com/dilshod/xlsx2csv

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

Mất 2 giây để cài đặt và hoạt động như một lá bùa.

Nếu bạn có nhiều trang tính, bạn có thể xuất tất cả cùng một lúc hoặc một trang:

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

Ông cũng liên kết đến một số lựa chọn thay thế được xây dựng bằng Bash, Python, Ruby và Java.


Hoạt động tuyệt vời, nhưng tôi chỉ có thể chạy như 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'). Bây giờ tôi nghĩ về nó, tôi đã nhận được cùng một lỗi csvkit.
dùng2105469

2
.... Tôi đã làm việc rất tốt và cho phép trích xuất từng trang thành các tệp riêng lẻ bằng tùy chọn -s - trong đó libreoffice không thể xử lý kích thước của trang tính, xlsx2csv không gặp vấn đề gì
Soren

Cảm ơn! Rất thuận tiện trong Ubuntu.
zhuguowei

5
Trong Debian và Ubuntu có xlsx2csvgói, vì vậy bạn không cần phải cài đặt thủ công easy_installmà có thể sử dụng trình quản lý gói của mình.
josch

Trên MacOS, bạn sẽ cần mộtsudo easy_install xlsx2csv
Frank Hintsch

32

Trong bash, tôi đã sử dụng lệnh libreoffice này để chuyển đổi tất cả các tệp xlsx của mình trong thư mục hiện tại:

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

Nó chăm sóc không gian trong tên tệp.

Đã thử lại một vài năm sau đó, và nó đã không hoạt động. Chủ đề này đưa ra một số lời khuyên, nhưng giải pháp nhanh nhất là chạy bằng root (hoặc chạy a sudo libreoffice). Không thanh lịch, nhưng nhanh chóng.

Sử dụng lệnh scalc.exe trong Windows


13
Hãy chắc chắn rằng bạn đóng tất cả các cửa sổ mở trước khi thử điều này, vì nó sẽ âm thầm thất bại nếu không.
tacone

Ngoài ra, trên Windows, lệnh scalc.execòn hơn là libreoffice. Làm việc cho tôi ngày hôm nay trên phiên bản LO ổn định hiện tại.
AronVanAmmers


8

Một tùy chọn khác là sử dụng R thông qua trình bao bọc bash nhỏ để thuận tiện:

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

Nếu .xlsxtệp có nhiều trang tính, -scờ có thể được sử dụng để lấy trang tính bạn muốn. Ví dụ:

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

second_sheet.csvsẽ chứa dữ liệu của tờ thứ 2 trong my_file.xlsx.


5

Sử dụng ứng dụng bảng tính Gnumeric đi kèm với tiện ích dòng lệnh gọi là ssconvert thực sự siêu đơn giản:

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

và bạn đã hoàn tất!


Rất hữu ích và cảm ơn bạn Mr.Pascal-Louis Perez
Karthickkumar Nagaraj

1
Lệnh trên 'ssconvert' chỉ chuyển đổi 65536 dòng nhưng tôi có nhiều hơn một dòng thiếu, bạn có thể giúp tôi không?
Karthickkumar Nagaraj

4

Nếu bạn ổn để chạy dòng lệnh Java thì bạn có thể làm điều đó với Trình trích xuất Excel của POI HSSF . Nó có một mainphương thức nói là trình trích xuất dòng lệnh . Điều này dường như chỉ đổ mọi thứ ra. Họ chỉ ra ví dụ này chuyển đổi sang CSV . Bạn sẽ phải biên dịch nó trước khi bạn có thể chạy nó nhưng nó cũng có một mainphương thức để bạn không cần phải thực hiện nhiều mã hóa để làm cho nó hoạt động.

Một tùy chọn khác có thể bay nhưng sẽ yêu cầu một số công việc ở đầu bên kia là làm cho các tệp Excel của bạn đến với bạn dưới dạng Dữ liệu XML của Excel hoặc Bảng tính XML của bất kỳ MS nào gọi định dạng ngày nay. Nó sẽ mở ra một thế giới hoàn toàn mới về cơ hội để bạn cắt và xắt nó theo cách bạn muốn.


1
Bạn có biết nếu điều này cũng hỗ trợ .xlsx?
dimroc

1

Như những người khác đã nói, libreofficecó thể chuyển đổi tập tin xls sang csv. Vấn đề đối với tôi là lựa chọn tờ.

Tập lệnh Python libreoffice này thực hiện tốt công việc chuyển đổi một trang tính thành CSV.

Cách sử dụng là:

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

Nhược điểm duy nhất (về phía tôi) là --headlessdường như không hoạt động. Tôi có một cửa sổ LO xuất hiện trong một giây và sau đó thoát.
Điều đó ổn với tôi, đó là công cụ duy nhất thực hiện công việc nhanh chóng.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.