我正在使用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());
}
}
答案 0 :(得分:42)
怎么样:
Cell c = row.getCell(3);
if (c == null || c.getCellType() == Cell.CELL_TYPE_BLANK) {
// This cell is empty
}
答案 1 :(得分:22)
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
&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)
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++;
}