OpenXML SDK:使Excel重新计算公式

我通过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();
}

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

  • 它只会使单张纸无效,但其他纸张可能包含相关公式
  • 它没有考虑到任何依赖关系。
  • 我正在寻找一种有效的方法(特别是,只会使依赖某个单元格值的单元无效),并考虑所有表单。

    更新:

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


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

    适合我!


    我用这个

        static void FlushCachedValues(SpreadsheetDocument doc)
        {
            doc.WorkbookPart.WorksheetParts
                .SelectMany(part => part.Worksheet.Elements<SheetData>())
                .SelectMany(data => data.Elements<Row>())
                .SelectMany(row => row.Elements<Cell>())
                .Where(cell => cell.CellFormula != null)
                .Where(cell => cell.CellValue != null)
                .ToList()
                .ForEach(cell => cell.CellValue.Remove())
                ;
        }
    

    这会刷新缓存的值

    招呼


    由于它部分解决了我的问题,目前似乎还没有更好的解决方案,因此将该代码块从问题中移出来作为答案......这就是新代码的外观:

    foreach (WorksheetPart worksheetPart in spreadSheet.WorkbookPart.WorksheetParts)
    {
        foreach (Row row in
                worksheetPart.Worksheet.GetFirstChild<SheetData>().Elements())
        {
            foreach (Cell cell in row.Elements())
            {
                if (cell.CellFormula != null && cell.CellValue != null)
                    cell.CellValue.Remove();
            }
        }
    }
    
    链接地址: http://www.djcxy.com/p/27755.html

    上一篇: OpenXML SDK: Make Excel recalculate formula

    下一篇: encryption export compliance documentation