POI: sortie vierge si la formule revient en blanc

J'ai une formule comme celle-ci dans Excel:

=IF(A1="foo";"";"0") 

Si la formule renvoie une valeur vide, je ne veux aucune valeur dans mon file csv resulttiong créé par POI. Si la formule renvoie 0 je veux un 0 dans mon file csv.

C'est une partie de mon code (c'est toujours la question de combien de décollage du code):

 Iterator<Row> rowIterator = sheet.rowIterator(); while (rowIterator.hasNext()) { Row row = rowIterator.next(); Iterator<Cell> cellIterator = row.cellIterator(); boolean isFirst = true; for (int cn = 0; cn < row.getLastCellNum(); cn++) { Cell cell = row.getCell(cn, Row.CREATE_NULL_AS_BLANK); if (!isFirst) { buffer.write(delimiter.getBytes(charset)); } else { isFirst = false; } // Numeric Cell type (0) // Ssortingng Cell type (1) // Formula Cell type (2) // Blank Cell type (3) // Boolean Cell type (4) // Error Cell type (5) if (cell.getCellType() == 0 || cell.getCellType() == 2) { try { if (DateUtil.isCellDateFormatted(cell)) { cell.setCellType(Cell.CELL_TYPE_NUMERIC); Date value = cell.getDateCellValue(); SimpleDateFormat sdf = new SimpleDateFormat("dd.MM.yyyy"); if (cell.getNumericCellValue() < 1) { sdf.applyPattern("HH:mm:ss"); } buffer.write(sdf.format(value).getBytes(charset)); } else { double valueDouble = cell.getNumericCellValue(); if (valueDouble == Math.ceil(valueDouble)) { buffer.write(Ssortingng.format("%d", (long) valueDouble).getBytes(charset)); } else { valueDouble = round(valueDouble, roundingPlaces); Ssortingng value = Ssortingng.valueOf(valueDouble).replace(".", ","); buffer.write(value.getBytes(charset)); } } } catch (Exception e) { // Formula returns a ssortingng cell.setCellType(Cell.CELL_TYPE_STRING); Ssortingng value = cell.getSsortingngCellValue(); buffer.write(value.getBytes(charset)); } } else { cell.setCellType(Cell.CELL_TYPE_STRING); Ssortingng value = cell.getSsortingngCellValue(); buffer.write(value.getBytes(charset)); } } buffer.write("\r\n".getBytes(charset)); } 

Ce code produit un 0 dans le file csv dans tous les cas. Il résulte de la ligne

 double valueDouble = cell.getNumericCellValue(); 

La documentation est assez claire sur ce point:

double getNumericCellValue()

Obtenez la valeur de la cellule en tant que nombre.

Pour les strings, nous lançons une exception. Pour les cellules vierges, nous renvoyons un 0. Pour les formules ou les cellules d'erreur, nous renvoyons la valeur précalculée;

Comment puis-je parsingr la cellule si elle contient une valeur NULL?

cell.getCellType() == Cell.CELL_TYPE_BLANK devrait être vrai pour une Cell vide, false sinon.

Edit: J'ai oublié que vous avez une cellule Formula. Dans ce cas, augmentez vers: cell.getCellType() == Cell.CELL_TYPE_FORMULA ? Cell.getCachedFormulaResultType() == Cell.CELL_TYPE_BLANK : cell.getCellType() == Cell.CELL_TYPE_BLANK cell.getCellType() == Cell.CELL_TYPE_FORMULA ? Cell.getCachedFormulaResultType() == Cell.CELL_TYPE_BLANK : cell.getCellType() == Cell.CELL_TYPE_BLANK

Vous ne devriez probablement pas filterr les cellules vierges, mais les cellules non numériques.

Je pense que votre problème est que la formule renvoie un caractère "" ou "0", mais vous le traitez comme un numéro.

@llogiq m'a amené sur la bonne voie!

J'ai ajouté le code suivant avant l'instruction if :

  if (cell.getCellType() == 2 && cell.getCachedFormulaResultType() == 1) { logger.log(Level.DEBUG, "Formula returns a ssortingng. (1)"); cell.setCellType(Cell.CELL_TYPE_STRING); Ssortingng value = cell.getSsortingngCellValue(); buffer.write(value.getBytes(charset)); } else if (cell.getCellType() == 0 || cell.getCellType() == 2) { 

Maintenant, la formule donne lieu à un champ vide dans mon file csv! Et je peux même me débarrasser du bloc de try catch . Bien sûr, je dois encore préciser le code …