Apache POI会跳过从未更新过的行

时间:2015-05-29 01:06:52

标签: java apache apache-poi import-from-excel

在Apache POI中处理excel文件时,我注意到它会跳过某些空行。经过大量的反复试验后,我注意到Apache POI只能读取其单元格已经更新过的那些行。

我编写了一个简短的程序来读取XLSX(XSSF模型)文件中的行是否为空。这是我的输入excel文件:

enter image description here

private static boolean isRowEmpty(Row row) {
        boolean isRowEmpty = true;
        if (row != null) {
            for (Cell cell : row) {
                if (cell != null) {
                    System.out.println("Row:" + cell.getRowIndex() + " Col:"
                            + cell.getColumnIndex() + " Len:"
                            + cell.toString().length());
                    isRowEmpty = false;
                } else {
                    System.out.println("Cell is Null at Row "+row.getRowNum());
                }
            }
        } else {
            System.out.println("Row is Null");
        }
        return isRowEmpty;
}

for (Row row : sheet) {
    if (isRowEmpty(row)) {
        System.out.println("Empty row at " + row.getRowNum());
    }
}

输出

Row:0 Col:0 Len:1
Row:2 Col:0 Len:1
Row:3 Col:0 Len:1
Row:4 Col:0 Len:1
Row:5 Col:0 Len:1
Row:6 Col:1 Len:1
Row:7 Col:0 Len:1
Row:8 Col:2 Len:1

在单元格A5中,我输入了一个空间,由Apache POI检测到。从输出中可以看出,它不处理第2行(rownum 1)。

是否有任何解决方法,以便它提供以下输出:

Row:0 Col:0 Len:1
Empty Row at 1
Row:2 Col:0 Len:1
Row:3 Col:0 Len:1
Empty Row at 4
Row:5 Col:0 Len:1
Row:6 Col:1 Len:1
Row:7 Col:0 Len:1
Row:8 Col:2 Len:1

谢谢!

更新1

使用(cell != null && StringUtils.isNotBlank(cell.toString()))代替(cell != null)会给我以下输出:

Row:0 Col:0 Len:1
Row:2 Col:0 Len:1
Row:3 Col:0 Len:1
Cell is Null for Row 4
Empty row at 4
Row:5 Col:0 Len:1
Row:6 Col:1 Len:1
Row:7 Col:0 Len:1
Row:8 Col:2 Len:1

1 个答案:

答案 0 :(得分:0)

这完全符合预期,explained in the documentation

迭代器可以让生活更轻松地抓取包含内容的行和单元格(以及Excel随机仍包含在文件中的其他几个......)。

如果你想获取每一行和单元格,无论它们是否被定义,那么你需要遵循advice in the documentation并逐行和单元格编号,例如

// Decide which rows to process
int rowStart = Math.min(15, sheet.getFirstRowNum());
int rowEnd = Math.max(1400, sheet.getLastRowNum());

for (int rowNum = rowStart; rowNum < rowEnd; rowNum++) {
   Row r = sheet.getRow(rowNum);
   if (r == null) {
      // Handle there being no cells defined for this row
      continue;
   }

   // Decide how many columns to fetch for this row
   int lastColumn = Math.max(r.getLastCellNum(), MY_MINIMUM_COLUMN_COUNT);

   for (int cn = 0; cn < lastColumn; cn++) {
      Cell c = r.getCell(cn, Row.RETURN_BLANK_AS_NULL);
      if (c == null) {
         // The spreadsheet is empty in this cell
      } else {
         // Do something useful with the cell's contents
      }
   }
}