WorkbookFactory.create(is) 後程序「卡住」,無後續輸出、無異常拋出。
**代碼片段不完整**——僅展示到創建 Workbook,缺少後續 **Sheet 獲取、行遍歷、單元格讀取** 邏輯,程序實際可能正常運行完畢但無輸出,或因大文件解析耗時較長看似卡住。
FileInputStream fis = new FileInputStream(file);
Workbook wb = WorkbookFactory.create(fis); // 自動識別 xls/xlsx
Sheet sheet = wb.getSheetAt(0); // 獲取第一張表
int lastRowNum = sheet.getLastRowNum();
for (int i = 0; i <= lastRowNum; i++) {
Row row = sheet.getRow(i);
if (row == null) continue; // 空行跳過
int lastCellNum = row.getLastCellNum();
for (int j = 0; j < lastCellNum; j++) {
Cell cell = row.getCell(j);
String val = getCellValueAsString(cell); // 統一轉字符串
System.out.print(val + "\t");
}
System.out.println();
}
fis.close();
// 單元格值統一獲取工具
String getCellValueAsString(Cell cell) {
if (cell == null) return "";
switch (cell.getCellTypeEnum()) {
case STRING: return cell.getStringCellValue();
case NUMERIC:
if (DateUtil.isCellDateFormatted(cell))
return cell.getDateCellValue().toString();
return String.valueOf(cell.getNumericCellValue());
case BOOLEAN: return String.valueOf(cell.getBooleanCellValue());
case FORMULA: return cell.getCellFormula();
default: return "";
}
}
SXSSFWorkbook 流式讀寫,避免 OOM。getCellTypeEnum() (POI 4.0+),舊版用 getCellType()。DecimalFormat)。sheet.getMergedRegions()。補全遍歷邏輯即可正常讀取數據,「卡住」多為代碼未寫全或無輸出語句。