sheet.getLastRowNum() 空行也会读
时间: 2025-06-28 13:20:10 浏览: 8
### 使用 Apache POI `sheet.getLastRowNum()` 方法时不统计空行
当使用 Apache POI 的 `sheet.getLastRowNum()` 方法来获取 Excel 文件的工作表中最后一行的索引时,可能会遇到一个问题:该方法返回的是最大行号而非物理上的有效行数。如果某些行曾经被编辑过但后来清空了内容,这些行仍然会被计算在内[^3]。
为了确保只处理含有数据的有效行而不是那些仅保留格式或样式的空白行,在遍历每一行之前应先判断其是否为空:
```java
import org.apache.poi.ss.usermodel.*;
public static void processSheet(Sheet sheet) {
int physicalNumberOfRows = sheet.getPhysicalNumberOfRows();
for (int rowIndex = 0; rowIndex <= sheet.getLastRowNum(); rowIndex++) {
Row row = sheet.getRow(rowIndex);
if (!isRowEmpty(row, sheet)) {
// 处理非空行逻辑...
System.out.println("非空行 索引: " + rowIndex);
}
}
}
private static boolean isRowEmpty(Row row, Sheet sheet) {
if (row == null) return true;
Iterator<Cell> cellIterator = row.cellIterator();
while (cellIterator.hasNext()) {
Cell cell = cellIterator.next();
switch (cell.getCellType()) {
case STRING:
if (!cell.getStringCellValue().trim().isEmpty())
return false;
break;
case NUMERIC:
if (cell.getNumericCellValue() != 0)
return false;
break;
case BOOLEAN:
if (cell.getBooleanCellValue())
return false;
break;
default:
continue;
}
}
return true;
}
```
上述代码定义了一个辅助函数 `isRowEmpty` 来检测某一行是否有任何有效的单元格值。对于每种类型的单元格(字符串型、数值型以及布尔型),都进行了相应的检查以确认它们不是默认状态下的空值。只有当所有单元格均为真正意义上的“空”时才会返回真;否则即表示此行为非空并可以继续后续的操作。
通过这种方式可以在调用 `getLastRowNum()` 后进一步过滤掉不需要考虑的完全空白行,从而实现更精确的数据处理流程。
阅读全文
相关推荐


















