Java 使用poi包 读excel文件时,获取指定sheet页中数据行数可以通过调用 sheet.getLastRowNum() ;但这种方法仅限于当前sheet页中没有带格式的空白行时。如果其中一行的数据都为空,但是其原本的格式还在,此时使用getLastRowNum()方法计算出来的行数就不正确(比真实行数大)。
那么如何跳过当前sheet页中没有意义的行正确获取excel的真实行数呢?
可以对当前sheet页中的各行进行过滤,将没有意义的行删掉,然后再调用sheet.getLastRowNum() 即可得到真实行。
代码实现
1、方法getVaildRows()获取指定excel的真实行数
public static int getVaildRows(String path) throws IOException, InvalidFormatException {
FileInputStream excelFileInputStream = new FileInputStream(path);
Workbook wb = WorkbookFactory.create(excelFileInputStream);
Sheet sheet = wb.getSheetAt(0);
CellReference cellReference = new CellReference("A4");
boolean flag = false;
for (int i = cellReference.getRow(); i <= sheet.getLastRowNum(); ) {
Row r = sheet.getRow(i);
if (r == null) {
// 如果是空行(即没有任何数据、格式),直接把它以下的数据往上移动
sheet.shiftRows(i + 1, sheet.getLastRowNum(), -1);
continue;
}
flag = false;
for (Cell c : r) {
if (c.getCellType() != Cell.CELL_TYPE_BLANK) {
flag = true;
break;
}
}
if (flag) {
i++;
continue;
} else {//如果是空白行(即可能没有数据,但是有一定格式)
if (i == sheet.getLastRowNum())//如果到了最后一行,直接将那一行remove掉
sheet.removeRow(r);
else//如果还没到最后一行,则数据往上移一行
sheet.shiftRows(i + 1, sheet.getLastRowNum(), -1);
}
}
return sheet.getLastRowNum() + 1;
}
2、测试
public static void main(String[] args) throws IOException, InvalidFormatException {
String path ="E:\\file\\2.0\\sc\\0101010330202\\0101010330202.xlsx";
int rows = getVaildRows(path);
System.out.println("总行数:"+rows);
}
输出结果:
总行数:21
网友评论