使用Apache POI在Excel文件中计算非空行

时间:2011-06-08 07:45:30

标签: java apache excel apache-poi

Apache POI是否为我们提供了计算Excel文件中“非空”行数的任何功能?
第一次,我有一个包含10个数据行的Excel工作表,函数worksheet.getPhysicalNumberOfRows()返回确切的数字(10)。但在那之后,我删除3行,然后该功能仍然有10行。也许POI总是在任何地方缓存行总数。 getPhysicalNumberOfRows()是什么意思?正如其描述的API:“返回物理定义的行数(不是表单中的行数)”,但我不明白“物理定义”的含义。你能帮我解决这个问题吗? 非常感谢你!

4 个答案:

答案 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 != "")

希望这可能对你有用