13

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

このスニペットはコンパイルできないという事実に加えて、次の 2 つの制限があります。

  • 他のシートには依存式が含まれている可能性がありますが、1 つのシートのみを無効にします。
  • 依存関係は考慮されません。

効率的で (特に、特定のセルの値に依存するセルのみを無効にする)、すべてのシートを考慮に入れる方法を探しています。

アップデート:

その間、コードをコンパイルして実行し、ワークブックのすべてのシートでキャッシュされた値を削除することができました。(回答を参照してください。)それでも、更新されたセルに実際に依存するセルのキャッシュされた値のみを削除する方法など、より良い/代替ソリューションに興味があります。

4

6 に答える 6

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

私のために働く!

于 2010-11-24T03:44:52.507 に答える
2

それは私の問題を部分的に解決し、これまでのところより良い解決策がないように思われるため、そのコードブロックを質問から回答に移動しました...これは、新しいコードがどのように見えるかです:

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();
        }
    }
}
于 2010-04-21T15:24:15.720 に答える
2

私はこれを使います

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

これにより、キャッシュされた値がフラッシュされます

挨拶する

于 2010-07-09T10:37:29.420 に答える
1

最後にワークシートを保存する必要があります。これでうまくいきました。

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();
        }
    }
    worksheetPart.Worksheet.Save();
}
于 2015-03-31T12:42:38.443 に答える