C# 实战:快速查找并高亮 Word 文档中的文字(普通查找 + 正则表达式)

4 阅读5分钟

在日常办公自动化、文档审核或数据提取场景中,我们经常需要在大量的 Word 文档中定位特定的关键词或符合某种模式的文本,并将其高亮显示以便快速查阅。虽然 Microsoft Office Interop 可以实现这一功能,但它依赖本地安装的 Office 环境,且在服务器端运行时常遇到稳定性和权限问题。

事实上,在 C# 中,除了依赖本地 Office 的 Interop 方案外,还可以使用 Free Spire.Doc for .NET 这类免费独立组件来实现文本的查找与高亮功能。这种方式无需在运行环境中安装 Microsoft Word,适合服务器端或自动化场景。本文将通过两个具体示例,分别演示如何利用该库进行普通字符串查找正则表达式模式匹配的高亮实现。

环境准备

首先,你需要在项目中引入 Free Spire.Doc 库。你可以通过 NuGet 包管理器安装:

Install-Package FreeSpire.Doc

或者从官方网站下载库文件,并手动添加引用。

示例一:查找特定字符串并高亮

假设我们有一份关于文学理论的 Word 文档 (​​输入.docx​​),我们需要找到其中所有的“超验主义”一词,并将它们标记为黄色高亮。

核心代码逻辑

  1. 加载 Word 文档。
  2. 使用 ​​FindAllString​​ 方法查找所有匹配项。
  3. 遍历结果,将每个匹配项的 ​​HighlightColor​​ 设置为黄色。
  4. 保存新文档。

完整代码

using System;
using System.Drawing;
using Spire.Doc;
using Spire.Doc.Documents;

namespace FindHighlightSimple
{
    class Program
    {
        static void Main(string[] args)
        {
            // 1. 创建 Document 实例
            Document document = new Document();

            // 2. 加载示例 Word 文档
            // 请确保当前目录下存在 输入.docx 文件
            document.LoadFromFile("输入.docx");

            Console.WriteLine("正在查找文本 '超验主义' ...");

            // 3. 查找所有匹配的文本
            // 参数说明:
            // "超验主义": 要查找的字符串
            // false: 不区分大小写 (若为 true 则区分)
            // true: 全字匹配 (若为 true 则只匹配完整单词,避免匹配到包含该词的其他词)
            TextSelection[] textSelections = document.FindAllString("超验主义", false, true);

            Console.WriteLine($"共找到 {textSelections.Length} 处匹配项。");

            // 4. 遍历所有匹配项并设置高亮颜色
            foreach (TextSelection selection in textSelections)
            {
                // GetAsOneRange() 将选区转换为一个文本范围对象
                // CharacterFormat 允许我们修改字体、颜色、高亮等属性
                selection.GetAsOneRange().CharacterFormat.HighlightColor = Color.Yellow;
            }

            // 5. 保存结果文件
            string outputPath = "高亮结果.docx";
            document.SaveToFile(outputPath, FileFormat.Docx);

            Console.WriteLine($"处理完成!结果已保存至:{outputPath}");
            
            // 可选:自动打开生成的文件
            // System.Diagnostics.Process.Start(outputPath);
        }
    }
}

代码解析

  • ​FindAllString​​​: 这是 Spire.Doc 提供的最直接的查找方法。它返回一个 ​​TextSelection​​ 数组,每个元素代表文档中找到的一处匹配内容。
  • ​selection.GetAsOneRange() ​​: 查找到的内容可能跨越多个段落或格式块,此方法将其视为一个连续的文本范围,方便统一设置格式。
  • ​CharacterFormat.HighlightColor​​​: 直接调用 .NET 的 ​​System.Drawing.Color​​ 枚举来设置高亮色,支持 ​​Color.Red​​, ​​Color.Green​​等 Word 中的标准高亮颜色。

示例二:使用正则表达式查找并高亮复杂模式

在实际应用中,我们要查找的往往不是固定的字符串,而是符合某种规则的文本。例如,文档中包含许多类似 ​​[Name]​​, ​​[Date]​​, ​​[ID_123]​​ 这样的占位符,我们需要将它们全部找出来并高亮,以便后续替换或检查。

这时,正则表达式(Regex)就派上用场了。Free Spire.Doc 支持通过 ​​FindAllPattern​​ 方法进行正则匹配。

场景描述

