OpenXML SDK:使Excel重新计算公式

chi*_*oro 12 .net excel openxml openxml-sdk

我通过Microsoft Office OpenXML SDK 2.0更新Excel电子表格的一些单元格.更改值会使包含依赖于已更改单元格的公式的所有单元格无效.但是,由于缓存的值,Excel不会重新计算公式,即使用户单击"立即计算".

通过SDK使整个工作簿的所有依赖单元无效的最佳方法是什么?到目前为止,我在http://cdonner.com/introduction-to-microsofts-open-xml-format-sdk-20-with-a-focus-on-excel-documents.htm找到了以下代码片段:

public static void ClearAllValuesInSheet
      (SpreadsheetDocument spreadSheet, string sheetName)
{
    WorksheetPart worksheetPart =
        GetWorksheetPartByName(spreadSheet, sheetName);

    foreach (Row row in
       worksheetPart.Worksheet.
          GetFirstChild().Elements())
    {
        foreach (Cell cell in row.Elements())
        {
            if (cell.CellFormula != null &&
                  cell.CellValue != null)
            {
                cell.CellValue.Remove();
            }
        }

    }

    worksheetPart.Worksheet.Save();
}
Run Code Online (Sandbox Code Playgroud)

除了这个片段不能为我编译的事实,它有两个限制:

  • 它只会使单张纸无效,但其他纸张可能包含相关配方
  • 它没有考虑任何依赖关系.

我正在寻找一种有效的方法(特别是,只会使依赖于某个单元格值的单元格无效),并考虑所有表格.

更新:

与此同时,我设法编译和运行代码,并删除工作簿的所有工作表上的缓存值.(参见答案.)我仍然对更好/替代解决方案感兴趣,特别是如何只删除实际依赖于更新单元格的单元格的缓存值.

小智 44

spreadSheet.WorkbookPart.Workbook.CalculationProperties.ForceFullCalculation = true;
spreadSheet.WorkbookPart.Workbook.CalculationProperties.FullCalculationOnLoad = true;
Run Code Online (Sandbox Code Playgroud)

适合我!