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());
}
}
どうですか:
Cell c = row.getCell(3);
if (c == null || c.getCellType() == Cell.CELL_TYPE_BLANK) {
// This cell is empty
}
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バージョンに注意してください
彼らは最初にバージョン3.15 Beta 3
でgetCellType()
をgetCellTypeEnum()
に変更し、次にバージョン4.0
でgetCellType()
に戻しました。
バージョン>= 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);
}
誰かが知りたい場合に備えて、セルの内容を適切にクリアする方法。それをアーカイブするには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
これは、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) { ... }
最初に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
Cell cell = row.getCell(x, Row.CREATE_NULL_AS_BLANK);
このトリックは私を大いに助けてくれました。
Cell.getCellType()
は、最新のPOI APIでは非推奨です。 POI APIバージョン3.17を使用している場合、以下のコードを使用します。
if (Cell.getCellTypeEnum() == CellType.BLANK) {
//do your stuff here
}
他にも1つのオプションがあります。
row=(Row) sheet.getRow(i);
if (row == null || isEmptyRow(row)) {
return;
}
Iterator<Cell> cells = row.cellIterator();
while (cells.hasNext())
{}
.getCellType() != Cell.CELL_TYPE_BLANK