OpenXmlPowerTools报“文档已开启修订跟踪”错误的解决问询
解决OpenXmlPowerTools替换文本时的修订跟踪异常问题
问题原因
即使Office 365在线编辑器显示“跟踪更改”已关闭且无跟踪内容,Word文档的底层OpenXML结构中可能仍残留修订相关元素,导致OpenXmlPowerTools触发“文档已开启修订跟踪”的异常。
解决方案
方法一:先清除文档中的所有修订痕迹
在执行文本替换前,先用OpenXML SDK处理文档,彻底关闭修订跟踪并接受所有残留的修订:
using DocumentFormat.OpenXml.Packaging; using DocumentFormat.OpenXml.Wordprocessing; // 先处理文档的修订问题 using (var wordDoc = WordprocessingDocument.Open(FileName, true)) { var settingsPart = wordDoc.MainDocumentPart.DocumentSettingsPart; var docSettings = settingsPart.Settings; // 关闭修订跟踪功能 var trackRevisions = docSettings.Elements<TrackRevisions>().FirstOrDefault(); if (trackRevisions != null) trackRevisions.Remove(); docSettings.AppendChild(new TrackRevisions { Val = false }); // 接受所有类型的修订,保留最终内容 var document = wordDoc.MainDocumentPart.Document; // 处理插入型修订 foreach (var insertion in document.Descendants<Insertion>().ToList()) { insertion.Parent.ReplaceChild(insertion.CloneNode(true), insertion); } // 处理删除型修订 foreach (var deletion in document.Descendants<Deletion>().ToList()) { deletion.Remove(); } // 处理格式修改型修订 foreach (var formatChange in document.Descendants<FormattingChange>().ToList()) { formatChange.Remove(); } wordDoc.Save(); } // 执行原本的文本替换逻辑 OpenXmlPowerTools.WmlDocument doc = new OpenXmlPowerTools.WmlDocument(FileName); foreach (MergeCode mc in mergeCodes) doc = doc.SearchAndReplace(mc.Code, mc.Value, true);
方法二:直接用OpenXML SDK执行文本替换(绕过OpenXmlPowerTools的检查)
如果不需要依赖OpenXmlPowerTools的SearchAndReplace,也可以直接用OpenXML SDK遍历文档内容进行替换,此方式不受修订跟踪状态影响:
using (var wordDoc = WordprocessingDocument.Open(FileName, true)) { var body = wordDoc.MainDocumentPart.Document.Body; foreach (var text in body.Descendants<Text>()) { if (text.Text.Contains("[CaseNo]")) { text.Text = text.Text.Replace("[CaseNo]", "你的目标数字"); } } wordDoc.Save(); }
注意事项
- 处理修订时要确保覆盖所有类型的修订元素(插入、删除、格式更改等),避免残留问题。
- 操作前建议备份原始文档,防止内容丢失。
内容的提问来源于stack exchange,提问作者Brian Heward
相关产品推荐
相关产品推荐

