Apache Poi เป็น Java API แบบข้ามแพลตฟอร์มฟรีและโอเพ่นซอร์สที่เขียนใน Java Apache Poi จัดเตรียมฟังก์ชั่นของโปรแกรม Java เพื่ออ่านและเขียนคลังเก็บรูปแบบ Microsoft Office
หน้าดาวน์โหลดโครงการ: http://poi.apache.org/download.html
Apache Poi เป็น Java API ที่สร้างและรักษา Java APIs ต่าง ๆ ที่สอดคล้องกับมาตรฐาน Office Open XML (OOXML) และรูปแบบเอกสารคอมโพสิต OLE 2 ของ Microsoft (OLE2) สามารถใช้ในการอ่านและสร้างและแก้ไขไฟล์ MS Excel โดยใช้ Java นอกจากนี้คุณยังสามารถใช้ Java เพื่ออ่านและสร้างไฟล์ MS Word และ MspowerPoint Apache Poi ให้บริการโซลูชันการดำเนินงาน Java Excel
ตัวอย่างการอ่านเอกสาร Excel
เราใช้ HSSFWORKBOOK ใน POI เพื่ออ่านข้อมูล Excel
การทดสอบโมฆะสาธารณะ (ไฟล์ไฟล์) พ่น IOException {inputStream inp = ใหม่ fileInputStream (ไฟล์); HSSFWORKBOOK Workbook = HSSFWORKBOOK ใหม่ (INP); // เวิร์กบุ๊ก ... การดำเนินการสำรวจ} รหัสด้านบนแสดงให้เห็นว่าการอ่านไฟล์ของ Excel2003 (XLS) ก็โอเค แต่เมื่ออ่านไฟล์ของ Excel2007 (XLSX) แล้วจะมีการรายงานข้อยกเว้น: "ข้อมูลที่ให้มาดูเหมือนจะอยู่ใน Office 2007+ XML
หลังจากตรวจสอบข้อมูลแล้วไฟล์ Excel เวอร์ชัน Excel 2007 จำเป็นต้องอ่านโดยใช้ XSSFWORKBOOK ดังนี้:
การทดสอบโมฆะสาธารณะ (ไฟล์ไฟล์) พ่น IOException {inputStream inp = ใหม่ fileInputStream (ไฟล์); Workbook XSSFWORKBOOK = New XSSFWORKBOOK (INP); // เวิร์กบุ๊ก ... การดำเนินการสำรวจ} หมายเหตุ: XSSFWORKBOOK ต้องมีการนำเข้าเพิ่มเติมของ poi-ooxml-3.9-sources.jar และ poi-ooxml-schemas-3.9.jar
ด้วยวิธีนี้ไม่มีปัญหาในการนำเข้า Excel2007 แต่มีการรายงานข้อยกเว้นเพื่อนำเข้า Excel2003
ดังนั้นเมื่อนำเข้า Excel ให้พยายามตัดสินเวอร์ชันของ Excel และโทรหาวิธีการต่าง ๆ
ฉันคิดว่าจะใช้ชื่อไฟล์ต่อท้ายเพื่อกำหนดประเภท แต่ถ้ามีคนเปลี่ยนคำต่อท้ายของ XLSX เป็น XLS ถ้าเขาใช้ฟังก์ชั่น XLSX เพื่ออ่านผลลัพธ์คือข้อผิดพลาด แม้ว่าชื่อต่อท้ายจะถูกต้อง แต่การเข้ารหัสเนื้อหาไฟล์และอื่น ๆ ไม่ถูกต้อง
ในที่สุดขอแนะนำให้ใช้ WorkbookFactory.create (InputStream) ใน Poi-Oooxml เพื่อสร้างสมุดงานเพราะทั้ง HSSFWORKBOOK และ XSSFWORKBOOK ใช้งานอินเตอร์เฟสเวิร์กบุ๊ก รหัสมีดังนี้:
Workbook WB = WorkbookFactory.Create (IS);
อย่างที่คุณสามารถจินตนาการได้ในฟังก์ชั่น workbookfactory.create () จะต้องมีการตัดสินเกี่ยวกับประเภทไฟล์ มาดูกันว่าผู้ตัดสินซอร์สโค้ด:
/ ** * สร้าง HSSFWORKBOOK / XSSFWORKBOOK ที่เหมาะสมจาก * InputStream ที่กำหนด * สตรีมอินพุตของคุณจะต้องรองรับเครื่องหมาย/รีเซ็ตหรือ * ถูกห่อเป็น {@link pushbackinputstream}! */ สมุดงานคงที่สาธารณะสร้าง (inputstream inp) พ่น ioexception, invalidformatexception {// ถ้าเห็นได้ชัดว่าไม่ทำเครื่องหมาย/ รีเซ็ต, ห่อถ้า (! inp.marksupported ()) {inp = ใหม่ pushbackinputstream (inp, 8); } if (poifsfilesystem.haspoifsheader (inp)) {ส่งคืน hssfworkbook ใหม่ (inp); } if (poixmldocument.hasooxmlheader (inp)) {ส่งคืน xssfworkbook ใหม่ (opcpackage.open (inp)); } โยน unlegalargumentException ใหม่ ("อินพุตของคุณไม่ใช่สตรีม ole2 หรือสตรีม ooxml"); }คุณจะเห็นว่าวัตถุเวิร์กบุ๊กที่เหมาะสมถูกสร้างขึ้นแยกต่างหากตามประเภทไฟล์ มันถูกตัดสินตามข้อมูลส่วนหัวของไฟล์ ในเวลานี้แม้ว่าชื่อคำต่อท้ายจะเปลี่ยนไป แต่ก็ยังไม่สามารถผ่านได้