使用 OOXML SDK 将宏 (vbaProject.bin) 注入到 Docx 文件中

问题描述 投票:0回答:1

我需要您帮助使用 OOXML SDK。

上下文如下:我想使用 OOXML SDK 注入一些 VBA 宏。

我的意见:

  • 遵循 OOXML 规范 (.docx) 的 Word 文档
  • 包含宏的 vbaProject.bin 文件
  • 包含一些配置的 vbaData.xml

我尝试分三步实施:

  1. 将我的 docx 转换为 docm
  2. 注入 vbaData.xml
  3. 注入vbaProject.bin

当我尝试创建 VbaDataPart 类型的部件时,出现错误“DocumentFormat.OpenXml.Packaging.OpenXmlPackageException :‘该部件无法添加到此处。’”:

var vbaDataPart = workingCopyWordDocument.MainDocumentPart.AddNewPart<VbaDataPart>();

我尝试在另一部分创建它,但我有同样的问题:

workingCopyWordDocument.AddNewPart<VbaDataPart>();

这是我的代码:

public static WordprocessingDocument injectMacrosFromBinFiles(WordprocessingDocument sourceWordDocument, Stream vbaDataStream, Stream vbaProjectBinStream)
{
    // Create a working copy
    var openInEditableMode = true;
    var workingCopyWordDocument = (WordprocessingDocument) sourceWordDocument.Clone(new MemoryStream(), openInEditableMode);

    // Enable macros in document
    workingCopyWordDocument.ChangeDocumentType(WordprocessingDocumentType.MacroEnabledDocument);
    if (workingCopyWordDocument.MainDocumentPart == null)
    {
        throw new Exception("MainDocumentPart not found");
    }


    // Inject Macro
    var vbaDataPart = workingCopyWordDocument.MainDocumentPart.AddNewPart<VbaDataPart>();
    vbaDataPart.FeedData(vbaDataStream);

    var vbaProjectPart = workingCopyWordDocument.MainDocumentPart.AddNewPart<VbaProjectPart>();
    vbaProjectPart.FeedData(vbaProjectBinStream);

    return workingCopyWordDocument;
}

您对如何创建这个部件有任何想法吗?

openxml openxml-sdk
1个回答
0
投票

我通过将 VbaDataPart 添加到新创建的 VbaProjectPart 中解决了我的问题。

答案:

// Inject Macro
var vbaProjectPart = workingCopyWordDocument.MainDocumentPart.AddNewPart<VbaProjectPart>();
vbaProjectPart.FeedData(vbaProjectBinStream);

var vbaDataPart = vbaProjectPart.AddNewPart<VbaDataPart>();
vbaDataPart.FeedData(vbaDataStream);

现在,当打开生成的文档时,就会执行我的 VBA 宏:)

© www.soinside.com 2019 - 2024. All rights reserved.