Apache POI是否为我们提供了计算Excel文件中“非空”行数的任何功能?
第一次,我有一个包含10个数据行的Excel工作表,函数worksheet.getPhysicalNumberOfRows()返回确切的数字(10)。但在那之后,我删除3行,然后该功能仍然有10行。也许POI总是在任何地方缓存行总数。 getPhysicalNumberOfRows()是什么意思?正如其描述的API:“返回物理定义的行数(不是表单中的行数)”,但我不明白“物理定义”的含义。你能帮我解决这个问题吗?
非常感谢你!
答案 0 :(得分:3)
如果通过worksheet.removeRow(行行)删除行,则物理行计数应为7.
POI使用地图存储工作表的行。这张地图是物理部分。见http://www.google.com/codesearch/p?hl=de#WXzbfAF-tQc/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFSheet.java
对于逻辑上为空的行,请尝试
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;
}
}
}
}
答案 1 :(得分:0)
如果你看一下POI 3.8 beta 3的代码,你会发现删除一行也应该删除它的记录。因此,文件中的物理行数也应该下降
我建议您尝试使用较新版本的POI
要计算文件中非空行的数量,请执行Amadeus建议的操作并循环显示工作表上的行,并检查它们是否有单元格。
答案 2 :(得分:0)
如果您要手动删除,请确保使用删除行而不只是删除单元格中的数据,然后它将返回正确的值。
答案 3 :(得分:0)
我遇到了同样的问题。如果我手动删除行,当我使用sheet.getPhysicalNumberOfRows()检查时,仍然没有减少rowcount。
当我深入研究这个问题时,我发现了确切的问题。我的行中有一个电子邮件列,当我输入电子邮件地址时,MS Office会自动将其检测为电子邮件地址。当我手动删除整行时,携带电子邮件地址的单元格仍然具有“”作为其值(它将不可见,但我发现当我通过java读取它时,该值会被初始化)。因此,由于此单元格具有非空值(“”),因此整个行被声明(排序)并且行计数增加。
有趣的是,当我不输入电子邮件地址,只输入一些字符串然后删除该行时,单元格没有初始化,实际上 ROWCOUNT GOT DEGREASED 。这是我发现问题的结果。
最后,我解决了这个问题,不仅要为细胞添加空检查,还要
if(cell != "")
希望这可能对你有用