3

我有一个使用 OpenXML SDK 读写 Excel (xlsx) 单元格的类。该课程基于此处投票最多的答案:Open XML SDK 2.0 - 如何更新电子表格中的单元格?

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

所以看起来 cell 的旧值被缓存在某个地方......这很奇怪,因为我每次在读/写单元格之前打开/关闭我的文档。

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

4

2 回答 2

8

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

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

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

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

于 2013-05-31T03:31:48.903 回答
0

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

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

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

document.WorkbookPart.Workbook.CalculationProperties.ForceFullCalculation = true;
于 2021-10-20T23:12:21.200 回答