使用 Apache POI 重新计算电子表格中的公式

发布于 2024-11-04 04:20:12 字数 626 浏览 5 评论 0原文

我正在尝试使用 POI XSSF 来评估一些 Excel 公式。 这些值不必保存,而且我可能必须计算许多公式,因此我尝试在同一个单元格中完成所有操作。

问题是,即使在我重新计算

FormulaEvaluator evaluator = wb.getCreationHelper().createFormulaEvaluator();
XSSFCell formulaCell = row.createCell(6);
formulaCell.setCellFormula("Date(2011,10,6)");
CellValue cellValue = evaluator.evaluate(formulaCell);
System.out.println(cellValue.getNumberValue());

formulaCell.setCellFormula("Date(1911,3,4)");
cellValue = evaluator.evaluate(formulaCell);
System.out.println(cellValue.getNumberValue());

此输出 40822.0 之后,单元格值似乎仍停留在输入的第一个公式上 40822.0(Excel 相当于 10/6/2011)两次,而不是重新计算新公式。

I'm trying to use POI XSSF to evaluate some Excel formulas.
The values do not have to be saved, and I may have to calculate many formulas, so I'm trying to do it all in the same cell.

The problem is that the cell value seems to get stuck on the first formula entered even after I recalculate

FormulaEvaluator evaluator = wb.getCreationHelper().createFormulaEvaluator();
XSSFCell formulaCell = row.createCell(6);
formulaCell.setCellFormula("Date(2011,10,6)");
CellValue cellValue = evaluator.evaluate(formulaCell);
System.out.println(cellValue.getNumberValue());

formulaCell.setCellFormula("Date(1911,3,4)");
cellValue = evaluator.evaluate(formulaCell);
System.out.println(cellValue.getNumberValue());

This outputs 40822.0
40822.0 (excel equivalent of 10/6/2011) both times instead of reevaluating to the new formula.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

被翻牌 2024-11-11 04:20:14

如果您多次使用 FormulaEvaluator,则需要在两次使用之间使用此行,否则每次都会使用相同的结果。

formulaEvaluator.clearAllCachedResultValues()

If you use the formulaEvaluator more than once, you need this line in between uses, or else it uses the same result each time.

formulaEvaluator.clearAllCachedResultValues()
大姐,你呐 2024-11-11 04:20:14

FormulaEvaluator 缓存单元格计算值以加快处理速度。如果您在创建评估器后执行单元格更新,那么您需要告诉它!

有关更多详细信息,请参阅 FormulaEvaluator 文档。对于您的情况,请尝试:

formulaCell.setCellFormula("Date(1911,3,4)");
evaluator.notifySetFormula(formulaCell);
cellValue = evaluator.evaluate(formulaCell);
System.out.println(cellValue.getNumberValue());

The FormulaEvaluator caches cell calculated values to speed up processing. If you perform cell updates after creating the evaluator, then you need to tell it!

See the FormulaEvaluator documentation for more details. For you case, try:

formulaCell.setCellFormula("Date(1911,3,4)");
evaluator.notifySetFormula(formulaCell);
cellValue = evaluator.evaluate(formulaCell);
System.out.println(cellValue.getNumberValue());
自由如风 2024-11-11 04:20:14

您可以使用以下步骤来完成您的工作。这是两种解决方案,您可以使用其中的任何一种功能。它会评估完整的工作簿,因此您使用的任何公式都会得到评估。希望这有帮助。

1) evaluator.evaluateAll();
2) XSSFFormulaEvaluator.evaluateAllFormulaCells(wb);

You can use following steps to get your work done. These are two solutions out of which you can make use of any one function. It evaluates the complete workbook so whatever formula you use would get evaluated. Hope this helps.

1) evaluator.evaluateAll();
2) XSSFFormulaEvaluator.evaluateAllFormulaCells(wb);

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文