Dot-Net

OpenXML SDK:使 Excel 重新計算公式

  • October 28, 2021

我通過 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;

為我工作!

由於它部分解決了我的問題並且到目前為止似乎沒有更好的解決方案,因此將該程式碼塊從問題移到答案……這就是新程式碼的樣子:

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

引用自:https://stackoverflow.com/questions/2668643