web-dev-qa-db-fra.com

Comment vérifier si une cellule Excel est vide avec Apache POI?

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

    }
}
24
user1312312

Que diriez-vous:

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

La réponse de Gagravarr est plutôt bonne!


Vérifier si une cellule Excel est vide

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:

    • Utilisez 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

    • Utilisez 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.


Exemple

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

En plus: Effacer une cellule correctement

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.


Sources utiles

Cordialement winklerrr

22
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.

2
Sandro

À 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) { ... }
1
gil.fernandes

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
0
Tarek Badr
Cell cell = row.getCell(x, Row.CREATE_NULL_AS_BLANK);

Cette astuce m'a beaucoup aidé, voyez si cela vous est utile

0
softwareplay

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
}
0
Yuva C

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())
     {}
0
Prashant Gautam
.getCellType() != Cell.CELL_TYPE_BLANK
0
El Tall yobro