【问题标题】:C# OpenXML Word - How to create a VBA macro?C# OpenXML Word - 如何创建 VBA 宏?
【发布时间】:2017-05-04 21:30:46
【问题描述】:

我正在尝试在使用 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();

【问题讨论】:

    标签: c# ms-word openxml


    【解决方案1】:

    在 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-15
      • 1970-01-01
      • 1970-01-01
      • 2016-02-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多