如何使用OpenXML清除docx模板的文本背景色(高亮)
清除Word文档文本背景色的Open XML实现
基于你现有的Open XML SDK代码,提供两种落地方案:
方案一:仅清除原标签位置的背景色
如果只想处理曾经是替换标签的文本区域,可在替换完成后遍历文档,定位原标签对应的文本块并清除背景色:
完整代码示例
// 引用必要命名空间 using DocumentFormat.OpenXml; using DocumentFormat.OpenXml.Packaging; using DocumentFormat.OpenXml.Wordprocessing; using System.IO; using System.Globalization; // 原有文本替换逻辑 var filename = Path.Combine(Properties.Settings.Default.DocPath, file); using (MemoryStream ms = new MemoryStream()) { var bytes = File.ReadAllBytes(filename); ms.Write(bytes, 0, bytes.Length); using (WordprocessingDocument pDoc = WordprocessingDocument.Open(ms, true)) { TextInfo textInfo = CultureInfo.CurrentCulture.TextInfo; TextReplacer.SearchAndReplace(pDoc, "<<FULL_NAME>>", textInfo.ToTitleCase(FULL_NAME), true); TextReplacer.SearchAndReplace(pDoc, "<<FIRST>>", FIRST, true); TextReplacer.SearchAndReplace(pDoc, "<<MIDDLE>>", MIDDLE, true); TextReplacer.SearchAndReplace(pDoc, "<<LAST>>", LAST, true); TextReplacer.SearchAndReplace(pDoc, "<<CITY>>", textInfo.ToTitleCase(info.City), true); TextReplacer.SearchAndReplace(pDoc, "<<ZIP>>", textInfo.ToTitleCase(info.Zip), true); TextReplacer.SearchAndReplace(pDoc, "<<COUNTY>>", textInfo.ToTitleCase(info.County), true); TextReplacer.SearchAndReplace(pDoc, "<<STATE>>", textInfo.ToTitleCase(info.State), true); // 清除原标签位置的背景色 var body = pDoc.MainDocumentPart.Document.Body; var targetTags = new List<string> { "<<FULL_NAME>>", "<<FIRST>>", "<<MIDDLE>>", "<<LAST>>", "<<CITY>>", "<<ZIP>>", "<<COUNTY>>", "<<STATE>>" }; foreach (var run in body.Descendants<Run>()) { var runText = run.InnerText; if (targetTags.Any(tag => runText.Contains(tag))) { SetRunBackgroundColor(run); } } } // 将修改后的内容写回原文件 File.WriteAllBytes(filename, ms.ToArray()); } // 辅助方法:设置文本块背景色为白色 private static void SetRunBackgroundColor(Run run, string colorHex = "FFFFFF") { var runProps = run.RunProperties ?? new RunProperties(); // 移除已有的背景色配置 var existingShading = runProps.Elements<Shading>().FirstOrDefault(); if (existingShading != null) existingShading.Remove(); // 添加白色背景(Clear模式+白色填充) runProps.Append(new Shading { Val = ShadingPatternValues.Clear, Color = "auto", Fill = colorHex }); run.RunProperties = runProps; }
方案二:全局清除所有文本背景色
如果需要把文档中所有带背景色的文本统一改成白色,直接遍历所有文本块(Run)即可:
代码片段(替换方案一的清除逻辑)
// 在WordprocessingDocument代码块内替换方案一的清除逻辑 var body = pDoc.MainDocumentPart.Document.Body; foreach (var run in body.Descendants<Run>()) { SetRunBackgroundColor(run); }
注意事项
- 确保已安装
DocumentFormat.OpenXmlNuGet包(版本2.0及以上) - 内存流修改完成后必须写回原文件,否则修改不会生效
- 若替换后原标签已被完全替换,方案一将无法匹配,此时建议使用方案二
内容的提问来源于stack exchange,提问作者Kevbo
相关产品推荐
相关产品推荐

