แปลง xlsx เป็น csv ใน Linux ด้วยบรรทัดคำสั่ง


266

ฉันกำลังมองหาวิธีแปลงไฟล์ xlsx เป็นไฟล์ csv บน Linux

ฉันไม่ต้องการใช้ PHP / Perl หรืออะไรทำนองนั้นเนื่องจากฉันกำลังมองหาการประมวลผลหลายล้านบรรทัดดังนั้นฉันต้องการบางสิ่งที่รวดเร็ว ฉันพบโปรแกรมบน repos ของ Ubuntu ที่เรียกว่า xls2csv แต่จะแปลงไฟล์ xls (Office 2003) (ซึ่งฉันใช้อยู่) เท่านั้น แต่ฉันต้องการการสนับสนุนสำหรับไฟล์ Excel ที่ใหม่กว่า

ความคิดใด ๆ


10
การคิดว่าสิ่งใดที่ดำเนินการด้วยภาษาสคริปต์จะช้าลงโดยธรรมชาติดูเหมือนว่าจะมีความเข้าใจผิดเล็กน้อยโดยเฉพาะอย่างยิ่งเนื่องจากห้องสมุดที่น่าสนใจในภาษาเหล่านั้นมักจะมีแบ็กเอนด์เขียนเป็นภาษาซี
Charles Duffy

2
Excel เคย จำกัด แถวที่ 65536 ตอนนี้เป็น 1,048,576 ( support.microsoft.com/kb/120596 ) มันจะเป็นเรื่องยากที่จะติดตั้ง "ตัดสายเป็นล้าน ๆ เส้น" ในนั้น เพียง แต่พูดว่า ...
พาเวล Veller

1
@Pavel อาจมีหลายไฟล์
Charles Duffy

2
... ส่วนตัวผมต้องการทำเช่นนี้ใช้ห้องสมุด xlsv สำหรับหลาม แต่เนื่องจากวิธีการเขียนสคริปต์ที่ใช้อธิบายว่าจากคำถาม ... ยัก (มันเป็นวิธีการเขียนโปรแกรมเป็นคำถามถ้าเครื่องมือการเขียนโปรแกรมได้รับการยกเว้นจากคำตอบ?)
ชาร์ลส์ดัฟฟี่

1
@CharlesDuffy ฉันใช้ไลบรารี PHP เพื่อทำสิ่งนี้และสิ่งที่ต้องใช้ xls2csv 1 วินาทีในการทำใช้เวลา 10 นาทีในการทำ php อย่างแท้จริง
user1390150

คำตอบ:


239

Gnumericโปรแกรมสเปรดชีตมาพร้อมกับอรรถประโยชน์บรรทัดคำสั่งที่เรียกว่าssconvertที่สามารถแปลงระหว่างความหลากหลายของรูปแบบสเปรดชีท:

$ 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:

apt-get install gnumeric

วิธีติดตั้งบน Mac:

brew install gnumeric

19
วิธีการแปลงสเปรดชีตที่ไม่ยุ่งยากที่สุด เมื่อรวมกับสคริปต์ทุบตีมันจะช่วยให้คุณแบทช์ประมวลผลหลายไฟล์ for f in *.csv; do ssconvert "$f" "${f%.csv}.xlsx"; doneวิธี LibreOffice อาจประมวลผลรูปแบบอื่น แต่ฉันไม่สามารถใช้งานได้ (มันจะเปิดไฟล์เปล่าทุกครั้งแม้จะมี--headlessข้อโต้แย้ง)
sleblanc

6
@ sebleblanc ไม่ค่อยยุ่งยาก การติดตั้งเป็นความเจ็บปวดที่ได้รับจำนวนการขึ้นต่อกัน (ถ้าคุณทำเช่นนี้บนเซิร์ฟเวอร์ที่ไม่มีหัว) จนถึงตอนนี้ gcc, intltool, zlib-devel, GTK ... GTK ต้องการ glib, atk, pango, cairo, cairo-object, gdk-pixbuf-2.0 ...
andrewtweber

11
apt-get install gnumeric --no-install-recommendsฉันจัดการเพื่อติดตั้งบนเซิร์ฟเวอร์หัวขาดเดเบียนด้วย ข้อเสียเปรียบเพียงอย่างเดียวคือมันเตือนการเตือนGConf-WARNING มากมาย **: ไคลเอ็นต์ไม่สามารถเชื่อมต่อกับ D-BUS daemonเมื่อทำงาน วิssconvert oldfile.xlsx newfile.csv > /dev/null 2>&1จะทำเคล็ดลับง่าย ๆ
Benjamin Delichere

7
หากต้องการเขียนถึง csv คุณอาจต้องการให้-Sแฟล็กเขียนหลายแผ่น แต่ละคนไปที่ไฟล์ของตัวเอง
Ed Avis

5
@hhh ตัวเลือกตัวแยกใช้งานได้กับประเภทการส่งออก txt เท่านั้น คุณสามารถใช้ในการพิมพ์ที่ ssconvert -O "separator=;" -T Gnumeric_stf:stf_assistant file.xlsx fd://1stdout:
exic

135

คุณสามารถทำได้ด้วย LibreOffice:

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

สำหรับเหตุผลที่ไม่ชัดเจนสำหรับฉันคุณอาจต้องเรียกใช้งานด้วย sudo คุณสามารถทำให้ LibreOffice ทำงานกับ sudo ได้โดยไม่ต้องใช้รหัสผ่านโดยเพิ่มบรรทัดนี้ในไฟล์ sudoers ของคุณ:

users ALL=(ALL) NOPASSWD: libreoffice

35
ฉันจะบอก libreoffice ว่าฉันต้องการแผ่นงานที่สองได้อย่างไร
dmeu

30
การอนุญาต sudo ให้ libreoffice สำหรับทุกคนที่ไม่มีรหัสผ่านกำลังเปิดกระป๋องเวิร์ม โปรดระวังผลที่ตามมารวมถึงความเป็นไปได้ที่จะได้รับสิทธิ์การใช้งานรูทบนแพลตฟอร์มที่มีผู้ใช้หลายคน
Interarticle

5
สิ่งนี้ใช้ได้สำหรับฉัน (ไม่ต้องใช้ sudo) รุ่นของฉัน: libreoffice-calc-3.6.7.2-4.fc18.x86_64
แบรดไฮน์

5
/Applications/LibreOffice.app/Contents/MacOS/soffice --headless --convert-to csv $filenameทำงานบน OS X สำหรับฉัน
Nobu

12
การแปลงให้เป็น UTF-8 รักษาอักขระที่ไม่ใช่ ASCII, --convert-to "csv:Text - txt - csv (StarCalc):44,34,76,1,1/1"ใช้แทน ดูรายละเอียดเพิ่มเติมที่wiki office เปิด
Aryeh Leib Taurog

132

หากคุณมีสภาพแวดล้อมบนเดสก์ท็อปอยู่แล้วฉันมั่นใจว่า Gnumeric / LibreOffice จะทำงานได้ดี แต่บนเซิร์ฟเวอร์แบบไม่มีหัว (เช่น Amazon Web Services) พวกเขาต้องการการพึ่งพาหลายสิบครั้งที่คุณต้องติดตั้ง

ฉันพบทางเลือก Python นี้:

https://github.com/dilshod/xlsx2csv

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

ใช้เวลา 2 วินาทีในการติดตั้งและใช้งานได้อย่างมีเสน่ห์

หากคุณมีหลายแผ่นคุณสามารถส่งออกทั้งหมดในคราวเดียวหรือทีละแผ่น:

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

นอกจากนี้เขายังเชื่อมโยงไปยังหลายทางเลือกที่สร้างขึ้นใน Bash, Python, Ruby และ Java


ใช้งานได้ดี แต่ฉันสามารถทำงานเป็น 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') เท่านั้น csvkitตอนนี้ที่ผมคิดเกี่ยวกับมันผมได้รับข้อผิดพลาดเดียวกันกับ
user2105469

2
.... ได้ทำงานที่ดีสำหรับฉันและช่วยให้การสกัดของแผ่นแต่ละไฟล์โดยใช้ตัวเลือก -s แต่ละ - ที่ LibreOffice ก็ไม่สามารถที่จะจัดการกับขนาดของแผ่น, xlsx2csv ไม่มีปัญหา
โซเรน

ขอบคุณ! สะดวกมากในอูบุนตู
zhuguowei

5
ใน Debian และ Ubuntu มีxlsx2csvแพ็คเกจดังนั้นคุณไม่จำเป็นต้องติดตั้งด้วยตนเองeasy_installแต่สามารถใช้เครื่องมือจัดการแพ็คเกจของคุณได้
josch

ใน MacOS คุณจะต้องมีsudo easy_install xlsx2csv
Frank Hintsch

