繁体   English   中英

Java Apache POI设置单元格公式

[英]Java apache poi setting the cell formula

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

有人可以帮忙吗?

我进行了一次快速测试,从工作表中读取一个公式,结果出来时没有单引号,如下所示:

[test.xls]测试表!A1

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

线程“主”中的异常java.lang.RuntimeException:没有名称为“ 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

您可以通过INDIRECT函数通过对引用进行动态评估来解决此问题。

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

例如,

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

    =间接(A1)

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

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

Excel还具有一个可动态评估公式的EVALUATE宏,使用该宏将更加容易,但是正式没有记录(但是在其他地方则有大量记录!),并且并非所有版本的Office都支持该宏。

希望这可以帮助!

尝试环顾四周,但是我能找到的唯一信息是此Apache错误报告,该报告表明这是一个长期存在的错误:

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

尽管引用同一工作簿中的其他工作表似乎可以正常工作

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM