【问题标题】:How can I solve my problem in Apache Poi and Excel如何解决我在 Apache Poi 和 Excel 中的问题
【发布时间】:2011-04-06 03:58:31
【问题描述】:

我正在使用 Apache Poi 和 Java 进行 Excel 操作。我已经通过使用 Java 以编程方式修改了 Excel 文件中的一些单元格。

之后,当我手动打开该 Excel 文件以查看该更新时。看到后,当我尝试关闭 Excel 文件时,它再次问我“你想保存对 test.xls 文件所做的更改吗?

如果我按下是按钮,那么只有我能够以编程方式进一步读取公式单元格值。否则,如果我访问公式单元格值,它会返回 0 值。

我该如何解决这个问题?

【问题讨论】:

  • 能否请您提供一些您如何修改您的 Excel 工作表的代码?
  • 您应该将您的问题摘要从“请帮助解决我在 apache poi 和 excel 中的问题”更改为更准确地描述您的问题,如果没有示例,我无法理解。跨度>
  • 这可以关闭为“不清楚”或缺少minimal reproducible example

标签: java apache-poi


【解决方案1】:

默认情况下,当您读取该单元格时,POI 会读取对公式的缓存响应。当您使用 Excel 打开文件时,它会进行计算。然后,当您保存文件时,响应将一起保存。然后当你用 poi 阅读它时,你会得到正确的答案。

如果您想要“正确”答案,则需要计算公式响应。上次我需要这样做时,我必须编写自己的解析器,但现在有了:http://poi.apache.org/spreadsheet/eval.html

简而言之:

Workbook wb = new HSSFWorkbook(inputstream);
FormulaEvaluator evaluator = wb.getCreationHelper().createFormulaEvaluator();
... snip ...
CellValue value = evaluator.evaluate(cellWithFormula);

【讨论】:

  • 重新计算所有公式的更快方法是 HSSFFormulaEvaluator.evaluateAllFormulaCells(wb);
【解决方案2】:

还不能发布 cmets,所以我会留下一个新的答案。 乔里的答案只对一个单元格是正确的

对于多个单元格,使用以下方法更有效:

FormulaEvaluator fe = wb.getCreationHelper().createFormulaEvaluator();
fe.evaluateAll();

这实际上会更新缓存的公式值。

然后,您可以像处理任何其他单元格一样获取它们,例如:

cell.getCellStringValue();

如果您必须重新评估整个工作簿,则值得使用此方法。

请注意,在我写的那一天,只有 POI 3.10-beta1 版本的 POI 可以使用日期评估公式

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-19
    • 2015-07-28
    • 2014-01-07
    • 2019-03-15
    • 1970-01-01
    • 2011-11-13
    • 2014-06-09
    相关资源
    最近更新 更多