web-dev-qa-db-fra.com

Java POI: Comment lire la valeur d'une cellule Excel et non la formule qui la calcule?

J'utilise Apache POI API pour obtenir les valeurs d'un fichier Excel. Tout fonctionne très bien sauf avec des cellules contenant des formules. En fait, la cell.getStringCellValue() renvoie la formule utilisée dans la cellule et non la valeur de la cellule.

J'ai essayé d'utiliser la méthode evaluateFormulaCell() mais cela ne fonctionne pas car j'utilise une formule Excel GETPIVOTDATA et cette formule n'est pas implémentée dans l'API:

Exception in thread "main" org.Apache.poi.ss.formula.eval.NotImplementedException: Error evaluating cell Landscape!K11
    at org.Apache.poi.ss.formula.WorkbookEvaluator.addExceptionInfo(WorkbookEvaluator.Java:321)
    at org.Apache.poi.ss.formula.WorkbookEvaluator.evaluateAny(WorkbookEvaluator.Java:288)
    at org.Apache.poi.ss.formula.WorkbookEvaluator.evaluate(WorkbookEvaluator.Java:221)
    at org.Apache.poi.hssf.usermodel.HSSFFormulaEvaluator.evaluateFormulaCellValue(HSSFFormulaEvaluator.Java:320)
    at org.Apache.poi.hssf.usermodel.HSSFFormulaEvaluator.evaluateFormulaCell(HSSFFormulaEvaluator.Java:213)
    at fromExcelToJava.ExcelSheetReader.unAutreTest(ExcelSheetReader.Java:193)
    at fromExcelToJava.ExcelSheetReader.main(ExcelSheetReader.Java:224)
Caused by: org.Apache.poi.ss.formula.eval.NotImplementedException: GETPIVOTDATA
    at org.Apache.poi.hssf.record.formula.functions.NotImplementedFunction.evaluate(NotImplementedFunction.Java:42)
52
Aminoss

Pour les cellules de formule, Excel stocke deux choses. L'une est la formule elle-même, l'autre est la valeur "mise en cache" (la dernière valeur évaluée par le forumla)

Si vous voulez obtenir la dernière valeur mise en cache (qui peut ne plus être correcte, mais tant que Excel a sauvegardé le fichier et que vous ne l'avez pas modifié, il devrait l'être), vous souhaiterez quelque chose comme:

 for(Cell cell : row) {
     if(cell.getCellType() == Cell.CELL_TYPE_FORMULA) {
        System.out.println("Formula is " + cell.getCellFormula());
        switch(cell.getCachedFormulaResultType()) {
            case Cell.CELL_TYPE_NUMERIC:
                System.out.println("Last evaluated as: " + cell.getNumericCellValue());
                break;
            case Cell.CELL_TYPE_STRING:
                System.out.println("Last evaluated as \"" + cell.getRichStringCellValue() + "\"");
                break;
        }
     }
 }
121
Gagravarr

Les solutions précédemment publiées ne fonctionnaient pas pour moi. cell.getRawValue() a renvoyé la même formule que celle indiquée dans la cellule. La fonction suivante a fonctionné pour moi:

public void readFormula() throws IOException {
    FileInputStream fis = new FileInputStream("Path of your file");
    Workbook wb = new XSSFWorkbook(fis);
    Sheet sheet = wb.getSheetAt(0);
    FormulaEvaluator evaluator = wb.getCreationHelper().createFormulaEvaluator();

    CellReference cellReference = new CellReference("C2"); // pass the cell which contains the formula
    Row row = sheet.getRow(cellReference.getRow());
    Cell cell = row.getCell(cellReference.getCol());

    CellValue cellValue = evaluator.evaluate(cell);

    switch (cellValue.getCellType()) {
        case Cell.CELL_TYPE_BOOLEAN:
            System.out.println(cellValue.getBooleanValue());
            break;
        case Cell.CELL_TYPE_NUMERIC:
            System.out.println(cellValue.getNumberValue());
            break;
        case Cell.CELL_TYPE_STRING:
            System.out.println(cellValue.getStringValue());
            break;
        case Cell.CELL_TYPE_BLANK:
            break;
        case Cell.CELL_TYPE_ERROR:
            break;

        // CELL_TYPE_FORMULA will never happen
        case Cell.CELL_TYPE_FORMULA:
            break;
    }

}
4
SelThroughJava

Il existe une commande alternative permettant d’obtenir la valeur brute d’une cellule dans laquelle la formule est placée. C'est le type de retour qui est String. Utilisation:

cell.getRawValue();
0
Sanjay Singh