我们的应用程序大量使用Apache POI。出于性能原因,我们在创建后缓存org.apache.poi.ss.usermodel.FormulaEvaluator
个实例。 javadoc指出,如果单元格值发生变化,则需要调用clearAllCachedResultValues()
如果在对此类的evaluate~方法的调用之间更改了任何工作簿单元格。
我注意到界面还包含其他方法,例如notifyUpdateCell(Cell cell)
。
在执行公式评估之前,是否有notifyUpdateCell(Cell cell)
(对于每个Cell更新)与clearAllCachedResultValues()
的性能或任何其他好处?注意:我们不添加/删除任何单元格,我们只是设置单元格值和单元格类型。
答案 0 :(得分:0)
正如POI Formula Evaluation docs in the Performance section中所解释的,FormulaEvaluator
将缓存依赖单元格的评估,因此如果您有多个公式全部取决于单元格,那么后续评估将更快。
如果您在开始评估后对电子表格进行了一些更改,那么您有两个选择。一种方法是清除评估器上的所有缓存,因此它会再次重新计算所有需要的依赖项。这是通过clearAllCachedResultValues()完成的。如果您只有简单的公式,或者没有很多公式,或者很少依赖于其他公式单元格的公式,它可能会更快+对您来说肯定会更容易。
否则,使用notify*Cell
方法系列(例如notifyUpdateCell(Cell))告诉评估者根据一个单元格放弃缓存。所有未受影响的单元缓存都将保留,因此复杂的公式评估将更快,因为缓存仍然存在。但是,这种方法确实需要您确切地知道您更改了哪些单元格,因此它更高级。