2009-02-09 6 views
1

J'utilise Java POI depuis un certain temps, mais j'ai rencontré un nouveau problème et je me demande si quelqu'un a trouvé une solution.Java POI - quelqu'un a été capable d'extraire des nombres de cellules de formule?

Lorsque vous lisez une feuille de calcul, vous devez connaître le type de cellule afin d'utiliser la méthode de lecture appropriée.

Donc, vous obtenez le type de cellule, puis appelez la méthode de lecture appropriée pour obtenir le contenu de la cellule.

Cela fonctionne pour toutes les cellules à l'exception de la cellule FORMULE, où la valeur est un nombre. Si c'est du texte, vous pouvez le lire très bien. Mais si la valeur résultante est un nombre, alors tout ce que vous obtenez de la cellule est une chaîne vide.

J'ai passé les javadocs pour POI, et j'utilise le bon type de données (HSSFRichTextString), mais toujours pas de joie.

Quelqu'un at-il une solution?

post-scriptum Ce comportement de POI me perturbe car il devrait y avoir une méthode par défaut cell.toString() qui retournerait la représentation sous forme de chaîne de n'importe quel type de cellule, disons par défaut à la propriété value de la cellule. (un peu comme le paste-special où vous pouvez choisir "value").

PPS: Comme demandé - j'utilise Java 6 (1.6.0_06) et poi-3.0.2-FINAL-20080204.jar

+0

Quelle version de POI utilisez-vous? – Patrick

Répondre

3
FileInputStream fis = new FileInputStream("c:/temp/test.xls"); 
    Workbook wb = new HSSFWorkbook(fis); //or new XSSFWorkbook("c:/temp/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()); 

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

Copié sans vergogne de here

+1

Upvote for Modesty :) – Nrj

+0

Sachez que evaluator.evaluate (cellule) peut lancer une exception RuntimeException si la formule n'est pas valide. – tehvan

+0

L'avez-vous déjà essayé? Moi aussi je peux lire les docs. Je suis à la recherche d'un vrai "oui, j'ai essayé ça et ça marche" info. Merci. – Huntrods

1

Une alternative à l'utilisation de createFormulaEvaluator consiste à utiliser SetCellType (CellType.STRING), puis à accéder à StringCellValue. J'ai rencontré des problèmes en utilisant un évaluateur de formule (en utilisant NPOI) quand il contient la fonction WORKDAY().

Questions connexes