อะไรคือ API ที่ดีกว่าในการอ่านแผ่นงาน Excel ใน java - JXL หรือ Apache POI [ปิด]


94

2 API ใดที่ง่ายกว่าในการอ่าน / เขียน / แก้ไขแผ่นงาน excel API เหล่านี้ไม่รองรับส่วนขยาย CSV หรือไม่

ใช้ JXL สำหรับ file.xls และ file.xlsx ฉันได้รับข้อยกเว้นเช่น:

jxl.read.biff.BiffException: Unable to recognize OLE stream
    at jxl.read.biff.CompoundFile.<init>(CompoundFile.java:116)
    at jxl.read.biff.File.<init>(File.java:127)
    at jxl.Workbook.getWorkbook(Workbook.java:268)
    at core.ReadXLSheet.contentReading(ReadXLSheet.java:46)
    at core.ReadXLSheet.init(ReadXLSheet.java:22)
    at core.ReadXLSheet.main(ReadXLSheet.java:72)

ทั้งสำหรับนามสกุล. xls และ. xlsx เวอร์ชัน Java ที่ฉันใช้คือ: JDK1.6


1
สิ่งที่เกี่ยวกับ: "มี API ใดบ้างในการอ่าน / เขียนสเปรดชีต Microsoft Excel (JXL, Apache POI ฯลฯ ) ใน Java สถานการณ์ที่ดีที่สุดในการใช้แต่ละสถานการณ์คืออะไร"
Cléssio Mendes

คำตอบ:


258

ฉันได้ใช้ทั้งJXL (ตอนนี้ "JExcel") และApache POI ตอนแรกฉันใช้ JXL แต่ตอนนี้ฉันใช้ Apache POI

ขั้นแรกนี่คือสิ่งที่ API ทั้งสองมีฟังก์ชันการทำงานสุดท้ายเหมือนกัน:

  • ทั้งสองแบบฟรี
  • การจัดรูปแบบเซลล์: การจัดแนว, พื้นหลัง (สีและรูปแบบ), เส้นขอบ (ประเภทและสี), การรองรับแบบอักษร (ชื่อแบบอักษร, สี, ขนาด, ตัวหนา, ตัวเอียง, ขีดฆ่า, ขีดเส้นใต้)
  • สูตร
  • ไฮเปอร์ลิงก์
  • พื้นที่เซลล์ที่ผสาน
  • ขนาดของแถวและคอลัมน์
  • การจัดรูปแบบข้อมูล: ตัวเลขและวันที่
  • การตัดข้อความภายในเซลล์
  • ตรึงบานหน้าต่าง
  • การสนับสนุนส่วนหัว / ส่วนท้าย
  • อ่าน / เขียนสเปรดชีตที่มีอยู่และใหม่
  • ทั้งสองพยายามเก็บวัตถุที่มีอยู่ในสเปรดชีตที่พวกเขาอ่านให้เหมือนเดิมเท่าที่จะทำได้

อย่างไรก็ตามมีความแตกต่างมากมาย:

  • บางทีข้อแตกต่างที่สำคัญที่สุดก็คือ Java JXL ไม่รองรับรูปแบบ Excel 2007+ ".xlsx" รองรับเฉพาะรูปแบบ BIFF (ไบนารี) ".xls" แบบเก่าเท่านั้น Apache POI รองรับทั้งสองแบบด้วยการออกแบบทั่วไป
  • นอกจากนี้ส่วน Java ของ JXL API ได้รับการอัปเดตครั้งล่าสุดในปี 2009 (3 ปี 4 เดือนที่แล้วขณะที่ฉันเขียนสิ่งนี้) แม้ว่าจะดูเหมือนว่ามี C # API Apache POI ได้รับการดูแลอย่างต่อเนื่อง
  • JXL ไม่รองรับการจัดรูปแบบตามเงื่อนไข แต่ Apache POI ทำแม้ว่าจะไม่สำคัญเท่าไหร่เพราะคุณสามารถจัดรูปแบบเซลล์ตามเงื่อนไขด้วยรหัสของคุณเองได้
  • JXL ไม่รองรับการจัดรูปแบบRich Textนั่นคือการจัดรูปแบบที่แตกต่างกันภายในสตริงข้อความ Apache POI รองรับ
  • JXL รองรับการหมุนข้อความบางอย่างเท่านั้น: แนวนอน / แนวตั้ง, +/- 45 องศาและแบบเรียงซ้อน Apache POI รองรับองศาจำนวนเต็มบวกซ้อนกัน
  • JXL ไม่รองรับการวาดรูปทรง Apache POI ทำ
  • JXL รองรับการตั้งค่า Page Setup ส่วนใหญ่เช่นแนวนอน / แนวตั้งระยะขอบขนาดกระดาษและซูม Apache POI รองรับทั้งหมดนั้นรวมทั้งการทำซ้ำแถวและคอลัมน์
  • JXL ไม่รองรับ Split Panes; Apache POI ทำ
  • JXL ไม่รองรับการสร้างหรือการจัดการแผนภูมิ การสนับสนุนนั้นยังไม่มีใน Apache POI แต่ API กำลังเริ่มก่อตัวขึ้นอย่างช้าๆ
  • Apache POI มีชุดเอกสารและตัวอย่างที่ครอบคลุมมากกว่า JXL

