2013-04-26 175 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++; 
} 

注意:这将把一个空行的电子表格视为没有,但对于大多数目的这可能是好的。

相关问题