Java apache poi设置单元格公式

时间:2010-03-25 20:08:56

标签: java apache formula apache-poi

我尝试设置一个引用其他工作簿中的单元格的单元格公式。但是,当我打开以编程方式生成的工作簿时,公式单元格显示为#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);

anybode能帮忙吗?

3 个答案:

答案 0 :(得分:1)

我快速测试了一个工作表中的公式,它没有单引号,如下:

[TEST.XLS] testsheet!A1

但是当我尝试将其设置为公式时,我收到了一个错误:

线程“main”中的异常java.lang.RuntimeException:没有名为'test.xls'Links的外部工作簿似乎建议,当您阅读使用外部引用的公式时,您需要将工作簿加载到公式评估程序并设置环境。但是,我尝试了这个,但它仍然没有用......但是可能需要注意一下:

 // 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 :(得分:1)

您可以通过INDIRECT功能使用动态评估来解决此问题。

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

例如,

  1. 在单元格A1中,将您的单元格引用设为纯文本(不是公式),例如“'C:\ tmp \ ForecastAggregate \ Total Products \ [ForecastWorksheet.xls] 2010 Budget'!C10”
  2. 在A2中,您想要显示该引用单元格的值的单元格,放置公式

    = INDIRECT(A1)

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

    在Java中,您可以设置一种模式,您可以在其中创建单独的工作表(例如“indirectRef”)来管理间接。每当你写一个单元格的外部引用时,你改为编写INDIRECT(xx)并将引用放在单元格xx中的“indirectRef”工作表中。鉴于Poi主要是接口,您可以透明地执行此操作,而不会在Java电子表格构建器代码中更改代码。

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

    希望这有帮助!

答案 2 :(得分:0)

试着环顾四周,但我能找到的唯一信息是这个apache bug报告,它表明这是一个长期存在的错误:

https://issues.apache.org/bugzilla/show_bug.cgi?id=46670

尽管在同一工作簿中引用其他工作表似乎没有问题