web-dev-qa-db-fra.com

Obtenez la valeur des cellules à partir d'une feuille Excel avec Apache Poi

Comment obtenir la valeur d'une cellule avec poi dans Java?

Mon code ressemble à ceci

String cellformula_total__percentage= "(1-E" + (rowIndex + 2) + "/" + "D" + (rowIndex + 2) + ")*100";
cell.setCellType(HSSFCell.CELL_TYPE_NUMERIC);
cell.setCellStyle(this.valueRightAlignStyleLightBlueBackground);
cell.setCellFormula("abs(" + cellformula_total__percentage + ")");

Mais s'il y a dans ce cas, comment puis-je vérifier que ma valeur de cellule contient une valeur d'erreur comme # DIV/0! et comment puis-je le remplacer par N/A

14
Ravi Parmar

Vous devez utiliser le FormulaEvaluator, comme indiqué ici . Cela renverra une valeur qui est soit la valeur présente dans la cellule, soit le résultat de la formule si la cellule contient une telle formule:

FileInputStream fis = new FileInputStream("/somepath/test.xls");
Workbook wb = new HSSFWorkbook(fis); //or new XSSFWorkbook("/somepath/test.xls")
Sheet sheet = wb.getSheetAt(0);
FormulaEvaluator evaluator = wb.getCreationHelper().createFormulaEvaluator();

// suppose your formula is in B3
CellReference cellReference = new CellReference("B3"); 
Row row = sheet.getRow(cellReference.getRow());
Cell cell = row.getCell(cellReference.getCol()); 

if (cell!=null) {
    switch (evaluator.evaluateFormulaCell(cell)) {
        case Cell.CELL_TYPE_BOOLEAN:
            System.out.println(cell.getBooleanCellValue());
            break;
        case Cell.CELL_TYPE_NUMERIC:
            System.out.println(cell.getNumericCellValue());
            break;
        case Cell.CELL_TYPE_STRING:
            System.out.println(cell.getStringCellValue());
            break;
        case Cell.CELL_TYPE_BLANK:
            break;
        case Cell.CELL_TYPE_ERROR:
            System.out.println(cell.getErrorCellValue());
            break;

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

si vous avez besoin du contenu exact (c'est-à-dire le formla si la cellule contient une formule), alors cela est affiché ici .

Edit: Ajout de quelques exemples pour vous aider.

vous obtenez d'abord la cellule (juste un exemple)

Row row = sheet.getRow(rowIndex+2);    
Cell cell = row.getCell(1);   

Si vous souhaitez simplement définir la valeur dans la cellule à l'aide de la formule (sans connaître le résultat):

 String formula ="ABS((1-E"+(rowIndex + 2)+"/D"+(rowIndex + 2)+")*100)";    
 cell.setCellFormula(formula);    
 cell.setCellStyle(this.valueRightAlignStyleLightBlueBackground);

si vous voulez changer le message s'il y a une erreur dans la cellule, vous devez changer la formule pour le faire, quelque chose comme

IF(ISERR(ABS((1-E3/D3)*100));"N/A"; ABS((1-E3/D3)*100))

(cette formule vérifie si l'évaluation renvoie une erreur puis affiche la chaîne "N/A", ou l'évaluation s'il ne s'agit pas d'une erreur).

si vous voulez obtenir la valeur correspondant à la formule, vous devez utiliser l'évaluateur.

J'espère que cette aide,
Guillaume

35
PATRY Guillaume

Peut être par: -

    for(Row row : sheet) {          
        for(Cell cell : row) {              
            System.out.print(cell.getStringCellValue());

        }
    }       

Pour un type de cellule spécifique, vous pouvez essayer:

switch (cell.getCellType()) {
case Cell.CELL_TYPE_STRING:
    cellValue = cell.getStringCellValue();
    break;

case Cell.CELL_TYPE_FORMULA:
    cellValue = cell.getCellFormula();
    break;

case Cell.CELL_TYPE_NUMERIC:
    if (DateUtil.isCellDateFormatted(cell)) {
        cellValue = cell.getDateCellValue().toString();
    } else {
        cellValue = Double.toString(cell.getNumericCellValue());
    }
    break;

case Cell.CELL_TYPE_BLANK:
    cellValue = "";
    break;

case Cell.CELL_TYPE_BOOLEAN:
    cellValue = Boolean.toString(cell.getBooleanCellValue());
    break;

}
9
Harry Joy