我需要您帮助使用 OOXML SDK。
上下文如下:我想使用 OOXML SDK 注入一些 VBA 宏。
我的意见:
我尝试分三步实施:
当我尝试创建 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;
}
您对如何创建这个部件有任何想法吗?
我通过将 VbaDataPart 添加到新创建的 VbaProjectPart 中解决了我的问题。
答案:
// Inject Macro
var vbaProjectPart = workingCopyWordDocument.MainDocumentPart.AddNewPart<VbaProjectPart>();
vbaProjectPart.FeedData(vbaProjectBinStream);
var vbaDataPart = vbaProjectPart.AddNewPart<VbaDataPart>();
vbaDataPart.FeedData(vbaDataStream);
现在,当打开生成的文档时,就会执行我的 VBA 宏:)