2010-03-25 311 views
4

我尝试设置引用其他工作簿单元格的单元格公式。但是,当我打开以编程方式生成的工作簿时,公式单元格显示为#REF !.我打印出在日志中生成的公式。如果我剪切和粘贴那些进入细胞内,从外部工作簿的数字被拉入。Java apache poi设置单元格公式

 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帮助吗?

回答

1

我给了一个快速测试从工作表读取一个公式来工作,它出来,而不单引号,如:!

[TEST.XLS] testsheet 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

1

可以解决此问题通过使用动态评价加时赛参考,通过INDIRECT功能。

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

例如,

  1. 在单元格A1,把你的单元格引用为纯文本(未式),例如“ 'C:\ tmp目录\ ForecastAggregate \产品总数\ [ForecastWorksheet.xls] 2010年预算'!C10”
  2. 在A2,你想要的是引用单元格出现的值的单元格,把公式

    =间接(A1)

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

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

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

希望这会有所帮助!