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

时间:2013-04-02 12:42:54

标签: java apache-poi

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

    }
}

12 个答案:

答案 0 :(得分:42)

怎么样:

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

答案 1 :(得分:22)

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.BLANKCellType.STRING代替Cell.CELL_TYPE_BLANKCell.CELL_TYPE_STRING
  • 版本>= 3.15 Beta 3&amp;&amp;版本< 4.0

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

但更好double check yourself,因为他们计划在将来的版本中将其更改回来。

实施例

此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

有用的来源

关心winklerrr

答案 2 :(得分: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) {
    ...

如果赞成getCellTypeEnum(),则从POI 4开始getCellType()将被弃用,但返回类型应保持不变。

答案 3 :(得分:1)

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

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

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

答案 4 :(得分:0)

还有另一种选择。

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

答案 5 :(得分:0)

.getCellType() != Cell.CELL_TYPE_BLANK

答案 6 :(得分:0)

Cell cell = row.getCell(x, Row.CREATE_NULL_AS_BLANK);

这个技巧对我有很大帮助,看看它对你有用吗<​​/ p>

答案 7 :(得分:0)

首先要避免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

答案 8 :(得分:0)

最新的POI API中不推荐使用

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

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

答案 9 :(得分: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);

答案 10 :(得分: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());
}

答案 11 :(得分:0)

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