Je suis en train de saisir des données d'une feuille de calcul Excel à l'aide de Poi.jar et je voulais savoir comment vérifier si une cellule est vide ou non.
En ce moment, j’utilise le code ci-dessous.
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());
}
}
Que diriez-vous:
Cell c = row.getCell(3);
if (c == null || c.getCellType() == Cell.CELL_TYPE_BLANK) {
// This cell is empty
}
La réponse de Gagravarr est plutôt bonne!
Mais si vous supposez qu'une cellule est également vide si elle contient une chaîne vide (""
), vous avez besoin de code supplémentaire. Cela peut arriver si une cellule a été modifiée puis effacée de manière appropriée (pour savoir comment effacer une cellule correctement, voir ci-dessous).
Je me suis écrit un assistant pour vérifier si une XSSFCell
est vide (y compris une chaîne vide).
/**
* 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;
}
Faites attention aux nouvelles versions de POI
Ils ont d'abord remplacé getCellType()
par getCellTypeEnum()
à partir de la version 3.15 Beta 3
, puis sont revenus à getCellType()
à partir de la version 4.0
.
Version >= 3.15 Beta 3
:
CellType.BLANK
et CellType.STRING
au lieu de Cell.CELL_TYPE_BLANK
et Cell.CELL_TYPE_STRING
Version >= 3.15 Beta 3
&& Version < 4.0
Cell.getCellTypeEnum()
au lieu de Cell.getCellType()
Mais mieux revérifiez vous-même , car ils avaient prévu de le modifier dans les prochaines versions.
Ce test JUnit montre le cas dans lequel la vérification vide supplémentaire est nécessaire.
Scénario: le contenu d'une cellule est modifié dans un programme Java. Plus tard, dans le même programme Java, la cellule est vérifiée pour la vacuité. Le test échouera si la fonction isCellEmpty(XSSFCell cell)
ne vérifie pas les chaînes vides.
@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);
}
Juste au cas où quelqu'un voudrait savoir, comment effacer correctement le contenu d'une cellule. Il y a deux manières d'archiver cela (je recommanderais voie 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);
}
Pourquoi la voie 1? Explicit vaut mieux qu'implicite (merci Python)
Méthode 1: redéfinit le type de cellule explicitement sur blank
.
Voie 2: redéfinit le type de cellule implicitement sur blank
en raison d'un effet secondaire lors de la définition d'une valeur de cellule sur une chaîne null
.
Cordialement winklerrr
C’est la manière la plus sûre et la plus concise que je connaisse à partir des points d’intérêt 3.1.7 à 4:
boolean isBlankCell = CellType.BLANK == cell.getCellTypeEnum();
boolean isEmptyStringCell = CellType.STRING == cell.getCellTypeEnum() && cell.getStringCellValue().trim().isEmpty();
if (isBlankCell || isEmptyStringCell) {
...
À partir du POI 4, getCellTypeEnum()
sera obsolète si la préférence est donnée à getCellType()
, mais le type de retour doit rester le même.
À partir de la version 3.17 du POI Apache, vous devrez vérifier si la cellule est vide à l'aide d'énumérations:
import org.Apache.poi.ss.usermodel.CellType;
if(cell == null || cell.getCellTypeEnum() == CellType.BLANK) { ... }
Tout d'abord, pour éviter NullPointerException, vous devez ajouter ceci Row.MissingCellPolicy.CREATE_NULL_AS_BLANK Cela créera une cellule vide au lieu de vous donner NPE, puis vous pourrez vérifier que rien ne s'est passé comme ce que @Gagravarr a dit.
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);
Cette astuce m'a beaucoup aidé, voyez si cela vous est utile
Cell.getCellType()
est obsolète dans la dernière API de POI. Si vous utilisez la version 3.17 de l'API POI, utilisez le code ci-dessous:
if (Cell.getCellTypeEnum() == CellType.BLANK) {
//do your stuff here
}
Il y a une autre option aussi.
row=(Row) sheet.getRow(i);
if (row == null || isEmptyRow(row)) {
return;
}
Iterator<Cell> cells = row.cellIterator();
while (cells.hasNext())
{}
.getCellType() != Cell.CELL_TYPE_BLANK