web-dev-qa-db-fra.com

Comment définir des formules dans des cellules en utilisant Apache POI?

J'utilise actuellement POI Apache pour Java pour définir des formules dans les cellules.

Mais après avoir exécuté le programme et ouvert le fichier Excel que j'ai créé et traité, les cellules avec la formule incluent la formule sous forme de chaîne, plutôt que la valeur que la formule aurait dû renvoyer.

36
vamsi

L'objet HSSFCell a des méthodes .setCellType et .setCellFormula que vous devez appeler comme ceci:

// "cell" object previously created or looked up
String strFormula= "SUM(A1:A10)";
cell.setCellType(HSSFCell.CELL_TYPE_FORMULA);
cell.setCellFormula(strFormula);
49
user257111

Les constantes de cellule sont obsolètes et seront supprimées de la version 4.0 au lieu de l'utilisation de la cellule

CellType.FORMULA

String formula= "SUM(B4:B20)";
cell.setCellType(CellType.FORMULA);
cell.setCellFormula(formula);
12
Jinu P C

Le code ci-dessous a bien fonctionné pour moi, j'espère que cela pourrait être utile à quelqu'un.

cell.setCellType(Cell.CELL_TYPE_FORMULA);
cell.setCellFormula("SUM(C70:C76)");
12
user1901203

Apache POI ne prend pas en charge les fonctions définies par l'utilisateur.

De la documentation :

Notez que les fonctions définies par l'utilisateur ne sont pas prises en charge et ne le seront probablement pas de sitôt ... du moins, pas avant une implémentation VB en Java!

7
filsa

Vous pouvez l'utiliser pour évaluer les formules du classeur:

        // Evaluate all formulas in the sheet, to update their value
    FormulaEvaluator formulaEvaluator = workbook.getCreationHelper().createFormulaEvaluator();
    formulaEvaluator.evaluateAll();
4
Diogo Vilela

J'avais le même problème et "SUM(B4:B20)" ne fonctionne pas directement pour moi car la feuille a été générée dynamiquement. Le problème était avec la référence de cellule.

Sur la base de https://stackoverflow.com/a/2339262/2437655 et https://stackoverflow.com/a/33098060/2437655 j'ai pu générer la formule réelle. par exemple.

 val totalProductQtyPerUserCell = userDetailsRow.createCell(products.size + 1)
 totalProductQtyPerUserCell.cellType = HSSFCell.CELL_TYPE_FORMULA
 totalProductQtyPerUserCell.cellFormula = "SUM(${CellReference.convertNumToColString(1)}${totalProductQtyPerUserCell.row.rowNum + 1}:${CellReference.convertNumToColString(products.size)}${totalProductQtyPerUserCell.row.rowNum + 1})"

J'espère que cette aide.

1
Killer