【问题标题】:Word API: copy macros from one doc to an other docWord API:将宏从一个文档复制到另一个文档
【发布时间】:2014-09-22 06:52:04
【问题描述】:

是否可以使用 Word API 将现有 Word 文档的宏复制到新创建的 Word 文档中?

我尝试使用 C#。我知道必须更改 Word 中的信任级别才能这样做。我还能够确定文档有宏。

但如果我用 C# 创建一个新文档,它没有 VBProject 并且是只读的。

这里有一些代码来解释我想要做什么:

Word.Document oldDoc = word.Documents.Open(oldFilePath);

if (!oldDoc.HasVBProject)
    return;

Word.Document newDoc = word.Documents.Add();
FileInfo file = new FileInfo(filePath);

foreach (var component in oldDoc.VBProject.VBComponents)
{
    newDoc.VBProject.VBComponents.Add(component);
}

【问题讨论】:

    标签: c# ms-word automation


    【解决方案1】:

    OpenXML 似乎适用于此目的,请参阅来自MSDN 的示例代码

    using System;
    using System.Text;
    using System.Collections.Generic;
    using System.Linq;
    using DocumentFormat.OpenXml;
    using DocumentFormat.OpenXml.Wordprocessing;
    using DocumentFormat.OpenXml.Packaging;
    namespace CtrlInsertMacro
    {
        class Program
        {
            static void Main(string[] args)
            {
                using (WordprocessingDocument destDoc = WordprocessingDocument.Create("destination.docm", WordprocessingDocumentType.MacroEnabledDocument))
                {
                WordprocessingDocument srcDoc = WordprocessingDocument.Open("macrosource.docm", false);
                MainDocumentPart mainPart = destDoc.AddMainDocumentPart();
                // Create the document structure and add some text.
                mainPart.Document = new Document();
                Body body = mainPart.Document.AppendChild(new Body());
                Paragraph para = body.AppendChild(new Paragraph());
                Run run = para.AppendChild(new Run());
                run.AppendChild(new Text("This is a copied macro enabled doc. Hit Ctrl+Insert Now."));
                // Get VBA parts from source document
                VbaProjectPart vbaSrc = srcDoc.MainDocumentPart.VbaProjectPart;
                VbaDataPart vbaDatSrc = vbaSrc.VbaDataPart;
                CustomizationPart keymapSrc = srcDoc.MainDocumentPart.CustomizationPart;
                // Create VBA parts in destination document
                VbaProjectPart vbaProjectPart1 = mainPart.AddNewPart<VbaProjectPart>("rId9");
                VbaDataPart vbaDataPart1 = vbaProjectPart1.AddNewPart<VbaDataPart>("rId1");
                CustomizationPart customKeyMapPart = mainPart.AddNewPart<CustomizationPart>("rId10");
                // Copy part contents
                vbaProjectPart1.FeedData(vbaSrc.GetStream());
                vbaDataPart1.FeedData(vbaDatSrc.GetStream());
                customKeyMapPart.FeedData(keymapSrc.GetStream());
                }
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多