我正在尝试使用POI从excel读取数据。如何检查那是一个空的单元格?

我不知道缺少什么,我认为这应该起作用:

java.util.Iterator<Row> rows = worksheet.rowIterator();

HSSFRow row = (HSSFRow) rows.next();
HSSFCell cellF1 = (HSSFCell) row.getCell(5);
if(cellF1.getCellType() == HSSFCell.CELL_TYPE_BLANK) {
  String val = "";
}

我在if语句(空指针)中遇到错误,但是只有在使用此语句时,我才能检查该错误:
   while (rows.hasNext()) {
    HSSFRow row = (HSSFRow) rows.next();
    java.util.Iterator<Cell> cells = row.cellIterator();
    while (cells.hasNext()) {
      HSSFCell cell = (HSSFCell) cells.next();
      if(cell.getCellType() == HSSFCell.CELL_TYPE_BLANK) {
        String emptytype = "";
        System.out.println("empty");
      }
    }
  }

最佳答案

这是Row.getCell的1参数版本的正常行为。如果查看API文档,它会特别指出,如果未定义单元格,则getCell将返回null。许多Java函数都表现出这种行为,因此考虑到这一点,编码没有错。因此,您的代码的一个版本可能类似于:

boolean hasDataFlag = true;
HSSFRow row = sheet.getRow(rowNumber);
hasDataFlag = (row != null);
HSSFCell cell = null;
if (hasDataFlag) cell = row.getCell(cellNumber);
hasDataFlag = (cell != null);
if (hasDataFlag) hasDataFlag = (cell.getCellType() != Cell.CELL_TYPE_BLANK);
if (hasDataFlag) {
    // process the cell here
}

或者,您可以使用其他版本的Row.getCell,该版本使用第二个参数来指定缺少的单元格策略。此版本允许您指定getCell返回空白单元格的空单元格。因此,这是一些替代代码:
HSSFRow row = sheet.getRow(rowNumber);
if (row != null) {
    HSSFCell cell = row.getCell(cellNumber, Row.RETURN_BLANK_AS_NULL);
    if (cell != null) {
        // process cell here
    }
}

或者,如果您愿意,可以将策略指定为Row.CREATE_NULL_AS_BLANK。在这种情况下,您可以将if (cell != null)替换为if (cell.getCellType() != Cell.CELL_TYPE_BLANK)

10-06 12:42
查看更多