54

伙计们,我目前正在使用 POI 3.9 库来处理 excel 文件。我知道这个getLastRowNum()函数,它返回 Excel 文件中的许多行。

唯一的问题是getLastRowNum()返回一个计数从 0 开始的数字。

因此,如果 Excel 文件使用前 3 行,则getLastRowNum()返回 2。如果 Excel 文件只有 1 行,则getLastRowNum()返回 0。

当 Excel 文件完全为空时会出现此问题。getLastRowNum()仍然返回 0,所以我无法确定 Excel 文件是否有 1 行数据,或者它是否为空。

那么如何检测 Excel 文件是否为空呢?

4

7 回答 7

100

尝试Sheet.getPhysicalNumberOfRows()

于 2013-04-26T11:28:56.820 回答
8

由于Sheet.getPhysicalNumberOfRows()不计算空行,Sheet.getLastRowNum()如果有一行或没有行都返回 0,所以我使用这两种方法的组合来准确计算总行数。

int rowTotal = sheet.getLastRowNum();

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

注意:这会将具有一个空行的电子表格视为没有,但对于大多数用途而言,这可能是可以的。

于 2017-11-23T19:15:54.733 回答
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;
                          }
于 2013-09-24T10:13:58.920 回答
2

你可以做两件事

采用

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

或者

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

它们之间有细微的差别

  1. 选项 1 给出了实际填充内容的列数(如果 10 列的第二列未填充,您将得到 9)

  2. 选项 2 只是为您提供最后一列的索引。因此完成'getLastCellNum()'

于 2015-08-28T10:36:02.120 回答
0

getLastRowNum() 返回最后一行的索引。

因此,如果您想知道总行数 = getLastRowNum() +1。

我希望这会奏效。

int rowTotal = sheet.getLastRowNum() +1;
于 2020-03-05T07:58:39.733 回答
0

Sheet.getPhysicalNumberOfRows()不涉及一些空行。如果要循环所有行,请不要使用它来了解循环大小。

于 2020-08-06T15:52:26.833 回答
-1

要查找最后一个数据行,以防您在 excel 中创建了部分填充的表格模板或行之间为空的表格模板。逻辑:

int count = 0;
int emptyrow=0;
int irow=0;
while (rowIterator.hasNext()) {
    row = (Row) rowIterator.next();
    if (count != 0 && !checkIfRowIsEmpty(row)) { }
    else{
        if(count!=0 && emptyrow==irow){
            emptyrow++;
        }else{
            emptyrow=0;
            irow=0;
        }
    }
    if(emptyrow>0){
        irow++;
    }
    if(emptyrow>3){
        break;
    }
    count++;
}
于 2019-01-31T06:51:06.920 回答