2017-04-22 1 views
2

J'essaye de créer une macro dans un nouveau fichier de mots dotm créé avec OpenXML. Je suppose que je dois ajouter un VBAProjectPart mais je ne peux pas continuer.C# OpenXML Word - Comment créer une macro VBA?

La macro est stockée dans une variable de chaîne: par exemple

string tmpMacro = "Private Sub Add_Pages()\nDim tmpPages As Integer\ntmpPages = Selection.Information(wdNumberOfPagesInDocument)\nSelection.EndKey Unit:= wdStory\nDo While Selection.Information(wdNumberOfPagesInDocument) < 10\nSelection.InsertBreak(wdPageBreak)\nLoop\nEnd Sub"; 

    WordprocessingDocument tmpWD = WordprocessingDocument.Create("myDoc.docm", DocumentFormat.OpenXml.WordprocessingDocumentType.MacroEnabledDocument); 
    MainDocumentPart tmpWMP = tmpWGD.AddMainDocumentPart(); 

    tmpMDP.Document = new Document(new Body()); 

    tmpWD.Close(); 

Répondre

2

En OpenXML, les macros sont une combinaison de format binaire et les fichiers XML relation.

Pour vérifier cela par vous-même, créez un nouveau fichier Word/Excel, créez une nouvelle macro et enregistrez-le en tant que document/classeur à extension macro. Fermez le fichier et renommez-le pour qu'il se termine par .zip.

Dans le répertoire principal, vous trouverez le fichier [Content_Types].xml, à l'intérieur duquel il y a deux pointeurs de relation:

  1. <Default Extension="bin" ContentType="application/vnd.ms-office.vbaProject"/>
  2. <Override PartName="/word/vbaData.xml" ContentType="application/vnd.ms-word.vbaData+xml"/>

Pour suivre ces fichiers, recherchez word/vbaData.xml, à l'intérieur de laquelle il y aura quelque chose comme:

<wne:vbaSuppData ...namespaces ommitted... > 
    <wne:mcds> 
     <wne:mcd wne:macroName="PROJECT.NEWMACROS.MACRO1" 
       wne:name="Project.NewMacros.Macro1" 
       wne:bEncrypt="00" 
       wne:cmg="56"/> 
    </wne:mcds> 
</wne:vbaSuppData> 

Ceci montre qu'il existe une macro nommée Project.NewMacros.Macro1, mais rien d'autre. Alors regardons à l'intérieur de word/_rels/document.xml.rels:

<Relationships ...namespaces ommitted...> 
    <Relationship Id="rId1" 
        Type="http://schemas.microsoft.com/office/2006/relationships/vbaProject" 
        Target="vbaProject.bin"/> 
    ...other relationships ommitted... 
</Relationships> 

Ce point à word/vbaProject.bin, qui est un format de fichier binaire. Si vous avez besoin d'ajouter cette macro par programme (par exemple, vous ne pouvez pas définir tout le reste et ajouter manuellement la macro), vous pouvez créer manuellement la macro dans un document unique, puis copier par programme le flux binaire manuellement créé le fichier vbaProject.bin dans un nouveau fichier vbaProject.bin.

Si vous décidez de suivre l'approche de copie de flux, the answer to this question includes a snippet demonstrating one way to do so.