Java apache poi设置单元格公式

4

我正在尝试设置一个单元格公式,引用其他工作簿中的单元格。但是,当我打开程序生成的工作簿时,公式单元格显示为#REF!。我在日志中打印出生成的公式。如果将它们剪切并粘贴到单元格中,则来自外部工作簿的数字会被拉入。

        String formula = "'C:\\tmp\\ForecastAggregate\\Total Products\\[ForecastWorksheet.xls]2010 Budget'!C10"; 
        HSSFCell cell = row.createCell(0); //row was created above
        cell.setCellFormula(formula);

有人可以帮忙吗?

3个回答

1

我从工作表中快速测试读取了一个公式,结果没有单引号:

[test.xls]testsheet!A1

当我尝试将其设置为公式时,却出现了错误:

Exception in thread "main" java.lang.RuntimeException: No external workbook with name 'test.xls'。链接似乎表明,当您读取使用外部引用的公式时,需要将工作簿加载到公式求值器中并设置环境。然而,我尝试过这个方法,但仍然没有成功...但这可能是值得关注的问题:

 // Set up the workbook environment for evaluation
 HSSFFormulaEvaluator ev = new HSSFFormulaEvaluator(testwb); 
 String[] workbookNames = { "test.xls", };
 HSSFFormulaEvaluator[] evaluators = { ev, };
 HSSFFormulaEvaluator.setupEnvironment(workbookNames, evaluators); 

http://poi.apache.org/apidocs/org/apache/poi/hssf/usermodel/HSSFFormulaEvaluator.html


1

您可以通过使用动态引用来解决此问题,使用 INDIRECT 函数。

INDIRECT 函数评估一个单元格的值,其中要评估的单元格是从另一个单元格的值中获取的。

例如:

  1. 在单元格 A1 中,将您的单元格引用作为纯文本(而不是公式),例如 "'C:\tmp\ForecastAggregate\Total Products\[ForecastWorksheet.xls]2010 Budget'!C10"

  2. 在 A2 中,您想要该引用单元格的值出现的单元格中,放置公式

    =INDIRECT(A1)

这将从 A1 获取目标单元格,并在 A2 中显示其值。

在 Java 中,您可以设置一种模式,其中创建一个单独的工作表(例如 “indirectRef”)来管理间接引用。每当您写一个外部引用到单元格时,您会改写成 INDIRECT(xx) 并将引用放在“indirectRef”工作表中的单元格 xx 中。鉴于 Poi 大多数都是接口,您可能能够在不更改 Java 电子表格生成器代码的情况下透明地完成此操作。

Excel还有一个EVALUATE宏,可以动态评估公式,这将更容易使其工作,但这是官方未记录的(但在其他地方广泛记录!),而且可能不被所有Office版本支持。

希望这有所帮助!


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接