如何使用 POI 库获取 Excel 文件中的行数?

问题描述 投票:0回答:8

伙计们,我目前正在使用 POI 3.9 库来处理 Excel 文件。我知道

getLastRowNum()
函数,它返回 Excel 文件中的多行。

唯一的问题是

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

因此,如果 Excel 文件使用前 3 行,则

getLastRowNum()
返回 2。 如果 Excel 文件只有 1 行,则
getLastRowNum()
返回 0。

当 Excel 文件完全为空时,就会出现此问题。

getLastRowNum()
仍然返回0,所以我无法确定Excel文件是否有1行数据,或者是否为空。

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

java excel apache-poi poi-hssf
8个回答

9
投票

由于

Sheet.getPhysicalNumberOfRows()
不计算空行,并且
Sheet.getLastRowNum()
在有一行或无行时都返回 0,因此我使用两种方法的组合来精确计算总行数。

int rowTotal = sheet.getLastRowNum();

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

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


5
投票

您可以做两件事

使用

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

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

它们之间有细微的差别

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

  2. 选项 2 只提供最后一列的索引。这样就完成了

    'getLastCellNum()'


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
投票

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

所以如果你想知道总行数 = getLastRowNum() +1。

我希望这会起作用。

int rowTotal = sheet.getLastRowNum() +1;

0
投票

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


0
投票

我使用 getPhysicalNumberOfRows() 方法获取实际数据时遇到同样的问题。但我的上传表也包含空白行,然后它导致问题并丢失了最后一些行。

我使用sheet.getLastRowNum() +1作为外部循环的行数,内部循环使用getPhysicalNumberOfRows()。

整体呈红色,工作正常。


-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++;
}
© www.soinside.com 2019 - 2024. All rights reserved.