直接上解决方案
本次解决的poi的版本为3.8,如果实际操作中对象不存在或过期可以增加版本的考虑因素。在方法中,遍历每一行和单元格,判断是否为空白行。如果是空白行,则直接调用 Sheet 的 removeRow() 方法删除该行。最后,将真实行数作为方法的返回值返回即可。
/**
* 获取准确的文件行数,并返回Sheet对象
* @param workbook Excel文件
* @return Sheet对象
*/
public Sheet countRealRowsAndRemoveBlankRows(Workbook workbook) {
//默认Excel第一页为数据
Sheet sheet = workbook.getSheetAt(0);
int lastRowNum = sheet.getLastRowNum();
for (int i = 0; i <= lastRowNum; i++) {
Row row = sheet.getRow(i);
if (row != null) {
boolean allBlank = true;
for (int j = 0; j < row.getLastCellNum(); j++) {
Cell cell = row.getCell(j);
if (cell == null || cell.getCellType() == HSSFCell.CELL_TYPE_BLANK) {
cell = row.createCell(j, HSSFCell.CELL_TYPE_BLANK);
}
if (cell.getCellType() != HSSFCell.CELL_TYPE_BLANK) {
allBlank = false;
break;
}
}
if (allBlank) {
sheet.removeRow(row);
}
}
}
return sheet;
}
补充新版本的参考解决方案
int lastRowNum = sheet.getLastRowNum();
int physicalNumOfRows = sheet.getPhysicalNumberOfRows();
int realNumOfRows = 0;
for (int i = 0; i <= lastRowNum; i++) {
Row row = sheet.getRow(i);
if (row != null) {
boolean allBlank = true;
for (int j = 0; j < row.getLastCellNum(); j++) {
Cell cell = row.getCell(j, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK);
if (cell.getCellType() != CellType.BLANK) {
allBlank = false;
break;
}
}
if (!allBlank) {
realNumOfRows++;
}
}
}
System.out.println("lastRowNum: " + lastRowNum); // 599
System.out.println("physicalNumOfRows: " + physicalNumOfRows); // 600
System.out.println("realNumOfRows: " + realNumOfRows); // 5
网友评论