首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Java POI 讀取 Excel 2007 (xlsx) 卡住無異常:代碼邏輯缺失

     編輯:程式設計綜合問答

現象

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 "";
    }
}

常見坑

  • 大文件 (SXSSF) 需用 SXSSFWorkbook 流式讀寫,避免 OOM。
  • 單元格類型判斷用 getCellTypeEnum() (POI 4.0+),舊版用 getCellType()。
  • 數字儲存為 double,顯示需格式化(如 DecimalFormat)。
  • 合併單元格需額外處理 sheet.getMergedRegions()。

補全遍歷邏輯即可正常讀取數據,「卡住」多為代碼未寫全或無輸出語句。

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