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
。
但最好仔细检查一下自己,因为他们计划在未来的版本中将其改回。
例子
这个 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
有用的资源
问候温克勒尔