如何使用 Apache POI 检查 Excel 单元格是否为空?

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

我正在使用 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());

    }
}
java apache-poi
12个回答
80
投票

如果您使用的是 Apache POI 4.x,您可以使用以下命令来实现:

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

对于旧版 Apache POI 3.x 版本(早于迁移到

CellType
枚举),它是:

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

不要忘记检查

Row
是否为空 - 如果该行从未使用过且没有单元格被使用或设置样式,则该行本身可能为空!


34
投票

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.BLANK
      CellType.STRING
      代替
      Cell.CELL_TYPE_BLANK
      Cell.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:由于将单元格值设置为 blank 字符串时会产生副作用,因此将单元格类型
隐式
设置回
null


有用的资源

问候温克勒


6
投票

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

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

if(cell == null || cell.getCellTypeEnum() == CellType.BLANK) { ... }

4
投票
Cell cell = row.getCell(x, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK);

这个技巧对我帮助很大,看看对你有用吗


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 4 开始,如果支持

getCellTypeEnum()
,则
getCellType()
将被弃用,但返回类型应保持不变。


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

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++;
}

0
投票

还有另一种选择。

row=(Row) sheet.getRow(i);
        if (row == null || isEmptyRow(row)) {
            return;
        }
Iterator<Cell> cells = row.cellIterator();
    while (cells.hasNext())
     {}

0
投票
.getCellType() != Cell.CELL_TYPE_BLANK

0
投票

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

if (Cell.getCellTypeEnum() == CellType.BLANK) {
    //do your stuff here
}

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);

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());
}
© www.soinside.com 2019 - 2024. All rights reserved.