Domanda

Aggiorno alcune celle di un foglio di calcolo Excel tramite Microsoft Office OpenXML SDK 2.0.La modifica dei valori rende non valide tutte le celle contenenti la formula che dipende dalle celle modificate.Tuttavia, a causa dei valori memorizzati nella cache, Excel non ricalcola la formula, anche se l'utente fa clic su "Calcola ora".

Qual è il modo migliore per invalidare tutte le celle dipendenti dell'intera cartella di lavoro tramite l'SDK?Finora ho trovato il seguente frammento di codice su 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();
}

Oltre al fatto che questo snippet non viene compilato per me, presenta due limitazioni:

  • Invalida solo un singolo foglio, sebbene altri fogli potrebbero contenere formule dipendenti
  • Non tiene conto di eventuali dipendenze.

Sto cercando un modo che sia efficiente (in particolare, invalidi solo le celle che dipendono dal valore di una determinata cella) e tenga conto di tutti i fogli.

Aggiornamento:

Nel frattempo sono riuscito a compilare ed eseguire il codice e a rimuovere i valori memorizzati nella cache su tutti i fogli della cartella di lavoro.(Vedi le risposte.) Sono comunque interessato a soluzioni migliori/alternative, in particolare come eliminare solo i valori memorizzati nella cache delle celle che dipendono effettivamente dalla cella aggiornata.

È stato utile?

Soluzione

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

funziona per me!

Altri suggerimenti

Io uso questo

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

Questo cancella i valori memorizzati nella cache

saluta

Dal momento che risolve in parte il mio problema e sembra che ci sia una soluzione migliore finora, si è trasferito che codeblock fuori dalla questione di una risposta ... Ecco come i nuovi look codice come:

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

È necessario salvare il foglio di lavoro, alla fine, questo ha funzionato per me.

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

Algoritmi:

  • angolo in radianti: (Math.PI / 180) * angolo
  • Distanza: Math.pow (velocità, 2) / * GRAVITA Math.sin (2 * angleInRadians)
  • La gravità è pari a 9,8

Esempio:. A 45 gradi e 56 m / s, la palla deve viaggiare 320 metri

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top