You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 13:35:14