更新单元格并保存Excel后,基于该单元格的公式不会重新计算。

4

你好,

我正在使用XML SDK来更新Excel文件中的一些单元格。

这是我用来更新给定文本的单元格的代码(它运行良好)。

WorksheetPart worksheetPart = GetWorksheetPartByName(spreadSheet, sheetname);

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

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

    if (worksheetPart != null)
    {
       Cell cell = GetCell(worksheetPart.Worksheet, columnName, rowIndex);
       cell.CellValue = new CellValue(text);
       cell.DataType = new EnumValue<CellValues>(CellValues.Number);
       // Save the worksheet.
       worksheetPart.Worksheet.Save();
    }

另一方面,现在我想重新打开Excel文件并获取基于前一个单元格的公式计算得出的其他单元格的最新值,但即使使用以下代码,我仍无法完成此操作:

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

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

你知道为什么我没有得到更新后的值吗?

谢谢。

祝好。

Jose


“Column text”是什么意思?是一列中一个单元格的文本值吗? - Hans
不好意思,我的意思是我想要更改列标题的文本。 - gabsferreira
根据您所引用的链接示例,您想要更改什么文本?请说明您想要更改的内容以及更改为何种文本。谢谢。 - MethodMan
2个回答

2
对于每个包含公式的单元格,请执行以下函数。
public void ReCalcuateFormula(Cell cell)
{
    if (cell.CellFormula != null)
        cell.CellFormula.CalculateCell = new BooleanValue(true);
}

2
请看Vincent在这里的回答:OpenXML - refresh Excel sheet after cell update

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

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

要测试这一点,您可以将Cell类的CellValue(单元格的值)设置为“3.14159”,而CellFormula保持不变。Excel将计算并显示您的公式的正确值,即使您明确将单元格值设置为“3.14159”。[除非当然,您的公式评估为PI...]

为了解决这个问题,您可以使用一个计算引擎来读取公式并为您计算结果。或者保存电子表格并运行Excel(在Interop模式下)以计算所有公式,但这种方法似乎违背了使用Open XML SDK的初衷。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接