2011-03-22 5 views
4

J'essaie de modifier une table Excel intégrée dans un document Word par programmation. Pour ce faire, j'ai modifié le fichier docx et le fichier Excel intégré.Mettre à jour le fichier Excel intégré par programmation

La partie importante du document principal est le suivant:

<w:object w:dxaOrig="8406" w:dyaOrig="2056"> 
    <v:shape id="_x0000_i1028" type="#_x0000_t75" 
    style="width:390.75pt;height:95.25pt" o:ole=""><v:imagedata r:id="rId14" 
    o:title=""/> 
    </v:shape> 
    <o:OLEObject Type="Embed" ProgID="Excel.Sheet.12" ShapeID="_x0000_i1028" 
    DrawAspect="Content" ObjectID="_1349794876" r:id="rId15" 
    UpdateMode="Always"/> 
</w:object> 

Le document Word utilise un OLEObject pour créer un lien vers le document Excel intégré. Pour l'affichage, un fichier .wmf est utilisé (en utilisant l'élément v:shape). J'ai modifié le document Excel, qui a dépassé cet aperçu.

Il en résulte un comportement étrange dans le document:

  • L'aperçu du tableau intégré (Excel) affiche les données erronées
  • double clic sur la table intégrée ouvre la table dans un fichier Excel intégré et montre les données correctes
  • Fermeture de l'éditeur intégré déclenche la génération d'un nouvel aperçu, montrant les données correctes

Bien sûr, je veux la table sh Doit la bonne table lorsque le document est ouvert. Comment puis-je déclencher Word pour supprimer l'image et redessiner l'aperçu?

Une solution idéale pour moi serait de déclencher la régénération de l'aperçu en modifiant simplement le contenu du docx, mais les solutions utilisant un petit script seraient également utiles.

+0

Mettez-vous à jour la feuille de calcul incorporée via OpenXML, .NET, VSTO ou VBA? –

+0

Je fais la conversion moi-même, en utilisant PHP (SimpleXML et un peu DOMDocument). La conversion de la feuille de calcul fonctionne parfaitement, c'est l'image "preview" qui pose problème. – Scharrels

Répondre

5

Il n'y a pas de solution parfaite à cela, mais celle qui fonctionne la plupart du temps est de forcer une ouverture/fermeture de OLEFormat.Object. Cela n'a pas d'importance si vous réhydratez la feuille de calcul Excel incorporée en dehors de Word (c'est-à-dire en manipulant le format Open XML) ou si vous le faites via le modèle objet. Cela implique d'ouvrir la feuille de calcul Excel incorporée à partir de Word, puis de fermer cet objet pour que l'image à modifier soit les valeurs actuelles dans la feuille de calcul incorporée et la nouvelle image à créer.

Cela dépend un peu si vous le faites sur de nombreux documents Word ou un seul. Dans le premier cas, un modèle global (tel que normal.dot ou un modèle personnalisé que vous créez et placez dans le dossier STARTUP) ou dans le dernier cas, exécutez simplement le code derrière un document. Les deux ont une manière différente de faire fonctionner les choses, mais essentiellement vous allez accrocher l'événement Document_Open et à partir de là vérifier si le document actuel a des objets OLE Embedded et si oui, les ouvrir et les fermer. Sans vouloir entrer dans le jeu, comme je l'ai dit, le code n'est pas joli. Fondamentalement parce qu'il utilise SendKeys. La plupart du temps, cela fonctionnera. Parfois, ce ne sera pas le cas. C'est la nature de SendKeys et d'autres programmes recevant l'attention sans consentement (comme un programme de messagerie instantanée).

Si Word a le focus (ce qui signifie que vous ne pouvez pas ouvrir le VBE et appuyez sur F5 ), ce code devrait faire l'affaire:

Sub UpdateEmbeddedXLSX() 
Dim workbook As InlineShape 
    For Each workbook In ActiveDocument.InlineShapes 
     With workbook 
      If .Type = wdInlineShapeEmbeddedOLEObject Then 
       ''# Excel.Sheet.12 for Excel 2007 
       If .OLEFormat.ClassType = "Excel.Sheet.12" Then 
        ''# Open Object as spreadsheet 
        .OLEFormat.DoVerb wdOLEVerbPrimary 
        ''# If you want, you can also do any updates here like 
        .OLEFormat.Object.ActiveSheet.Cells(2, 2).Value = ".1" 
        ''# Nasty - but it works - SendKeys 
        SendKeys "{ESC}", True 
       End If 
      End If 
     End With 
    Next 
End Sub 

À tout le moins, vous pouvez mettre ce code dans votre fichier normal.dot et attribuez-le au QAT à exécuter en tant que macro.

Notez que le code ne contourne pas l'ouverture d'Excel, les valeurs changeant puis se fermant - cela fait partie intégrante de l'utilisation des objets incorporés.Utiliser la liaison au lieu de l'intégrer serait une façon beaucoup plus simple de faire tout cela, mais je réalise que ce n'est pas toujours une option.

+0

J'espérais une solution sans l'utilisation de macros, mais j'ai fini par utiliser celui-ci. Merci pour la réponse! – Scharrels

1

Juste pour ajouter à un ancien poste dans le cas où quelqu'un trébuche sur cela comme je l'ai fait:

Le code ci-dessus fonctionne très bien, mais je l'ai modifié pour utiliser les signets au lieu d'utiliser SendKeys. L'instruction SendKeys désordre vraiment avec le NumLock sur mon clavier. Juste une des bizarreries de cette commande.

Ce que j'ai fait était de créer des signets dans mon modèle Word Doc. Puis dans mon code, j'ai créé un pointeur sur le signet:

Dim bMark as bookmark 
Set bMark as ActiveDocument.Bookmarks("NameOfBookmark") 

ensuite à la place de la déclaration SendKeys, je l'ai fait ce qui suit:

bMark.Range.Select 
Selection.EndKey 

En gros, cela a tiré l'accent sur la feuille de calcul intégrée , et sur le signet de la page. Ensuite, l'instruction .EndKey a simplement supprimé la sélection. Vous n'en avez même pas vraiment besoin.

Espérons que cela aide!

Questions connexes