2011-06-08 42 views
4

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

回答

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

谢谢您的回答。但是,如果这些行被用户手动删除,我们无法处理这种行数的变化。 – 2011-06-08 08:47:01

+0

我以前有类似的问题。我的解决方案是编写一些帮助函数来检查。 – easycoder 2011-08-16 17:48:01

0

如果你看一下POI 3.8 Beta 3中的代码,你会看到移除一行还应该删除其记录。因此,物理行的文件的数量应该下降太多

我建议你用POI

较新版本的尝试计算一个文件非空行的数目,这样做Amadeus建议并在表单上的行上循环,并检查它们是否有单元格。

0

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

0

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

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

有趣的是,当我不输入电子邮件地址,只需输入一些字符串,然后删除该行,单元格没有得到初始化和实际上已被初始化和ROWCOUNT GOT DECEDASED。这是我发现我的问题的结果。

我终于解决了,不仅通过addding为细胞空检查,但也

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; 
    } 
} 
相关问题