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;

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

谢谢

问候。

何塞

4

2 回答 2

2

在此处查看文森特的回答: OpenXML - 在单元格更新后刷新 Excel 工作表

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

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

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

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

于 2013-10-12T00:39:36.337 回答
2

对包含公式的每个单元格执行以下函数。

public void ReCalcuateFormula(Cell cell)
{
    if (cell.CellFormula != null)
        cell.CellFormula.CalculateCell = new BooleanValue(true);
}
于 2013-04-30T20:22:16.970 回答