1

我正在寻找用另一个 word 文档的全部内容替换 word 文档中的书签。我希望按照以下方式做一些事情,但附加 xml 似乎还不够,因为它不包含图片。

using Word = Microsoft.Office.Interop.Word;
...

Word.Application wordApp = new Word.Application();
Word.Document doc = wordApp.Documents.Add(filename);
var bookmark = doc.Bookmarks.OfType<Bookmark>().First();

var doc2 = wordApp.Documents.Add(filename2);

bookmark.Range.InsertXML(doc2.Contents.XML);

第二个文档包含一些图像和一些文本表格。


更新:使用 XML 取得了进展,但仍然不能满足添加图片。

4

2 回答 2

1

你已经跳得很深了。

如果您正在使用对象模型 ( bookmark.Range) 并尝试插入图片,您可以使用剪贴板或bookmark.Range.InlineShapes.AddPicture(...). 如果您尝试插入整个文档,您可以复制/粘贴第二个文档:

 Object objUnit = Word.WdUnits.wdStory;
 wordApp.Selection.EndKey(ref objUnit, ref oMissing);         
 wordApp.ActiveWindow.Selection.PasteAndFormat(Word.WdRecoveryType.wdPasteDefault);

如果您使用 XML,则可能存在其他问题,例如格式、图像、页眉/页脚无法正确输入。

根据任务,使用DocumentBuilder和 OpenXML SDK 可能会更好。如果您正在编写 Word 插件,您可以使用对象 API,如果您在没有 Word 的情况下使用 OpenXML SDK 和 DocumentBuilder 处理文档,它可能会执行相同的操作。DocumentBuilder 的问题是,如果它不起作用,则没有很多解决方法可以尝试。如果您尝试对其进行故障排除,它是开源的,而不是最干净的代码。

于 2013-05-18T15:12:20.263 回答
0

您可以使用 openxml SDK 和 Document builder 执行此操作。在这里概述是您需要的

1> 在主文档中注入插入键

public WmlDocument GetProcessedTemplate(string templatePath, string insertKey)
{
    WmlDocument templateDoc = new WmlDocument(templatePath);
    using (MemoryStream mem = new MemoryStream())
    {
        mem.Write(templateDoc.DocumentByteArray, 0, templateDoc.DocumentByteArray.Length);
        using (WordprocessingDocument doc = WordprocessingDocument.Open([source], true))                            
        {
            XDocument xDoc = doc.MainDocumentPart.GetXDocument();
            XElement bookMarkPara = [get bookmarkPara to replace];
            bookMarkPara.ReplaceWith(new XElement(PtOpenXml.Insert, new XAttribute("Id", insertKey)));
            doc.MainDocumentPart.PutXDocument();
        }
        templateDoc.DocumentByteArray = mem.ToArray();
    }
    return templateDoc;
}

2> 使用文档生成器进行合并

List<Source> documentSources = new List<Source>();
var insertKey = "INSERT_HERE_1";
var processedTemplate = GetProcessedTemplate([docPath], insertKey);  
documentSources.Add(new Source(processedTemplate, true));
documentSources.Add(new Source(new WmlDocument([docToInsertFilePath]), insertKey));
DocumentBuilder.BuildDocument(documentSources, [outputFilePath]);
于 2013-05-18T14:31:40.900 回答