POI `XSSFWorkbook` 將整個 XLSX 載入內存,大文件導致 OOM。
實現 `SheetContentsHandler` 接口,逐行處理,不載入整表。
參考:POI SAX 讀取大 Excel 完整示例
OPCPackage pkg = OPCPackage.open(file);
XSSFReader reader = new XSSFReader(pkg);
StylesTable styles = reader.getStylesTable();
ReadOnlySharedStringsTable strings = new ReadOnlySharedStringsTable(pkg);
InputStream sheetInput = reader.getSheet("rId1");
XMLReader parser = XMLReaderFactory.createXMLReader();
ContentHandler handler = new MySheetHandler(styles, strings);
parser.setContentHandler(handler);
parser.parse(new InputSource(sheetInput));
class MySheetHandler extends DefaultHandler {
// 重寫 startElement, endElement, characters
// 逐行收集 cell 值,處理完一行即可寫入 XML/數據庫,釋放內存
}
若只需讀取特定行/列,在 Handler 中判斷 `rowIndex`、`colIndex` 篩選,滿足條件時處理,否則忽略,不必讀完整文件。