32

ใน bash ฉันใช้คำสั่ง libreoffice นี้เพื่อแปลงไฟล์ xlsx ทั้งหมดของฉันในไดเรกทอรีปัจจุบัน:

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

ดูแลช่องว่างในชื่อไฟล์

พยายามอีกหลายปีต่อมาและมันไม่ทำงาน เธรดนี้ให้เคล็ดลับ แต่วิธีแก้ปัญหาที่เร็วที่สุดคือเรียกใช้ในฐานะรูท (หรือเรียกใช้กsudo libreoffice) ไม่หรูหรา แต่รวดเร็ว

ใช้คำสั่ง scalc.exe ใน Windows


13
ตรวจสอบให้แน่ใจว่าคุณปิดหน้าต่างสำนักงานที่เปิดอยู่ทั้งหมดก่อนที่จะลองทำเช่นนี้
tacone

นอกจากนี้บน Windows, คำสั่งมากกว่าscalc.exe libreofficeทำงานให้ฉันวันนี้กับรุ่น LO ที่เสถียรในปัจจุบัน
AronVanAmmers


8

ตัวเลือกอื่นจะใช้ R ผ่าน wrapper bash ขนาดเล็กเพื่อความสะดวก:

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

หาก.xlsxไฟล์มีแผ่นงานหลายแผ่นคุณ-sสามารถใช้การตั้งค่าสถานะเพื่อรับแผ่นงานที่คุณต้องการ ตัวอย่างเช่น:

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

second_sheet.csvmy_file.xlsxจะมีข้อมูลของแผ่นที่ 2


5

การใช้แอปพลิเคชั่นสเปรดชีตGnumericซึ่งมาพร้อมกับยูทิลิตี commandline ที่ชื่อว่า ssconvert นั้นง่ายมาก:

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

และคุณทำเสร็จแล้ว!


มีประโยชน์มากและขอบคุณ Mr.Pascal-Louis Perez
Karthickkumar Nagaraj

1
คำสั่งข้างต้น 'ssconvert' เพียงแปลง 65536 บรรทัด แต่ฉันมีมากกว่าหนึ่งบรรทัดคุณสามารถช่วยฉันได้ไหม
Karthickkumar Nagaraj

4

หากคุณตกลงที่จะเรียกใช้บรรทัดคำสั่ง Java แล้วคุณสามารถทำมันได้กับ Apache POI HSSF ของExcel ดูด มันมีวิธีการที่บอกว่าจะเป็นแยกบรรทัดคำสั่ง อันนี้ดูเหมือนจะทิ้งทุกอย่างออกไป พวกเขาชี้ให้ตัวอย่างนี้ที่แปลงเป็น CSV คุณจะต้องรวบรวมมันก่อนที่คุณจะสามารถเรียกใช้ แต่ก็มีmainmainวิธีการเช่นกันดังนั้นคุณไม่ควรต้องเขียนโปรแกรมมากเท่าไหร่เพื่อให้มันทำงานได้

ตัวเลือกอื่นที่อาจบินได้ แต่จะต้องใช้งานในส่วนอื่น ๆ คือการทำให้ไฟล์ Excel ของคุณมาถึงคุณในฐานะที่เป็นข้อมูลXML ของ XMLหรือสเปรดชีต XMLของสิ่งที่ MS เรียกในรูปแบบเหล่านี้ในปัจจุบัน มันจะเปิดโลกใหม่แห่งโอกาสให้คุณได้หั่นและทำตามที่คุณต้องการ


1
คุณรู้หรือไม่ว่าสิ่งนี้รองรับ. xlsx หรือไม่
dimroc

1

อย่างที่คนอื่นพูดว่าlibreofficeสามารถแปลงไฟล์ xls เป็น csv ปัญหาสำหรับฉันคือการเลือกแผ่น

นี้ สคริปต์ Pre libreofficeทำงานได้ดีในการแปลงแผ่นงานเป็น CSV

การใช้งานคือ:

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

ข้อเสียเพียงอย่างเดียว (ในตอนท้ายของฉัน) คือที่--headlessดูเหมือนจะไม่ทำงาน ฉันมีหน้าต่าง LO ที่ปรากฏขึ้นเป็นวินาทีและจากนั้นออก
ไม่เป็นไรสำหรับฉันมันเป็นเครื่องมือเดียวที่ทำงานได้อย่างรวดเร็ว

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.