繁体   English   中英

如何使用 .NET/C# 将 VBA 宏注入到 Word 文档中?

[英]How to inject a VBA macro into a Word Document using .NET/C#?

我需要将 VBA 宏项目从模板文件复制到多个办公文件中。 我尝试使用类似于OpenXML SDK Inject VBA into excel workbook 中的方法,这里是https://social.msdn.microsoft.com/Forums/lync/en-US/ab65277e-f0fb-4f2b-bfdc- e141abb8404f/copy-macros-document-to-another-document?forum=oxmlsdk

但是,我无法使以下代码工作。

private static void cloneVbaPart(string src, string dst)
        {
            using (WordprocessingDocument srcDoc = WordprocessingDocument.Open(src, false))
            {
                var vbaPart = srcDoc.MainDocumentPart.VbaProjectPart;

                using (WordprocessingDocument dstDoc = WordprocessingDocument.Open(dst, true))
                {
                    var partsToRemove = new List<OpenXmlPart>();
                    foreach (var part in dstDoc.MainDocumentPart.GetPartsOfType<VbaProjectPart>()) {
                        partsToRemove.Add(part);
                    }
                    foreach (var part in dstDoc.MainDocumentPart.GetPartsOfType<CustomizationPart>())
                    {
                        partsToRemove.Add(part);
                    }
                    foreach (var part in partsToRemove)
                    {
                        dstDoc.MainDocumentPart.DeletePart(part);
                    }
                    
                    var vbaProjectPart = dstDoc.MainDocumentPart.AddNewPart<VbaProjectPart>();

                    using (Stream data = vbaPart.GetStream())
                    {
                        vbaProjectPart.FeedData(data);
                    }
                    using (Stream data = vbaPart.VbaDataPart.GetStream())
                    {
                        vbaProjectPart.FeedData(data);
                    }
                }
            }
        }

当我复制 VbaDataPart 时,Word 无法读取目标文件。 如果我不这样做,宏项目和代码似乎在那里,但它们实际上不起作用。

发现问题了。 我将 VbaDataPart 输入到目标的 vbaProjectPart 而不是它的 vbaDataPart。

最终代码如下:

        private static void cloneVbaPart(string src, string dst)
        {
            using (WordprocessingDocument srcDoc = WordprocessingDocument.Open(src, false))
            {
                var vbaPart = srcDoc.MainDocumentPart.VbaProjectPart;

                using (WordprocessingDocument dstDoc = WordprocessingDocument.Open(dst, true))
                {
                    var partsToRemove = new List<OpenXmlPart>();
                    foreach (var part in dstDoc.MainDocumentPart.GetPartsOfType<VbaProjectPart>()) {
                        partsToRemove.Add(part);
                    }
                    foreach (var part in dstDoc.MainDocumentPart.GetPartsOfType<CustomizationPart>())
                    {
                        partsToRemove.Add(part);
                    }
                    foreach (var part in partsToRemove)
                    {
                        dstDoc.MainDocumentPart.DeletePart(part);
                    }
                    
                    var vbaProjectPart = dstDoc.MainDocumentPart.AddNewPart<VbaProjectPart>();
                    var vbaDataPart = vbaProjectPart.AddNewPart<VbaDataPart>();

                    using (Stream data = vbaPart.GetStream())
                    {
                        vbaProjectPart.FeedData(data);
                    }
                    using (Stream data = vbaPart.VbaDataPart.GetStream())
                    {
                        vbaDataPart.FeedData(data);
                    }
                }
            }
        }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM