Excel “Aggiorna tutto” con OpenXML
-
29-09-2019 - |
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.
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 ..
- Salva Open XML cartella di lavoro di nuovo in un file xlsx.
- Caricare la cartella di lavoro utilizzando il modello a oggetti di Excel.
- di chiamata sia
ThisWorkbook.PivotCaches(yourIndex).Refresh();
o
ThisWorkbook.RefreshAll();
anche se ero abbastanza sicuro RefreshAll sarebbe anche il lavoro.
- Utilizza il modello a oggetti per salvare la cartella di lavoro e chiuderlo.
- Riaprire per l'utilizzo con i namespace XML.