错误:如何在Excel中读取空单元格

rif*_*nan 3 java excel apache-poi

我正在尝试使用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 = "";
}
Run Code Online (Sandbox Code Playgroud)

我在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");
      }
    }
  }
Run Code Online (Sandbox Code Playgroud)

小智 9

这是1参数版本的正常行为Row.getCell.如果查看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
}
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用另一个版本Row.getCell,它使用第二个参数指定缺少的单元格策略.此版本允许您指定getCell为空单元格返回空单元格.所以,这里有一些althernative代码:

HSSFRow row = sheet.getRow(rowNumber);
if (row != null) {
    HSSFCell cell = row.getCell(cellNumber, Row.RETURN_BLANK_AS_NULL);
    if (cell != null) {
        // process cell here
    }
}
Run Code Online (Sandbox Code Playgroud)

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


Gag*_*arr 5

如果你使用CellIterator,你将只获得在某个时候定义的细胞(没有null细胞,但你会得到blank细胞).如果要获取所有单元格,请通过索引获取它们

按索引,您可以执行以下操作:

 Sheet sheet = workbook.getSheetAt(0);
 for (int rowNumber = sheet.getFirstRowNum(); rowNumber <= sheet.getLastRowNum(); rowNumber++) {
    Row row = sheet.getRow(rowNumber);
    if (row == null) {
         // This row is completely empty
    } else {
         // The row has data
         for (int cellNumber = row.getFirstCellNum(); cellNumber <= row.getLastCellNum(); cellNumber++) {
             Cell cell = row.getCell(cellNumber);
             if (cell == null || cell.getCellType() == Cell.CELL_TYPE_BLANK) {
                 // This cell is empty
             } else {
                 // This cell has data in it
             }
         }
    }
 }
Run Code Online (Sandbox Code Playgroud)