Excel公式未更新单元格

12

我正在使用apache POI来更改excel表格中的单元格。当我更改这些值后,与已更改单元格相关的公式单元格未更新。

当我进入excel并单击带有公式的单元格,然后单击函数栏时,公式会更新。

我的计算选项设置为自动更新。

以下是一个快速示例:

行:

[A2 + A3] [1] [2]

此处A1等于3

但当我使用POI更改它时:

[A2 + A3] [2] [5]

A1仍然等于3,直到我单击该单元格为止。

刷新工作簿或工作表也无效。这是Excel还是POI的问题?有没有人能想到解决方法?


你的问题不是很清楚,请详细描述 Excel 中打开和关闭工作表的确切操作顺序。你是否执行以下步骤?1)创建工作表;2)关闭 Excel;3)运行你的 Java 程序;4)重新在 Excel 中打开工作表?如果不是,请准确地描述你所做的操作。 - Jim Garrison
2
其他人回答时没有提供这样的描述,而在这种情况下这样的描述有点不相关。 - PandaBearSoup
3个回答

25

如果您正在使用XSSF工作簿,可以按如下方式重新评估所有公式单元格:

XSSFFormulaEvaluator.evaluateAllFormulaCells(workbook)
如果您正在使用HSSF工作簿,则存在类似的API:
HSSFFormulaEvaluator.evaluateAllFormulaCells(workbook)

根据你的设置和具体想要完成的任务,你可能能在这里找到解决方案。


是的,当我注意到这个问题时,这就是所使用的解决方法。我更想知道为什么Excel不能自动更新单元格,而不仅仅是在我点击它们时。刷新工作簿也应该可以解决问题。看起来像是一个bug。我会接受这个答案,因为它从技术上解决了根本问题。 - PandaBearSoup
2
@PandaBearSoup Apache POI文档中的Why Evaluate Formulas部分解释了为什么需要这样做,我建议你仔细阅读一下。 - Gagravarr

11

如果您的工作表中有某个公式,例如A3=sum(A1:A2),并且对于A1=5,A2=4计算正常。现在,如果将A2的值更改为2,例如:

sh.getRow(0).getCell(0).setCellValue(2); // 将A1设置为2 并执行写操作,检查A3的值仍然显示为9。看起来是错误的,但实际上不是。问题在于Excel缓存先前计算的结果,因此您需要触发重新计算以更新它们。

wb.getCreationHelper().createFormulaEvaluator().evaluateAll(); 或者使用以下方法:

wb.setForceFormulaRecalculation(true); 然后执行写操作。这将给出正确的结果。有关详细信息,请查看此处


我没有足够的声望来发布上述解决方案的评论。因此,我已经粘贴了解决方案。 - nilamber
2
非常感谢!!! wb.setForceFormulaRecalculation(true); => 对我来说非常有效! - eugene.polschikov

2

你需要显式地触发重新计算。关于如何以及为什么要这样做,请参见此处的公式重新计算部分(链接)


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