【问题标题】:How to inject a VBA macro into a Word Document using .NET/C#?如何使用 .NET/C# 将 VBA 宏注入 Word 文档?
【发布时间】:2021-11-10 02:37:52
【问题描述】:

我需要将 VBA 宏项目从模板文件复制到多个 office 文件中。我尝试使用类似于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 无法读取目标文件。如果我不这样做,宏项目和代码似乎在那里,但它们实际上不起作用。

【问题讨论】:

    标签: c# .net openxml


    【解决方案1】:

    发现问题。我将 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);
                        }
                    }
                }
            }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-09-29
      • 2011-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-11
      相关资源
      最近更新 更多