web-dev-qa-db-ja.com

Java POI:計算式ではなくExcelセル値を読み取る方法は?

Apache POI APIを使用して、Excelファイルから値を取得しています。数式を含むセルを除き、すべてがうまく機能しています。実際、cell.getStringCellValue()は、セルの値ではなく、セルで使用されている数式を返しています。

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)
52
Aminoss

数式セルの場合、Excelには2つのものが保存されます。 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;
        }
     }
 }
121
Gagravarr

以前に投稿されたソリューションは私にとってはうまくいきませんでした。 cell.getRawValue()は、セルに記載されているものと同じ式を返しました。次の機能は私のために働いた:

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

数式が配置されているセルの生の値を取得できる代替コマンドがあります。戻り値の型は文字列です。つかいます:

cell.getRawValue();
0
Sanjay Singh