【问题标题】:OpenXML - refresh Excel sheet after cell updateOpenXML - 单元格更新后刷新 Excel 工作表
【发布时间】:2013-05-29 15:49:23
【问题描述】:

我有一个使用 OpenXML SDK 读写 Excel (xlsx) 单元格的类。该课程基于此处投票最多的答案:Open XML SDK 2.0 - how to update a cell in a spreadsheet?

我需要更新一个单元格,然后获取另一个单元格的值,其中包含一个计算公式。更新工作正常,但是当我在更新后读取公式单元格时,我得到了旧值,该值在编辑之前存在于文档中。但是,当我在运行程序后手动打开我的 xlsx 时,我可以看到正确的值。

所以似乎单元格的旧值缓存在某处......这很奇怪,因为我每次在读/写单元格之前打开/关闭我的文档。

编辑: 文森特的回答让我更新了我的示例代码。我添加了一个 Refresh 方法,可以在后台运行的 Excel 应用程序中打开、保存和关闭文档。这会重新计算我的公式。 有关更多详细信息和 C# 代码示例,请参阅:http://fczaja.blogspot.com/2013/05/how-to-read-and-write-excel-cells-with.html

【问题讨论】:

  • 是的,我已经看到了。如果您查看我的 UpdateCell 和 ReadCell 方法,您会发现我已经尝试从最受好评的答案中应用解决方案 - 不走运
  • 您还应该阅读其他答案。我试图找到我在哪里读到,确保 Excel 重新计算公式的唯一方法是删除公式单元格的缓存值
  • 在另一个副本中 ;-) stackoverflow.com/questions/7012545/…

标签: excel excel-formula openxml openxml-sdk


【解决方案1】:

Open XML SDK 不会刷新公式的计算结果。只有 Excel 可以做到这一点(或其他电子表格软件)。因此,即使您将 ForceFullCalculation 和 FullCalculationOnLoad 设置为 true,您也只会告诉 Excel 强制执行完整计算并在加载电子表格文件时执行此操作。

这就是为什么您总是获得“旧”值的原因。因为没有“新”价值可言。

要对此进行测试,您可以将 CellValue(Cell 类的)设置为“3.14159”,而 CellFormula 保持不变。即使您专门将单元格值设置为“3.14159”,Excel 也会计算并显示公式的正确值。 [当然,除非您的公式计算结果为 PI...]

要解决此问题,您可以使用计算引擎来读取公式并为您计算结果。或者保存电子表格并运行 Excel(在互操作模式下)来计算所有公式,但这首先违背了使用 Open XML SDK 的目的。

【讨论】:

  • 嗨文森特,这种将单元格值设置为“3.14”的方法对我不起作用。我在这里发布了类似的问题。如果可能,请查看并提供反馈。我非常感谢。 stackoverflow.com/questions/21273023/…
【解决方案2】:

您可以使用 Workbook.CalculationProperties 属性,例如:

document.WorkbookPart.Workbook.CalculationProperties.FullCalculationOnLoad = true;

您还可以强制计算公式(如果需要):

document.WorkbookPart.Workbook.CalculationProperties.ForceFullCalculation = true;

【讨论】:

    猜你喜欢
    • 2021-07-03
    • 2023-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多