Domanda

Ho un file Excel 2007 (formato OpenXML) con un collegamento in un file XML. Questo collegamento genera una tabella pivot di Excel e tabelle.

Sto cercando di trovare un modo con OpenXML SDK v2 a fare lo stesso come il pulsante "Aggiorna tutto" in Excel. In modo da poter aggiornare automaticamente il mio file non appena è previsto un nuovo file XML.

Grazie.

È stato utile?

Soluzione

Non si può fare questo con Open XML. Open XML consente di lavorare con i dati memorizzati nel file e modificare i dati e le formule e le definizioni e così via. Essa in realtà non fare alcun calcolo.

automazione di Excel tecnicamente avrebbe funzionato, ma non è assolutamente consigliato per un ambiente server ed è meglio evitare sul desktop, se possibile.

Altri suggerimenti

Il pozzo là è abbastanza buona soluzione per questo. Usando OpenXML è possibile attivare "i dati di aggiornamento quando si apre il file" nella tabella pivot (tasto destro del mouse su perno tavola-> Tabella pivot Opzioni-> scheda Dati). Questo risultato in Auto Refresh tabella pivot quando l'utente apre primo foglio di calcolo. Il codice:

  using (var document = SpreadsheetDocument.Open(newFilePath, true))
        {
            var uriPartDictionary = BuildUriPartDictionary(document);

            PivotTableCacheDefinitionPart pivotTableCacheDefinitionPart1 = (PivotTableCacheDefinitionPart)uriPartDictionary["/xl/pivotCache/pivotCacheDefinition1.xml"]; 
            PivotCacheDefinition pivotCacheDefinition1 = pivotTableCacheDefinitionPart1.PivotCacheDefinition;
            pivotCacheDefinition1.RefreshOnLoad = true;               
        }

è necessario determinare "percorso" per il vostro pivotCacheDefinition - uso OpenXML SDK 2.0 Produttività Tool per cercarlo

.

BuildUriPartDictionary è un metodo standard generato da OpenXML SDK 2.0 Produttività strumento

protected Dictionary<String, OpenXmlPart> BuildUriPartDictionary(SpreadsheetDocument document)
    {
        var uriPartDictionary = new Dictionary<String, OpenXmlPart>();
        var queue = new Queue<OpenXmlPartContainer>();
        queue.Enqueue(document);
        while (queue.Count > 0)
        {
            foreach (var part in queue.Dequeue().Parts.Where(part => !uriPartDictionary.Keys.Contains(part.OpenXmlPart.Uri.ToString())))
            {
                uriPartDictionary.Add(part.OpenXmlPart.Uri.ToString(), part.OpenXmlPart);
                queue.Enqueue(part.OpenXmlPart);
            }
        }
        return uriPartDictionary;
    }

Un'altra soluzione è quella di convertire il vostro foglio di calcolo per macroenabled, ci incorporare uno script VBA che aggiornare tutte le tabelle pivot. Questo può accadere sul tasto di scatto o ancora quando l'utente apre foglio di calcolo. Qui potete trovare il codice VBA per tabelle pivot di aggiornamento: http://www.ozgrid.com/VBA/pivot-table-refresh.htm

Penso che l'unico modo è possibile farlo è seguendo questo tipo di metodo ..

  1. Salva Open XML cartella di lavoro di nuovo in un file xlsx.
  2. Caricare la cartella di lavoro utilizzando il modello a oggetti di Excel.
  3. di chiamata sia

ThisWorkbook.PivotCaches(yourIndex).Refresh();

o

ThisWorkbook.RefreshAll();

anche se ero abbastanza sicuro RefreshAll sarebbe anche il lavoro.

  1. Utilizza il modello a oggetti per salvare la cartella di lavoro e chiuderlo.
  2. Riaprire per l'utilizzo con i namespace XML.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top