我们需要查找文档中所有格式为 ​​[单词]​​ 的占位符(例如 ​​[Username]​​, ​​[Address]​​),并将它们高亮显示为绿色。

核心代码逻辑

  1. 定义正则表达式 ​​@[\w+]​​ 来匹配方括号内的单词。
  2. 使用 ​​FindAllPattern​​ 方法执行查找。
  3. 遍历结果,设置高亮颜色为绿色。

完整代码

using System;
using System.Drawing;
using System.Text.RegularExpressions;
using Spire.Doc;
using Spire.Doc.Documents;

namespace FindHighlightRegex
{
    class Program
    {
        static void Main(string[] args)
        {
            // 1. 创建 Document 实例
            Document document = new Document();

            // 2. 加载包含占位符的 Word 文档
            document.LoadFromFile("模板.docx");

            Console.WriteLine("正在使用正则表达式查找占位符...");

            // 3. 定义正则表达式
            // 解释:
            // [  : 匹配左方括号 '[' (需要转义)
            // \w+ : 匹配一个或多个字母、数字或下划线
            // ]  : 匹配右方括号 ']' (需要转义)
            Regex regex = new Regex(@"[\w+]", RegexOptions.IgnoreCase);

            // 4. 查找所有符合正则模式的文本
            TextSelection[] selections = document.FindAllPattern(regex);

            Console.WriteLine($"共找到 {selections.Length} 个占位符。");

            // 5. 遍历并高亮
            foreach (TextSelection selection in selections)
            {
                // 获取匹配到的具体文本内容,可用于日志记录或进一步处理
                string matchedText = selection.GetAsOneRange().Text;
                Console.WriteLine($"  - 发现占位符: {matchedText}");

                // 设置高亮颜色为浅绿色
                selection.GetAsOneRange().CharacterFormat.HighlightColor = Color.LightGreen;
                
                // 进阶:同时也可以修改字体加粗,使其更明显
                selection.GetAsOneRange().CharacterFormat.Bold = true;
            }

            // 6. 保存结果
            string outputPath = "正则高亮.docx";
            document.SaveToFile(outputPath, FileFormat.Docx);

            Console.WriteLine($"\n处理完成!结果已保存至:{outputPath}");
        }
    }
}

正则表达式详解

​@"[\w+]"​​:

  • ​@​​ 符号表示逐字字符串,避免反斜杠转义问题。

  • ​[​​ 和 ​​]​​ 分别匹配字符 ​​[​​ 和 ​​]​​。因为在正则中方括号有特殊含义,所以需要转义。

  • ​\w+​​ 匹配中间的“单词”内容。

  • ​RegexOptions.IgnoreCase​​: 忽略大小写,这样 ​​[NAME]​​ 和 ​​[name]​​ 都能被匹配到。

扩展思路

你可以轻松修改正则表达式以适应更多场景:

  • 查找日期格式:​​@\d{4}-\d{2}-\d{2}​​ (匹配 2023-10-01)
  • 查找邮箱地址:​​@\w+@\w+.\w+​
  • 查找特定前缀的变量:​​@$[A-Za-z]+​​ (匹配 $Variable)

常见问题与注意事项

1. 命名空间引用

确保你的文件头部包含了必要的引用:

using Spire.Doc;
using Spire.Doc.Documents;
using System.Drawing; // 用于颜色
using System.Text.RegularExpressions; // 用于正则

2. 性能考量

对于几百页的大型文档,​​FindAllString​​ 和 ​​FindAllPattern​​ 的性能表现依然优秀。但如果在循环中进行大量其他复杂操作,建议先测试内存占用。

总结

通过本文的两个示例,我们展示了如何利用 C# 和 Spire.Doc 库高效地处理 Word 文档中的文本高亮需求:

  1. 简单查找:使用 ​​FindAllString​​ 快速定位固定关键词,适用于拼写检查、术语标记等场景。
  2. 正则查找:使用 ​​FindAllPattern​​ 配合正则表达式,灵活应对占位符、日期、邮箱等复杂模式的批量处理。

这种方法完全摆脱了对 Microsoft Office 软件的依赖,代码简洁,运行稳定,非常适合集成到 ASP.NET 后台服务、Windows 桌面应用或自动化脚本中。

希望这篇教程能为你的开发工作带来便利!如果你有更多关于 Word 自动化处理的问题,欢迎在评论区留言交流。

参考资料

(本文完)