2013-04-26 12 views
29

夥計們我正在使用POI 3.9庫來處理excel文件。我知道getLastRowNum()函數,它在Excel文件中返回多個行。如何使用POI庫獲取Excel文件中的行數?

唯一的問題是getLastRowNum()返回從0

所以,如果一個Excel文件,使用第3行,開始getLastRowNum()返回2 計數的數字。如果一個Excel文件剛剛1排,getLastRowNum()回報0.

當Excel文件完全爲空時,會發生該問題。 getLastRowNum()仍然返回0,所以我無法確定Excel文件是否有1行數據,或者它是否爲空。

那麼如何檢測Excel文件是否爲空?

回答

55
+5

+1 Marcias。只需要按Delete鍵就可以刪除單元格,看起來好像行仍然以物理方式存在,並返回舊計數。 – anujin 2013-09-18 15:03:24

+1

嗯,我認爲如果你想計算實際上有一些非空值的行,你需要自行迭代它。我不確定,但我知道這個方法返回了一些曾經被「聲明」的行數。 – macias 2013-09-19 09:20:27

+1

警告:如果工作表有空行,getPhysicalNumberOfRows不會將它們包括在它返回的計數中。但是,getLastRowNum也完全符合它在罐子上所說的內容。因此,要遍歷所有需要使用getLastRowNum + 1作爲迭代循環的上限的行 - 小心處理可能不存在的行。 – 2016-07-15 13:04:38

2

如果你做一次檢查

if 
(getLastRowNum()<1){ 
res="Sheet Cannot be empty"; 
return 
} 

這將確保你至少有一個排,除了報頭數據。以下是我的程序工作正常。 Excel文件有三列,即。 ID,姓名,姓氏

XSSFWorkbook workbook = new XSSFWorkbook(inputstream); 
     XSSFSheet sheet = workbook.getSheetAt(0); 
     Row header = sheet.getRow(0); 
     int n = header.getLastCellNum(); 
     String header1 = header.getCell(0).getStringCellValue(); 
     String header2 = header.getCell(1).getStringCellValue(); 
     String header3 = header.getCell(2).getStringCellValue(); 
     if (header1.equals("ID") && header2.equals("NAME") 
       && header3.equals("LASTNAME")) { 
      if(sheet.getLastRowNum()<1){ 
       System.out.println("Sheet empty"); 
         return; 
      } 
         iterate over sheet to get cell values 
     }else{ 
          SOP("invalid format"); 
          return; 
          } 
+1

[docs](https://poi.apache.org/apidocs/org/apache/poi/xssf/usermodel/XSSFSheet.html#getLastRowNum)注意它基於零。所以'getLastRowNum()'會在沒有列的時候或者只有1的時候返回0(在你的情況下是標題)。所以爲了檢查是否有行,還應該使用getPhysicalNumberOfRows()。 – 2016-03-10 09:09:33

+0

也有[HSSF表單文檔](https://poi.apache.org/apidocs/org/apache/poi/hssf/usermodel/HSSFSheet.html#getLastRowNum())有關於此主題的更多內容。 – 2016-03-10 09:17:00

1

有兩件事情可以做

使用

int noOfColumns = sh.getRow(0).getPhysicalNumberOfCells(); 

int noOfColumns = sh.getRow(0).getLastCellNum(); 

有他們

    之間的細微差別
  1. 選項1給出了沒有這實際上是充滿了內容列(如果10列的第2列不填充你會得到9)

  2. 選項2只是給你最後一列的索引。因此完成'getLastCellNum()'

1

由於Sheet.getPhysicalNumberOfRows()不計數空行和Sheet.getLastRowNum()返回0二者是否有一排或沒有行,我使用這兩種方法的組合,以精確地計算出的行的總數。

int rowTotal = sheet.getLastRowNum(); 

if ((rowTotal > 0) || (sheet.getPhysicalNumberOfRows() > 0)) { 
    rowTotal++; 
} 

注意:這將把一個空行的電子表格視爲沒有,但對於大多數目的這可能是好的。

相關問題