Ответ 1
Как насчет:
Cell c = row.getCell(3);
if (c == null || c.getCellType() == Cell.CELL_TYPE_BLANK) {
// This cell is empty
}
Я беру данные из листа excel с помощью Poi.jar и хотел знать, как проверить, является ли ячейка пустой или нет.
Сейчас я использую код ниже.
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());
}
}
Как насчет:
Cell c = row.getCell(3);
if (c == null || c.getCellType() == Cell.CELL_TYPE_BLANK) {
// This cell is empty
}
Гаграварр ответ довольно хороший!
Но если вы предполагаете, что ячейка также пуста, если она содержит пустую строку (""
), вам потребуется дополнительный код. Это может произойти, если ячейка была отредактирована, а затем не очищена должным образом (подробнее о том, как правильно очистить ячейку, см. ниже).
Я написал себе помощника, чтобы проверить, пуст ли 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
.
Способ 2: для типа ячейки неявно возвращается значение blank
из-за побочного эффекта при установке значения ячейки в строку null
.
С уважением Winklerrr
Это самый безопасный и самый сжатый способ, который я вижу с 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()
но возвращаемый тип должен оставаться неизменным.
Начиная с Apache POI 3.17 вам нужно будет проверить, не является ли ячейка пустой с помощью перечислений:
import org.apache.poi.ss.usermodel.CellType;
if(cell == null || cell.getCellTypeEnum() == CellType.BLANK) { ... }
Есть и еще один вариант.
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 cell = row.getCell(x, Row.CREATE_NULL_AS_BLANK);
Этот трюк очень помог мне, посмотри, полезен ли он для тебя
Во-первых, чтобы избежать исключения 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
Cell.getCellType()
устарел в последнем API POI. Если вы используете API-интерфейс POI версии 3.17, используйте приведенный ниже код:
if (Cell.getCellTypeEnum() == CellType.BLANK) {
//do your stuff here
}