Apache POI中Sheet.getLastRowNum()始终返回1048575问题求助
问题分析与解决方法
核心原因1:依赖缺失
你当前只引入了poi依赖,而.xlsx格式属于OOXML规范,需要额外引入poi-ooxml依赖才能正确解析。poi仅支持旧版.xls格式,用它解析.xlsx会导致读取异常,出现错误的行号。
修正后的Maven依赖
<dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>5.2.2</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>5.2.2</version> </dependency>
核心原因2:Excel文件存在无效行标记
如果依赖修正后问题仍存在,大概率是你的Excel文件被误操作标记了大量空行(比如不小心点击过最后一行的行号)。Excel会在文件中保留这些空行的元数据,导致POI识别为有效行。
修复文件的方法
- 打开目标Excel文件,选中所有多余的空行(从第4行到最后一行),右键选择删除,然后重新保存文件。
- 另存为新的
.xlsx文件,避免原文件的格式残留。
代码层面的兜底处理
如果无法确保文件的干净性,可以在代码中遍历行,判断行是否为有效行(即包含实际内容或单元格格式),自行计算最后有效行的索引:
Sheet sheet = workbook.getSheetAt(0); int lastValidRowNum = -1; for (int i = sheet.getFirstRowNum(); i <= sheet.getLastRowNum(); i++) { Row row = sheet.getRow(i); if (row == null) continue; // 判断该行是否有有效单元格 boolean hasValidCell = false; for (Cell cell : row) { if (cell.getCellType() != CellType.BLANK) { hasValidCell = true; break; } } if (hasValidCell) { lastValidRowNum = i; } } log.info("Last valid row num: " + lastValidRowNum);
补充说明
getLastRowNum()返回的是Excel文件中存在的最后一行的索引(包括空行、隐藏行),而非有内容的行。所以必须结合实际业务场景,判断行的有效性。
内容的提问来源于stack exchange,提问作者Ivailo Tonev
相关产品推荐
相关产品推荐

