45

我正在使用 Poi.jar 从 Excel 表中获取输入,并且想知道如何检查单元格是否为空。

现在我正在使用下面的代码。

cell = myRow.getCell(3);
if (cell != null) {
    cell.setCellType(Cell.CELL_TYPE_STRING);

    //System.out.print(cell.getStringCellValue() + "\t\t");
    if (cell.getStringCellValue() != "")
        depend[p] = Integer.parseInt(cell.getStringCellValue());

    }
}
4

12 回答 12

69

如果您使用的是 Apache POI 4.x,您可以这样做:

 Cell c = row.getCell(3);
 if (c == null || c.getCellType() == CellType.Blank) {
    // This cell is empty
 }

CellType对于在迁移到枚举之前的旧 Apache POI 3.x 版本,它是:

 Cell c = row.getCell(3);
 if (c == null || c.getCellType() == Cell.CELL_TYPE_BLANK) {
    // This cell is empty
 }

不要忘记检查是否Row为空 - 如果该行从未使用过且未使用任何单元格或设置样式,则该行本身可能为空!

于 2013-04-03T05:21:16.583 回答
31

Gagravarr的回答相当不错!


检查excel单元格是否为空

但是,如果您假设一个单元格包含空字符串( "") 时也是空的,则需要一些额外的代码。如果单元格被编辑然后未正确清除,则可能会发生这种情况(有关如何正确清除单元格,请参见下文)。

我给自己写了一个助手来检查一个XSSFCell是否为空(包括一个空字符串)。

 /**
 * Checks if the value of a given {@link XSSFCell} is empty.
 * 
 * @param cell
 *            The {@link XSSFCell}.
 * @return {@code true} if the {@link XSSFCell} is empty. {@code false}
 *         otherwise.
 */
public static boolean isCellEmpty(final XSSFCell cell) {
    if (cell == null) { // use row.getCell(x, Row.CREATE_NULL_AS_BLANK) to avoid null cells
        return true;
    }

    if (cell.getCellType() == Cell.CELL_TYPE_BLANK) {
        return true;
    }

    if (cell.getCellType() == Cell.CELL_TYPE_STRING && cell.getStringCellValue().trim().isEmpty()) {
        return true;
    }

    return false;
}

注意更新的 POI 版本

他们首先更改getCellType()getCellTypeEnum()版本3.15 Beta 3,然后移回getCellType()版本4.0

  • 版本>= 3.15 Beta 3

    • 使用CellType.BLANKandCellType.STRING代替Cell.CELL_TYPE_BLANKandCell.CELL_TYPE_STRING
  • 版本>= 3.15 Beta 3&& 版本< 4.0

    • 使用Cell.getCellTypeEnum()代替Cell.getCellType()

但最好仔细检查一下自己,因为他们计划在未来的版本中将其改回。


例子

这个 JUnit 测试显示了需要额外的空检查的情况。

场景:单元格的内容在 Java 程序中发生更改。稍后,在同一个 Java 程序中,检查单元格是否为空。isCellEmpty(XSSFCell cell)如果函数不检查空字符串,测试将失败。

@Test
public void testIsCellEmpty_CellHasEmptyString_ReturnTrue() {
    // Arrange
    XSSFCell cell = new XSSFWorkbook().createSheet().createRow(0).createCell(0);

    boolean expectedValue = true;
    boolean actualValue;

    // Act
    cell.setCellValue("foo");
    cell.setCellValue("bar");
    cell.setCellValue(" ");
    actualValue = isCellEmpty(cell);

    // Assert
    Assert.assertEquals(expectedValue, actualValue);
}

另外:正确清除一个单元格

以防万一有人想知道如何正确清除单元格的内容。有两种存档方法(我推荐方式 1)。

// way 1
public static void clearCell(final XSSFCell cell) {
    cell.setCellType(Cell.CELL_TYPE_BLANK);
}

// way 2
public static void clearCell(final XSSFCell cell) {
    String nullString = null;
    cell.setCellValue(nullString); 
}

