Apache POI提供了什么函数来计算Excel文件中一个工作表中“非空”行的数量吗?第一次,我有一个包含10行数据的Excel工作表,函数worksheet.getPhysicalNumberOfRows()返回确切的数字(10)。但之后,我删除了3行,然而该函数仍然得到10行。可能总行数被POI缓存了。getPhysicalNumberOfRows()是什么意思?如其API所述:“返回物理定义的行数(而不是工作表的行数)”,但我不明白“物理定义”的含义。您能帮我解决这个问题吗?非常感谢!
int notNullCount = 0;
Sheet sheet = wb.getSheetAt(0);
for (Row row : sheet) {
for (Cell cell : row) {
if (cell.getCellType() != Cell.CELL_TYPE_BLANK) {
if (cell.getCellType() != Cell.CELL_TYPE_STRING ||
cell.getStringCellValue().length > 0) {
notNullCount++;
break;
}
}
}
}
如果您查看POI 3.8 beta 3的代码,您会发现删除一行也应该删除其记录。因此,文件中的物理行数也应该减少
我建议您尝试使用更新版本的POI
要计算文件中非空行的数量,请像Amadeus建议的那样循环遍历工作表中的行并检查它们是否有单元格。
如果您正在手动删除,请确保使用“删除行”而不仅仅是删除单元格中的数据,然后它将返回正确的值。
我曾经遇到过同样的问题。如果我手动删除行,仍然无法减少行数,当我使用sheet.getPhysicalNumberOfRows()进行检查时。
当我深入研究这个问题时,我发现了确切的问题。我在我的行中有一个电子邮件列,当我输入电子邮件地址时,MS Office会自动将其识别为电子邮件地址。当我手动删除整行时,携带电子邮件地址的单元格仍然具有""作为其值(它不可见,但是当我通过Java读取它时,我发现该值被初始化)。因此,由于此单元格具有非空值(""),整个行即被声明(某种程度上),并且行计数增加。
有趣的是,当我不输入电子邮件地址,只输入一些字符串然后删除该行时,该单元格不会被初始化,并且实际上行数减少了。这就是我解决问题的结果。
最后,我通过不仅为单元格添加null检查,而且
if(cell != "")
解决了这个问题。希望这对您有用。
public int getNonBlankRowCount(String sheetName){
int rowCount = 0;
int index = workbook.getSheetIndex(sheetName);
if(index==-1){
rowCount = -1;
return rowCount;
}else{
sheet = workbook.getSheetAt(index);
Iterator<Row> rowIterator = sheet.rowIterator();
rowCount = 0;
while (rowIterator.hasNext()) {
Row row = (Row) rowIterator.next();
cell = (HSSFCell) row.getCell(0);
String cellValue = cell.getStringCellValue();
if (cellValue.isEmpty()) {
break;
}
rowCount++;
}
return rowCount;
}
}