2017-04-22 175 views
2

我正在嘗試在用OpenXML創建的新dotm文件中創建一個宏。我想我必須添加一個VBAProjectPart,但我無法繼續。C#OpenXML Word - 如何創建一個VBA宏?

的宏存儲在一個字符串變量:例如

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(); 

回答

2

OpenXML的,宏是二進制格式,XML文件的關係的組合。

要親自驗證,創建一個新的Word/Excel文件,創建一個新的宏,並將其保存爲啓用宏的文檔/工作簿。關閉文件並將其重命名爲.zip

在主目錄中,你會發現文件[Content_Types].xml,這裏面有兩個關係指針:

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

要按照這些文件,找到word/vbaData.xml,裏面會有這樣的東西:

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

這表明存在一些名爲Project.NewMacros.Macro1的宏,但沒有其他的東西。因此,讓我們來看看的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> 

這點word/vbaProject.bin,這是一個二進制文件格式。

如果您需要以編程方式添加此宏(例如,您無法設置其他所有項並手動添加宏),則可以手動在一個文檔中創建宏,然後以編程方式從手動複製二進制流將vbaProject.bin文件創建爲新的vbaProject.bin文件。

如果您決定遵循流式複製方法,the answer to this question includes a snippet demonstrating one way to do so