当前位置: 首页 > 知识库问答 >
问题:

如何使用ApachePOI检查excel单元格是否为空?

顾兴昌
2023-03-14

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

    }
}

共有3个答案

郎和志
2023-03-14

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

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

if(cell == null || cell.getCellTypeEnum() == CellType.BLANK) { ... }
谷梁博易
2023-03-14

Gagravarr的回答很好!

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

我给自己写了一个助手来检查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()作为Version3.15 Beta 3,然后返回到getCellType()作为Version4.0

>

  • 版本<代码>

    • 使用CellType。BLANKCellType。STRING代替单元格。CELL_TYPE_BLANK和单元格。CELL_TYPE_STRING

    版本<代码>

    • 使用单元格。getCellTypeEnum()而不是单元格。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); 
    }
    

    为什么是第一条路?显式比隐式好(谢谢,Python)

    方法1:将单元格类型显式设置回空白
    方式2:由于将单元格值设置为null字符串时会产生副作用,因此会将单元格类型隐式设置回blank

    • 官方文件
      • CellType
      • XSSFCell.setCellValue(String)
      • Cell.setCellType(CellType)

      问候温克勒

  • 邴俊友
    2023-03-14

    如果您使用的是ApachePOI4。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是否为空-如果该行从未使用过任何单元格或样式,该行本身可能为空!

     类似资料:
    • 问题内容: 我使用函数 row_values 和 col_values 处理Excel文件: 例如, 我将col_values作为list 。如果我在某个列中遇到一个空单元格该怎么办?例如,单元格(1,1)不为空,单元格(1,2)为空,而单元格(1,3)不为空?如何检测单元格(1,2)为空? 我得到的列表中包含一个空字符串作为一个空单元格的值(对于大多数生成Excel文件的知名程序)是否正确? 问

    • 示例Excel文件我正在使用下面提到的是我使用的代码,但它是不工作的。我的要求是分离出每个测试步骤并存储它。我已经使用“Alt+Enter”在同一个单元格中写入多行。如果用apache POI处理单元格数据时能检测到“Alt+Enter”,我就可以很容易地分离我提到的行。

    • 问题内容: 我试图仅使用jQuery在HTML元素为空的情况下调用函数。 像这样: 问题答案: 编辑: 正如某些人指出的那样,浏览器对空元素的解释可能会有所不同。如果您想忽略不可见的元素(例如空格和换行符)并使实现更加一致,则可以创建一个函数(或仅使用其中的代码)。 您也可以将其放入jQuery插件,但是您知道了。

    • 我正在使用Java Apache POI库。在这里,我想在下面的方法(getExcellContent)中检查给定的单元格是否为空。我如何检查? 如果传递的单元格为空,则我收到致命错误,如果我使用的是getCellType()(“int getType = sheet1.getRow(row).getCell(col).getCellType();”)。我想在使用getCellType之前检查给定

    • 我一直在用POI编写一个代码来将数据输入到Excel表中。首先,我需要遍历一组行,我不确定其中有多少行,可能是10或100行。但我发现末尾有一个空白单元格。在那个空白之后,又有一组行。我不担心第二盘。我需要找到第一盘是否已经结束。 这很让人困惑。现在我有5个用户在我的工作表如下所示。在第5个用户之后有一个空白单元格。我试图打印所有的用户,如果有一个空白停止它。

    • 问题内容: 我只想检查Pandas系列中的单个单元格是否为null,即检查值是否为。 所有其他答案适用于序列和数组,但不适用于单个值。 我已经试过,,。是否只有一个单一值的解决方案? 问题答案: 尝试这个: