首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Apache POI 操作 Excel 完全指南(二):Eventusermodel 流式讀取與 HPSF 文檔屬性

     編輯:Java 相關知識

Eventusermodel 高效讀取

模擬 SAX 解析 XML,需熟悉 BIFF8 底層 Record 結構(org.apache.poi.hssf.record)。

核心 Record 類型

  • BOFRecord:Workbook/Sheet 開始。
  • RowRecord:行存在及樣式信息。
  • 實現 CellValueRecordInterface:NumberRecord、LabelSSTRecord、FormulaRecord 等表示單元格。

事件監聽器註冊範例

EventRecordFactory factory = new EventRecordFactory();
factory.registerListener(new ERFListener() {
    public boolean processRecord(Record rec) {
        if (rec.getSid() == BOFRecord.sid) { /* 處理 BOF */ return true; }
        return false;
    }
}, new short[]{ BOFRecord.sid });
factory.processRecords(inputStream);

HSSF 文檔結構(OLE 2 CDF)

Bla.xls
├─ OLE2CDF headers
├─ "Workbook" stream
│  ├─ Workbook { Static String Table, Sheet names & pointers }
│  ├─ Sheet { ROW, ROW, NUMBER RECORD, LABELSST RECORD ... }
│  └─ Sheet ...
├─ Images, Macros (獨立流/目錄)
├─ Document Summary
└─ Summary

HPSF 讀取文檔屬性

屬性存儲於 POIFS 專用流:\005SummaryInformation(標題、作者、創建時間等)、\005DocumentSummaryInformation(類別、多媒體剪輯數等)。

讀取標題示例

POIFSReader r = new POIFSReader();
r.registerListener(new POIFSReaderListener() {
    public void processPOIFSReaderEvent(POIFSReaderEvent event) {
        SummaryInformation si = (SummaryInformation) PropertySetFactory.create(event.getStream());
        System.out.println("標題: " + si.getTitle());
    }
}, "\005SummaryInformation");
r.read(new FileInputStream("doc.xls"));

關鍵步驟解析

  1. event.getStream() 獲取屬性流。
  2. PropertySetFactory.create() 工廠轉換為 PropertySet。
  3. 強轉為 SummaryInformation 或 DocumentSummaryInformation 享受便捷 Getter。
  4. 異常處理:NoPropertySetStreamException、ClassCastException(流類型不匹配)。

同時讀取兩類屬性流

註冊兩個監聽器,處理時用 instanceof 或 isSummaryInformation() 區分。自定義屬性集需使用更通用的 API(參考 HPSF HOW-TO)。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved