You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将Word已打开文档选中内容通过OpenXML写入目标文档?

解决Word选中内容通过OpenXML追加到目标文档的问题

核心问题分析

你拿到的range.WordOpenXML是完整的Word文档XML结构,直接把字符串追加到Body里肯定不行——Body.Append()需要的是OpenXmlElement类型对象,而非纯文本XML。而且完整文档XML包含<w:document>、<w:body>等根节点,直接插入会破坏目标文档结构,必须先提取出<w:body>内部的内容片段。

解决方案代码

以下是修改后的完整实现,关键在于解析XML并提取有效内容节点:

using DocumentFormat.OpenXml.Wordprocessing;
using DocumentFormat.OpenXml.Packaging;
using Range = Microsoft.Office.Interop.Word.Range;
using System.Xml.Linq;
using DocumentFormat.OpenXml;

public void AppendRangeToDocument(string targetDocPath, Range selectedRange)
{
    // 获取选中内容的完整XML
    string rangeXml = selectedRange.WordOpenXML;
    
    // 解析XML并提取<body>内部的子节点
    XDocument xmlDoc = XDocument.Parse(rangeXml);
    XNamespace w = "http://schemas.openxmlformats.org/wordprocessingml/2006/main";
    var bodyNodes = xmlDoc.Descendants(w + "body").Elements();

    using (WordprocessingDocument wordDoc = WordprocessingDocument.Open(targetDocPath, true))
    {
        Body targetBody = wordDoc.MainDocumentPart.Document.Body;

        // 将每个XML节点转换为OpenXmlElement并追加到目标文档
        foreach (var node in bodyNodes)
        {
            // 把XElement转换为OpenXmlElement
            OpenXmlElement openXmlNode = OpenXmlElement.Load(node.CreateReader());
            targetBody.Append(openXmlNode);
        }

        // 保存修改后的文档(按需选择覆盖原文档或另存)
        string newDocPath = targetDocPath.Replace(".docx", "_RangeAppend.docx");
        wordDoc.SaveAs(newDocPath);
    }
}

关键细节说明

  • 命名空间处理:Word OpenXML使用固定命名空间http://schemas.openxmlformats.org/wordprocessingml/2006/main,必须通过该命名空间才能正确定位<w:body>节点。
  • 提取有效内容:仅保留<w:body>下的子节点,避免完整文档结构插入导致的XML冲突。
  • 类型转换:通过OpenXmlElement.Load()将XElement转换为OpenXML库可识别的OpenXmlElement,满足Body.Append()的参数要求。
  • 性能优势:全程基于OpenXML操作,无需启动Word进程打开目标文档,相比Interop复制粘贴效率提升明显。

内容的提问来源于stack exchange,提问作者deku

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 06:35:45