web-dev-qa-db-ja.com

Apache POIを使用してExcelセルが空であるかどうかを確認するにはどうすればよいですか?

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());

    }
}
26
user1312312

どうですか:

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

Gagravarrの答えはとても良いです!


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バージョンに注意してください

彼らは最初にバージョン3.15 Beta 3getCellType()getCellTypeEnum()に変更し、次にバージョン4.0getCellType()に戻しました。

  • バージョン>= 3.15 Beta 3

    • CellType.BLANKCellType.STRINGの代わりにCell.CELL_TYPE_BLANKCell.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);
}

さらに、セルを適切にクリアします

誰かが知りたい場合に備えて、セルの内容を適切にクリアする方法。それをアーカイブするには2つの方法があります(way 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

25
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()は廃止されますが、戻り値の型は同じままである必要があります。

2
Sandro

Apache POI 3.17以降、列挙を使用してセルが空かどうかを確認する必要があります。

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

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

最初にNullPointerExceptionを回避するには、このRow.MissingCellPolicy.CREATE_NULL_AS_BLANKを追加する必要があります。これにより、NPEを提供する代わりに空白のセルが作成されます。

Cell cell = row.getCell(j, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK);
    if (cell == null || cell.getCellTypeEnum() == CellType.BLANK) 
        // do what you want
0
Tarek Badr
Cell cell = row.getCell(x, Row.CREATE_NULL_AS_BLANK);

このトリックは私を大いに助けてくれました。

0
softwareplay

Cell.getCellType()は、最新のPOI APIでは非推奨です。 POI APIバージョン3.17を使用している場合、以下のコードを使用します。

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

他にも1つのオプションがあります。

row=(Row) sheet.getRow(i);
        if (row == null || isEmptyRow(row)) {
            return;
        }
Iterator<Cell> cells = row.cellIterator();
    while (cells.hasNext())
     {}
0
Prashant Gautam
.getCellType() != Cell.CELL_TYPE_BLANK
0
El Tall yobro