2010-10-11 31 views
6

J'ai un fichier Excel 2007 (format OpenXML) avec une connexion à un fichier xml. Cette connexion génère une table Excel et des tableaux croisés dynamiques.Excel "Actualiser tout" avec OpenXML

J'essaie de trouver un moyen avec OpenXML SDK v2 pour faire la même chose que le bouton "Actualiser tout" dans Excel. Alors que je pourrais mettre à jour automatiquement mon fichier dès qu'un nouveau fichier xml est fourni.

Merci.

+0

En ce qui concerne les tableaux croisés dynamiques, j'ai simplement coché l'option "Actualiser les données à l'ouverture du fichier" de chaque tableau croisé dynamique. –

Répondre

2

Vous ne pouvez pas faire cela avec Open XML. Open XML vous permet de travailler avec les données stockées dans le fichier et de modifier les données et les formules et définitions et autres. Il ne fait aucun calcul. D'un point de vue technique, l'automatisation Excel fonctionnerait, mais ce n'est absolument pas recommandé pour un environnement de serveur et il est préférable de l'éviter sur le bureau, dans la mesure du possible.

2

Je pense que la seule façon que vous pouvez faire cela suit ce type de méthode ..

  1. Enregistrer Ouvrir classeur XML Retour à un fichier XLSX.
  2. Chargez le classeur à l'aide du modèle objet Excel.
  3. Appel soit

ThisWorkbook.PivotCaches(yourIndex).Refresh();

ou

ThisWorkbook.RefreshAll();

bien que je me doutais bien RefreshAll fonctionnerait aussi.

  1. Utilisez le modèle objet pour enregistrer le classeur et le fermer.
  2. Rouvrir pour une utilisation avec des espaces de noms XML.
+0

Il s'agit d'une méthode de la classe COM Excel.Il n'est pas disponible dans les classes OpenXML puisqu'il s'agit de manipuler le XML. Enfin, je ne pense pas que ce soit possible. –

+0

Tout actualiser doit actualiser les tables pivotantes. Je vais modifier ma réponse en ligne avec votre commentaire ci-dessus. –

+0

Merci pour votre temps mais j'ai enfin trouvé une autre solution à mon problème: j'ai mis l'option "rafraîchir lors de l'ouverture du fichier" de tous mes tableaux croisés dynamiques. Ensuite, j'expose simplement des données à une table principale afin que le fichier Excel change automatiquement. –

10

Eh bien, il y a une bonne solution pour cela. En utilisant OpenXML, vous pouvez activer l'option "Actualiser les données lors de l'ouverture du fichier" dans le tableau croisé dynamique (clic droit sur le tableau pivotant-> Options Tableau croisé dynamique-> onglet Données). Ce résultat dans le tableau croisé dynamique d'actualisation automatique lorsque l'utilisateur ouvre la feuille de calcul pour la première fois. Le code:

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

vous devez déterminer "chemin" à la vôtre pivotCacheDefinition - utiliser OpenXML SDK 2.0 outil de productivité pour le chercher.

BuildUriPartDictionary est une méthode standard générée par OpenXML SDK 2.0 outil de productivité

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

Une autre solution est de convertir votre feuille de calcul à macroenabled, intégrez-il un script VBA qui rafraîchira tous les tableaux croisés dynamiques. Cela peut se produire lorsque vous cliquez sur un bouton ou à nouveau lorsque l'utilisateur ouvre une feuille de calcul. Ici vous pouvez trouver le code VBA pour actualiser les tableaux croisés dynamiques: http://www.ozgrid.com/VBA/pivot-table-refresh.htm