Подтвердить что ты не робот

Как проверить, является ли ячейка excel пустой с помощью Apache POI?

Я беру данные из листа 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());

    }
}
4b9b3361

Ответ 1

Как насчет:

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

Ответ 2

Гаграварр ответ довольно хороший!


Проверьте, пуста ли ячейка 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.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

Ответ 3

Это самый безопасный и самый сжатый способ, который я вижу с 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() но возвращаемый тип должен оставаться неизменным.

Ответ 4

Начиная с Apache POI 3.17 вам нужно будет проверить, не является ли ячейка пустой с помощью перечислений:

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

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

Ответ 5

Есть и еще один вариант.

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

Ответ 6

.getCellType() != Cell.CELL_TYPE_BLANK

Ответ 7

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

Этот трюк очень помог мне, посмотри, полезен ли он для тебя

Ответ 8

Во-первых, чтобы избежать исключения 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

Ответ 9

Cell.getCellType() устарел в последнем API POI. Если вы используете API-интерфейс POI версии 3.17, используйте приведенный ниже код:

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