2011-06-08 104 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; 
    } 
}