นอกจากนี้ POI ไม่ได้มีแค่ API "usermodel" หลักเท่านั้น แต่ยังมี API ตามเหตุการณ์อีกด้วยหากคุณต้องการทำเพียงแค่อ่านเนื้อหาสเปรดชีต

สรุปได้ว่าเนื่องจากเอกสารประกอบที่ดีขึ้นมีคุณสมบัติมากขึ้นการพัฒนาที่ใช้งานอยู่และการสนับสนุนรูปแบบ Excel 2007+ ฉันจึงใช้ Apache POI


ขอบคุณสำหรับคำอธิบายอย่างละเอียด
Swagatika

8
+1 เพื่อความชัดเจนกระชับและเป็นประโยชน์อย่างยิ่ง
รอน

1
getContents()วิธีสกปรกใน JExcelAPI ช่วยฉันประหยัดเวลาได้มาก ด้วย POI คุณต้องตรวจสอบว่าเป็นประเภทเซลล์จากนั้นรับค่า (ถ้าเป็นเซลล์ตัวเลขคุณต้องตรวจสอบว่าเป็นเซลล์วันที่หรือไม่) ตามประเภทและสุดท้ายแปลงเป็นค่า String ด้วยวิธีการต่างๆซึ่งไม่สะดวก นึกไม่ถึงว่า POI ไม่ได้มีวิธีการที่สกปรก แต่สะดวกเช่นเดียวกับ JExcelAPI
LiuYan 刘研

1
สิ่งที่ดีมากถ้า POI คือการอ่านตามเหตุการณ์ โดยเฉพาะอย่างยิ่งบนอุปกรณ์เคลื่อนที่ (= Android) สิ่งนี้ช่วยได้มากเมื่อจัดการกับขนาดฮีปและ GC ที่ จำกัด การอ่าน XLS อย่างง่ายด้วย JXL มักจะถึงขีด จำกัด หน่วยความจำของแอปทำให้แอปหยุดทำงาน
dermatthias

2
ปัจจัยสำคัญอย่างหนึ่งที่ทำให้ฉันย้ายไปยัง POI คือความยืดหยุ่นในการใช้ API แบบนึ่งซึ่งเป็นสิ่งที่จำเป็นเมื่อคุณต้องการอ่าน excel ที่มีข้อมูลจำนวนมาก คุณไม่ต้องการให้ข้อมูล wole ถูกโหลดลงในหน่วยความจำเมื่อคุณเปิด excel หากข้อมูลใน excel มีจำนวนมาก ด้วยการสตรีมเนื้อหาทั้งหมดของ excel / เอกสาร office ของคุณจะไม่ถูกโหลดลงในหน่วยความจำทันทีหลังจากที่คุณแยกวิเคราะห์แผ่นงาน
Ashok Koyi

12

ฉันใช้ POI แล้ว

หากคุณใช้สิ่งนั้นให้จับตาดูการจัดรูปแบบเซลล์เหล่านั้น: สร้างขึ้นมาใหม่และใช้หลาย ๆ ครั้งแทนที่จะสร้างแต่ละครั้งสำหรับเซลล์นั่นคือความแตกต่างของการใช้หน่วยความจำขนาดใหญ่หรือข้อมูลขนาดใหญ่


5

ฉันไม่คุ้นเคยกับ JXL แต่เราใช้ POI POI ได้รับการดูแลอย่างดีและสามารถจัดการทั้งรูปแบบ. xls ไบนารีและรูปแบบ xml ใหม่ที่เปิดตัวใน Office 2007

ไฟล์ CSV ไม่ใช่ไฟล์ excel แต่เป็นไฟล์แบบข้อความดังนั้นไลบรารีเหล่านี้จะไม่อ่านไฟล์เหล่านี้ คุณจะต้องแยกวิเคราะห์ไฟล์ CSV ด้วยตัวเอง ฉันไม่ทราบเกี่ยวกับไลบรารีไฟล์ CSV ใด ๆ แต่ฉันก็ไม่ได้ดูเช่นกัน


1

สำหรับการอ่านไฟล์ CSV "ธรรมดา" ใน Java มีไลบรารีชื่อ OpenCSV อยู่ที่นี่: http://opencsv.sourceforge.net/


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