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)

原文由 Aminoss 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.3k
1 个回答

对于公式单元格,excel 存储两件事。一个是公式本身,另一个是“缓存”值(forumla 被评估为的最后一个值)

如果你想获得最后缓存的值(它可能不再正确,但只要 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;
        }
     }
 }

原文由 Gagravarr 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题