如何将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
相关产品推荐
相关产品推荐

