Apache POI中的公式评估程序

时间:2012-03-10 20:29:36

标签: java apache excel apache-poi

我有一个程序,它从工作簿中提取数据。其中一个工作表中有一个单元格,它从公式中获取数据,该公式涉及同一工作簿中的另一个工作表。该工作簿称为“周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用于其他功能,它工作正常,所以我知道它没有指向错误的文件。任何帮助将非常感激。谢谢!

1 个答案:

答案 0 :(得分:5)

根据您的需要,有两种方法可以处理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,ExcelExtractor中的Excel文本提取器代码,如果您想查看正在使用的示例)

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