首页 文章

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

提问于
浏览
4

Apache POI是否为我们提供了计算Excel文件中"not-null"行数的任何功能?
第一次,我有一个包含10个数据行的Excel工作表,函数worksheet.getPhysicalNumberOfRows()返回确切的数字(10) . 但在那之后,我删除3行,然后该功能仍然获得10行 . 也许POI总是在任何地方缓存行总数 . getPhysicalNumberOfRows()是什么意思?正如其描述的API:"Returns the number of physically defined rows (NOT the number of rows in the sheet)",但我不明白"physically defined"是什么意思 . 你能帮我解决这个问题吗?
非常感谢!

5 回答

  • 0

    如果通过worksheet.removeRow(行行)删除行,则物理行计数应为7 .

    POI使用 Map 存储工作表的行 . 这张 Map 是物理部分 . 见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;
                }
            }
        }
    }
    
  • 0

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

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

    要计算文件中非空行的数量,请执行Amadeus建议的操作并循环工作表上的行并检查它们是否有单元格 .

  • 0

    如果要手动删除,请确保使用删除行而不只是删除单元格中的数据,然后它将返回正确的值 .

  • 3

    我有同样的问题 . 如果我手动删除行,当我使用sheet.getPhysicalNumberOfRows()检查时,仍然没有减少rowcount .

    当我深入研究这个问题时,我发现了确切的问题 . 我的行中有一个电子邮件列,当我输入电子邮件地址时,MS Office会自动将其检测为电子邮件地址 . 当我手动删除整行时,携带电子邮件地址的单元格仍然具有“”作为其值(它将不可见,但我发现当我通过java读取它时,该值会被初始化) . 因此,由于此单元格具有非空值(“”),因此整个行被声明(排序)并且行计数增加 .

    有趣的是,当我不输入电子邮件地址,只输入一些字符串然后删除行时,单元格没有初始化,实际上是 ROWCOUNT GOT DECREASED . 这是我发现问题的结果 .

    最后,我解决了这个问题,不仅要为细胞添加空检查,还要

    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;
        }
    }
    

相关问题