为什么选择方式 1?显式优于隐式(感谢 Python)

方式 1:将单元类型显式设置回blank.
方式 2:由于将单元格值设置为字符串时的副作用,将单元格类型隐式设置回。blanknull


有用的资源

问候温克勒尔

于 2015-11-16T09:38:26.677 回答
5

从 Apache POI 3.17 开始,您必须使用枚举检查单元格是否为空:

import org.apache.poi.ss.usermodel.CellType;

if(cell == null || cell.getCellTypeEnum() == CellType.BLANK) { ... }
于 2018-04-24T17:04:56.857 回答
3
Cell cell = row.getCell(x, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK);

这个技巧对我帮助很大,看看它是否对你有用

于 2018-02-19T09:35:21.073 回答
2

这是我从 POI 3.1.7 到 POI 4 看到的最安全、最简洁的方式:

boolean isBlankCell = CellType.BLANK == cell.getCellTypeEnum();
boolean isEmptyStringCell = CellType.STRING == cell.getCellTypeEnum() && cell.getStringCellValue().trim().isEmpty(); 

if (isBlankCell || isEmptyStringCell) {
    ...

从 POI 4getCellTypeEnum()开始,如果支持,将不推荐使用,getCellType()但返回类型应保持不变。

于 2018-11-30T13:10:56.780 回答
2

首先要避免 NullPointerException 你必须添加这个

Row.MissingCellPolicy.CREATE_NULL_AS_BLANK

这将创建一个空白单元格而不是给你 NPE 然后你可以检查以确保没有出错,就像@Gagravarr 所说的那样。

Cell cell = row.getCell(j, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK);
    if (cell == null || cell.getCellTypeEnum() == CellType.BLANK) 
        // do what you want
于 2018-05-02T19:06:06.753 回答
1

Row.MissingCellPolicy.CREATE_NULL_AS_BLANK在我的情况下是有效的。

total_colume = myRow.getLastCellNum();
int current_colume = 0;
HSSFCell ReadInCellValue;

while (current_colume <= total_colume) {
   ReadInCellValue = myRow.getCell(current_colume, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK);//if cell is empty, return black
   if (ReadInCellValue.toString=="") Log.d("empty cell", "colume=" + String.valuOf(current_colume));
   current_colume++;
}
于 2021-05-18T11:23:51.357 回答
0

您也可以使用开关盒,例如

                    String columndata2 = "";
                    if (cell.getColumnIndex() == 1) {// To match column index

                        switch (cell.getCellType()) {
                            case Cell.CELL_TYPE_BLANK:
                                columndata2 = "";
                                break;
                            case Cell.CELL_TYPE_NUMERIC:
                                columndata2 = "" + cell.getNumericCellValue();
                                break;
                            case Cell.CELL_TYPE_STRING:
                                columndata2 = cell.getStringCellValue();
                                break;
                        }

                    }
                    System.out.println("Cell Value "+ columndata2);
于 2020-02-21T13:10:27.090 回答
0

Cell.getCellType()在最新的 POI API 中已弃用。如果您使用的是 POI API 版本 3.17,请使用以下代码:

if (Cell.getCellTypeEnum() == CellType.BLANK) {
    //do your stuff here
}
于 2018-09-04T00:31:44.770 回答
0

还有另一种选择。

row=(Row) sheet.getRow(i);
        if (row == null || isEmptyRow(row)) {
            return;
        }
Iterator<Cell> cells = row.cellIterator();
    while (cells.hasNext())
     {}
于 2015-09-22T04:22:33.347 回答
0
.getCellType() != Cell.CELL_TYPE_BLANK
于 2017-12-15T18:45:30.187 回答
0

试试下面的代码:

String empty = "-";
if (row.getCell(3) == null || row.getCell(3).getCellType() == Cell.CELL_TYPE_BLANK) {
    upld.setValue(empty);
} else {
    upld.setValue(row.getCell(3).getStringCellValue());
}
于 2020-07-07T11:07:13.893 回答