2011-09-30 118 views
40

Apache POI APIを使用してExcelファイルから値を取得しています。 数式を含むセルを除いてすべてがうまくいっています。実際には、cell.getStringCellValue()はセルの値ではなく、セルで使用されている式を返しています。Java POI:計算式を計算するのではなく、Excelセルの値を読み取る方法は?

私はevaluateFormulaCell()メソッドを使用しようとしましたが、それは働いていない私はGETPIVOTDATA Excelの数式を使用していますので、この式は、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) 

答えて

88

、店舗に二つのことを優れています。 1つはフォーミュラそのもので、もう1つは "キャッシュされた"値です(フォーラムラウンドで評価された最後の値)

最後にキャッシュされた値を取得したい場合は)Excelは、ファイルを保存し、あなたはそれがあるべきそれを変更していない、あなたのようなものをお勧めします:

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

ええ、それは動作します。 。well done :) – Aminoss

+6

うまくいくならば、答えを「受け入れる」ことを忘れないでください。 – Wivani

+1

キャッシュされた日付はどうですか?日付セルにはCell.CELL_TYPE_NUMERICというフラグが付けられます。 –

0

を使用すると、数式を置くされているセルの生の値を取得することができます代替コマンドがあります。戻り値の型はStringです。用途:提案上記

cell.getRawValue(); 
+0

その方法は[POI javadocsで]表示されていません(https://poi.apache.org/apidocs/org/apache/poi/ss/usermodel/Cell.html)。このライブラリ? – Gagravarr

+0

ここをクリックしてください:https://poi.apache.org/apidocs/org/apache/poi/xssf/usermodel/XSSFCell.html –

+1

あ、それはXSSFだけです。コモンSSモデルにはないため、HSSFもありません。 – Gagravarr

2

が私のために動作しませんでしたcell.getRawValueは()AUT上でExcelのセルと同じ式を返されたので、機能の下に書いて、それが働いた:

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

} 
関連する問題