【问题标题】:Formula Evaluator in Apache POIApache POI 中的公式评估器
【发布时间】:2012-03-15 23:13:46
【问题描述】:

我有一个程序可以从工作簿中提取数据。其中一张工作表中有一个单元格,该单元格从涉及同一工作簿中另一张工作表的公式中获取其数据。工作簿称为“第 11 周.xls”,工作表称为 Sat AP。我正在尝试使用以下代码:

    HSSFFormulaEvaluator fe = new HSSFFormulaEvaluator(myWorkbook);
    HSSFCell cell = myWorkbook.getSheetAt(11).getRow(10).getCell(3); 
    CellValue cv = fe.evaluate(cell);

我收到无法解析外部工作簿第 11 周 sat.xls 的错误,它似乎正在尝试打开第 11 周 sat.xls,而它应该尝试打开第 11.xls 周。 myWorkbook 用于其他功能并且工作正常,所以我知道它没有指向错误的文件。任何帮助将非常感激。谢谢!

【问题讨论】:

  • 你真的需要评估单元格吗?您是对文件进行任何更改,还是只是读取文件? (如果您不进行更改,那么有一种更简单的方法)
  • 感谢您的回复,我没有对单元格进行任何更改,但是当我尝试通过其他方法获取单元格值时,它返回错误的数量,单元格中的公式是“H7 + 'Fri AP'!D11" 但是当我尝试获取该值时,它只返回来自 Fri AP D11 的值。
  • 使用 clearAllCachedResultValues();看stackoverflow.com/a/60559846/715269

标签: java apache excel apache-poi


【解决方案1】:

根据您的需要,有两种方法可以处理 POI 中的公式单元格。出于性能原因,当 Excel 编写公式单元格时,它会计算当前值并将其与公式一起存储。

如果您没有对文件进行更改,那么您可以简单地检索 Excel 上次处理文件时的缓存值,然后使用它。您将获得与 Excel 中显示的相同值,并且无需进行任何评估。你的代码看起来像

if(cell.getCellType() == HSSFCell.CELL_TYPE_FORMULA) {
 switch(cell.getCachedFormulaResultType()) {
  case HSSFCell.CELL_TYPE_STRING:
     HSSFRichTextString str = cell.getRichStringCellValue();
     if(str != null && str.length() > 0) {
        text.append(str.toString());
     }
     break;
  case HSSFCell.CELL_TYPE_NUMERIC:
     HSSFCellStyle style = cell.getCellStyle();
     if(style == null) {
        text.append( cell.getNumericCellValue() );
     } else {
        text.append(
              _formatter.formatRawCellContents(
                    cell.getNumericCellValue(),
                    style.getDataFormat(),
                    style.getDataFormatString()
              )
        );
     }
     break;
  case HSSFCell.CELL_TYPE_BOOLEAN:
     text.append(cell.getBooleanCellValue());
     break;
  case HSSFCell.CELL_TYPE_ERROR:
     text.append(ErrorEval.getText(cell.getErrorCellValue()));
     break;
 }

(此代码取自 POI 中的 Excel 文本提取器代码 ExcelExtractor,如果您想查看它的使用示例)

否则,如果您首先更改单元格的值,则需要重新评估公式值。这在formula evaluation page on the POI site 中有很大一部分内容。如果您有外部工作簿引用,就像从您的错误消息中看到的那样,请不要忘记告诉 POI 公式评估器如何查找每个外部工作簿的基础文件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多