我正在使用 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());
}
}
如果您使用的是 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
是否为空 - 如果该行从未使用过且没有单元格被使用或设置样式,则该行本身可能为空!
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()
更改为 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
。blank
字符串时会产生副作用,因此将单元格类型隐式设置回
null
。
问候温克勒
从 Apache POI 3.17 开始,您必须使用枚举检查单元格是否为空:
import org.apache.poi.ss.usermodel.CellType;
if(cell == null || cell.getCellTypeEnum() == CellType.BLANK) { ... }
Cell cell = row.getCell(x, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK);
这个技巧对我帮助很大,看看对你有用吗
这是我认为从 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()
将被弃用,但返回类型应保持不变。
首先要避免 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
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++;
}
还有另一种选择。
row=(Row) sheet.getRow(i);
if (row == null || isEmptyRow(row)) {
return;
}
Iterator<Cell> cells = row.cellIterator();
while (cells.hasNext())
{}
.getCellType() != Cell.CELL_TYPE_BLANK
Cell.getCellType()
在最新的 POI API 中已弃用。如果您使用的是 POI API 版本 3.17,请使用以下代码:
if (Cell.getCellTypeEnum() == CellType.BLANK) {
//do your stuff here
}
您还可以使用开关盒,例如
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);
尝试下面的代码:
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());
}