使用OpenXML C#修改Docx文件时文本拆分致替换失败的解决方法
解决OpenXML SDK替换Word文本时字符串被拆分的问题
在Word的OpenXML结构中,视觉上连续的文本经常会被拆分为多个<w:t>(Text)元素,这可能是由于编辑操作、格式变化或Word内部存储机制导致的。直接遍历单个Text节点无法匹配到被拆分的完整目标字符串,因此替换失效。
解决方案:合并Run内的Text节点后再替换
先将每个Run中的所有Text节点合并为一个,确保同一Run内的文本是完整的,再执行替换操作:
using (WordprocessingDocument doc = WordprocessingDocument.Open(documentName, true)) { var document = doc.MainDocumentPart.Document; // 合并每个Run中的多个Text节点 foreach (var run in document.Descendants<Run>()) { var textNodes = run.Descendants<Text>().ToList(); if (textNodes.Count <= 1) continue; // 拼接所有Text内容到第一个节点 string combinedText = string.Concat(textNodes.Select(t => t.Text)); textNodes[0].Text = combinedText; // 删除多余的Text节点 for (int i = 1; i < textNodes.Count; i++) { textNodes[i].Remove(); } } // 执行文本替换 foreach (var text in document.Descendants<Text>()) { text.Text = text.Text.Replace("[COMPANY NAME]", "TEST INC"); } // 保存修改后的文档 document.Save(); }
说明
- 合并Text节点:同一个Run下的Text节点属于同一文本块,合并后能保证文本的完整性,避免因拆分导致的匹配失败。
- 全局替换:合并完成后,遍历所有Text节点执行替换即可匹配到完整的目标字符串。
- 跨Run的情况:如果目标字符串被拆分到不同Run中,需要额外处理连续Run的文本拼接与替换,这种场景可以通过查找相邻Run的Text内容,判断是否拼接后包含目标字符串,再调整节点内容和结构。
内容的提问来源于stack exchange,提问作者Milo
相关产品推荐
相关产品推荐

