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

18

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

    }
}
    
задан user1312312 02.04.2013 в 14:42
источник

4 ответа

30

Как насчет:

 Cell c = row.getCell(3);
 if (c == null || c.getCellType() == Cell.CELL_TYPE_BLANK) {
    // This cell is empty
 }
    
ответ дан Gagravarr 03.04.2013 в 07:21
источник
  • это дает мне NPE в некоторых случаях –  tanvi 07.01.2015 в 10:32
  • Вам нужно убедиться, что строка не является нулевой - здесь код будет работать нормально для непустой строки, поскольку он уже содержит проверку нулевой ячейки! –  Gagravarr 07.01.2015 в 11:42
  • Умм, а как насчет if (row == null) {// Что-то делать для пустой строки}? –  Gagravarr 08.01.2015 в 11:39
  • @winklerrr Excel должен написать пустую строку как пустую ячейку, так что этого не должно произойти –  Gagravarr 16.11.2015 в 11:12
  • @irJvV Вам просто нужно подождать Apache POI 4.0, тогда этого не будет, это часть перетасовки из int для перечисления! –  Gagravarr 22.02.2018 в 16:19
Показать остальные комментарии
12

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

Проверить, что ячейка 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 || cell.getCellType() == Cell.CELL_TYPE_BLANK) {
        return true;
    }

    if (cell.getCellType() == Cell.CELL_TYPE_STRING && cell.getStringCellValue().isEmpty()) {
        return true;
    }

    return false;
}

Пример

В этом тесте 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);
}

Кроме того: очистить ячейку правильно

На всякий случай, если кто-то хочет знать, как правильно очистить содержимое ячейки. Существует два способа архивирования (я бы рекомендовал way 1 ).

// way 1
public static void emptyCell(final XSSFCell cell) {
    cell.setCellType(Cell.CELL_TYPE_BLANK);
}

// way 2
public static void emptyCell(final XSSFCell cell) {
    String nullString = null;
    cell.setCellValue(nullString);
}

С уважением winklerrr

    
ответ дан winklerrr 16.11.2015 в 10:38
источник
  • Как это с цифрами? Может ли ячейка типа NUMERIC и по-прежнему быть пустой? –  Jan Zyka 15.04.2016 в 11:05
0

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

row=(Row) sheet.getRow(i);
        if (row == null || isEmptyRow(row)) {
            return;
        }
Iterator<Cell> cells = row.cellIterator();
    while (cells.hasNext())
     {}
    
ответ дан Prashant Gautam 22.09.2015 в 06:22
источник
  • Где проверка, является ли текущая итерированная ячейка пустой или нет? –  winklerrr 16.11.2015 в 08:55
0
.getCellType() != Cell.CELL_TYPE_BLANK
    
ответ дан El Tall yobro 15.12.2017 в 19:45
источник
  • Обратите внимание, что ответы только на код не поощряются! –  GhostCat 15.12.2017 в 20:03