sheet.getRow(rowIndex) 返回 NULL - APACHE POI

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

我正在使用 APACHE POI 库读取 xlsx 格式的 excel 文件。

我的问题是我想从这个Excel的每张表中删除最后一行,我找到了一种方法来找到要删除的最后一行,但它返回一个int。方法sheet.removeRow(Row var1);可以解决我的问题。

嗯,有我想要删除的行号和删除该行的方法。我只需要将lastRow (int) 转换为Row 类型,这样我就可以使用sheet.removeRow 方法。

为此,我使用了以下代码: Row a =sheet.getRow(lastRow) 此方法应返回具有该索引的行。但它却返回 NULL。

知道我做错了什么或者如何将我想要删除的行号转换为 Row 类型吗?

感谢您的帮助!

这是读取我的 Excel 文件的代码摘录

    public static List<Measure> excelToMeasures(InputStream is, ProjectMeasureFile projectMeasureFile) throws IOException {

    List<Measure> measures = new ArrayList<>();

    try (Workbook workbook = new XSSFWorkbook(is)) {

        for (int i = 0; i < 3; i++) {
            Sheet sheet = workbook.getSheetAt(i);

            int lastRow = sheet.getPhysicalNumberOfRows() -1;

            removeRow(sheet, lastRow);

            int rowNumber = 0;
            for (Row row : sheet) {

                // skip header
                if (rowNumber == 0) {
                    rowNumber++;
                    continue;
                }

                Iterator<Cell> cellIterator = row.iterator();
                List<Cell> cellObject = new ArrayList<>();

                while (cellIterator.hasNext()) {
                    cellObject.add(cellIterator.next());
                }

                if (cellObject.size() > 0) {
                    Measure measure = new Measure();
                    measure.setArea(sheet.getSheetName());
                    measure.setCode(convertStringCell(cellObject.get(0)));
                    measure.setBehavior(convertStringCell(cellObject.get(1)));

                    measure.setHumanDependencyFactor(convertNumericCell(cellObject.get(2)));
                    Double measureType = convertToPercentage(measure.getHumanDependencyFactor());
                    measure.setHumanDependencyFactor(measureType);

                    measure.setMeasurementResults(convertNumericCell(cellObject.get(3)));
                    Double value = convertToPercentage(measure.getMeasurementResults());
                    measure.setMeasurementResults(value);

                    measure.setProjectMeasureFile(projectMeasureFile);
                    measures.add(measure);
                }

                rowNumber++;
            }
        }

    } catch (Exception e) {
        log.error("An error occurred when trying to parse the file.");
        e.printStackTrace();
    }

    return measures;
}

这是删除行的方法:

  public static void removeRow(Sheet sheet, int rowIndex) {
    int lastRowNum = sheet.getPhysicalNumberOfRows() -1;

    if (rowIndex == lastRowNum) {
        Row removingRow = sheet.getRow(rowIndex);
        sheet.getRow(rowIndex);
        Row a = sheet.getRow(rowIndex);
        if (removingRow != null) {

           
            System.out.println(sheet.getRow(lastRowNum).getCell(0).toString());
           
            sheet.removeRow(removingRow); 
        }
    }
}
java excel apache-poi
2个回答
2
投票

首先到你的问题的标题:

Sheet.getRow
将按设计返回
NULL
。如果行索引后面的行未存储在工作表中,则返回
NULL
。因此,您始终需要在
NULL
之后检查
Sheet.getRow
Row.getCell
也是如此,对于未存储在行中的单元格,它会返回
NULL

并且

Sheet.getPhysicalNumberOfRows
不是获取工作表最后一行的正确方法。

Excel
工作表仅在物理上包含存储有单元格的行。完全空的行不会被物理存储。因此,如果工作表仅包含第 1、2、5、6 和 7 行中的数据,则
Sheet.getPhysicalNumberOfRows
将返回 5,但最后一行是 7。

Sheet.getLastRowNum
可以获取工作表中的最后一行号(从 0 开始)。因此,在上面的示例中将返回 6,并且
sheet.getRow(6)
将获得最后一行,而不是
NULL

但是还有一个问题需要考虑。在

Excel
中,行可能不是完全空的,而是仅包含空白单元格。空白单元格可能会被存储,因为它们具有单元格格式或之前有内容。
Sheet.getLastRowNum
获取最后一个 stored 行,即使该行仅包含空白单元格。因此,您需要通过迭代单元格来检查
Sheet.getLastRowNum
后面的行是否仅包含空白单元格,并检查
CellType.BLANK
如果您需要最后一个 filled 行。

以下方法获取工作表中最后填充的行。如果未找到填充行,则返回

NULL

 Row getLastFilledRow(Sheet sheet) {
  int lastStoredRowNum = sheet.getLastRowNum();
  for (int r = lastStoredRowNum; r >= 0; r--) {
   Row row = sheet.getRow(r);
   if (row != null) {
    for (Cell cell : row) {
     if (cell.getCellType() != CellType.BLANK) return row;  
    }
   }       
  }
  return null;  
 }

0
投票

我遇到了这个问题。我使用 XSSFWorkbook 而不是 SXSSFWorkbook 作为解决方案。

final XSSFWorkbook workbook = new XSSFWorkbook(inputStream);
© www.soinside.com 2019 - 2024. All rights reserved.