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

7
Apache POI提供了什么函数来计算Excel文件中一个工作表中“非空”行的数量吗?第一次,我有一个包含10行数据的Excel工作表,函数worksheet.getPhysicalNumberOfRows()返回确切的数字(10)。但之后,我删除了3行,然而该函数仍然得到10行。可能总行数被POI缓存了。getPhysicalNumberOfRows()是什么意思?如其API所述:“返回物理定义的行数(而不是工作表的行数)”,但我不明白“物理定义”的含义。您能帮我解决这个问题吗?非常感谢!
5个回答

3
如果您通过worksheet.removeRow(Row row)删除行,则物理行数应为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;
            }
        }
    }
}

感谢您的回答。但是,如果这些行被用户手动删除,我们无法处理行数的变化。 - Đinh Hồng Châu
我之前遇到过类似的问题。我的解决方案是编写一些辅助函数来进行检查。 - easycoder

0

如果您查看POI 3.8 beta 3的代码,您会发现删除一行也应该删除其记录。因此,文件中的物理行数也应该减少

我建议您尝试使用更新版本的POI

要计算文件中非空行的数量,请像Amadeus建议的那样循环遍历工作表中的行并检查它们是否有单元格。


0

如果您正在手动删除,请确保使用“删除行”而不仅仅是删除单元格中的数据,然后它将返回正确的值。


0

我曾经遇到过同样的问题。如果我手动删除行,仍然无法减少行数,当我使用sheet.getPhysicalNumberOfRows()进行检查时。

当我深入研究这个问题时,我发现了确切的问题。我在我的行中有一个电子邮件列,当我输入电子邮件地址时,MS Office会自动将其识别为电子邮件地址。当我手动删除整行时,携带电子邮件地址的单元格仍然具有""作为其值(它不可见,但是当我通过Java读取它时,我发现该值被初始化)。因此,由于此单元格具有非空值(""),整个行即被声明(某种程度上),并且行计数增加。

有趣的是,当我不输入电子邮件地址,只输入一些字符串然后删除该行时,该单元格不会被初始化,并且实际上行数减少了。这就是我解决问题的结果。

最后,我通过不仅为单元格添加null检查,而且

if(cell != "")

解决了这个问题。希望这对您有用。


0
我们可以编写一个自定义方法来忽略空行以获取行数。可能我们可以根据需求做出一些假设。例如,在我的情况下,如果第一列的值为空,则可以将行视为空白,并且只需要计算到第一个空白行。
因此,以下代码片段可能会有用:
    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;
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接