C# OpenXML Word - 如何创建 VBA 宏?

Nig*_*ine 3 c# ms-word openxml

我正在尝试在使用 OpenXML 创建的新 dotm word 文件中创建宏。我想我必须添加 VBAProjectPart 但我无法继续。

该宏存储在字符串变量中:例如

    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();
Run Code Online (Sandbox Code Playgroud)

Aus*_*ski 5

在 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>
Run Code Online (Sandbox Code Playgroud)

这表明有一些名为 的宏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>
Run Code Online (Sandbox Code Playgroud)

这指向word/vbaProject.bin,它是一种二进制文件格式。

如果您需要以编程方式添加此宏(例如,您无法设置其他所有内容,并手动添加宏),那么您可以在一个文档中手动创建宏,然后以编程方式将二进制流从手动创建的文件复制vbaProject.bin到新vbaProject.bin文件。

如果您决定采用流复制方法,则此问题的答案包括一个演示一种方法的代码片段