C# 实现 Word 文档文本批量替换 (动态填充)

在各类企业级应用中,程序化修改 Word 文档是一个高频需求------批量更新合同模板中的占位符、动态生成个性化的报告与报价单、统一标准化文档中的术语表述等。实现这类需求的核心技术挑战在于:Word 文档采用复杂的内置结构存储文本与格式,简单的字符串操作极易破坏文档的格式完整性,导致输出结果无法满足正式应用的标准。

Free Spire.Doc for .NET 是一套在无需本地安装 Microsoft Office 环境下直接操作 Word 文档的免费 .NET API,其 DocumentParagraph 类提供了 ReplaceFindAllString 等多个文本查找与替换的重载方法,支持普通字符串、正则表达式匹配等场景。以下将从基础用法到高级技巧逐步展开。


环境准备

将 Free Spire.Doc 添加到项目中最便捷的方式是通过 NuGet 包管理器。在 Visual Studio 的"管理 NuGet 程序包"中搜索 FreeSpire.Doc 并安装,或在包管理器控制台中执行以下命令:

复制代码
Install-Package FreeSpire.Doc

安装完成后,在代码文件顶部引入核心命名空间:

复制代码
using Spire.Doc;
using Spire.Doc.Documents;
using System.Text.RegularExpressions;

基础示例:替换 Word 中的指定文本

用到的免费 .NET 库的核心替换方法是 Document.Replace(string matchString, string newValue, bool caseSensitive, bool wholeWord),该方法在整个文档范围内查找指定的字符串并将其替换为新文本。

参数说明

  • matchString:要查找的目标文本
  • newValue:替换后的新文本
  • caseSensitive:是否区分大小写(true 为区分,false 为不区分)
  • wholeWord:是否仅匹配完整单词(true 时仅替换独立的完整单词)

以下示例演示将文档中的旧公司名称替换为新名称:

复制代码
public static void BasicReplace(string inputPath, string outputPath)
{
    // 创建 Document 对象并加载文档
    Document document = new Document();
    document.LoadFromFile(inputPath);
    
    // 执行替换操作:不区分大小写,匹配完整单词
    document.Replace("old_company_name", "NewTech Solutions Inc.", false, true);
    
    // 保存修改后的文档
    document.SaveToFile(outputPath, FileFormat.Docx);
    document.Close();
}

该方法在替换过程中能够保留原文本的格式与排版,确保文档的其他元素(如图片、表格、页眉页脚等)不受影响。

可选:仅替换首次出现的文本

若业务需求仅需将文档中第一次出现的目标文本进行替换,可在调用 Replace 方法之前将 Document.ReplaceFirst 属性设置为 true

复制代码
public static void ReplaceFirstInstance(string inputPath, string outputPath)
{
    Document document = new Document();
    document.LoadFromFile(inputPath);
    
    // 将替换模式设置为仅替换第一个匹配项
    document.ReplaceFirst = true;
    document.Replace("placeholder", "actual value", false, true);
    
    document.SaveToFile(outputPath, FileFormat.Docx);
    document.Close();
}

进阶:使用正则表达式进行模式匹配替换

对于需要匹配某种模式而非固定字符串的场景(例如替换所有占位符 {{...}}、匹配特定格式的编号等),可以使用 Document.Replace(Regex regex, string newValue) 方法的重载版本。

以下示例展示如何将文档中所有由花括号包裹的占位符替换为指定的值:

复制代码
using System.Text.RegularExpressions;

public static void RegexReplace(string inputPath, string outputPath)
{
    Document document = new Document();
    document.LoadFromFile(inputPath);
    
    // 匹配形如 {{placeholder}} 的占位符模式
    Regex placeholderRegex = new Regex(@"\{\{.*?\}\}");
    
    // 将所有匹配的占位符替换为目标字符串
    document.Replace(placeholderRegex, "replacement text");
    
    document.SaveToFile(outputPath, FileFormat.Docx);
    document.Close();
}

更复杂的使用场景中,还可调用 Replace(Regex, TextSelection) 等重载变体进行带格式的替换操作。


扩展:查找文本并做进一步处理(查找高亮)

除了直接替换,Document.FindAllString 方法可以获取所有匹配的 TextSelection 对象集合,便于在替换前对匹配结果进行预览、统计,或在替换后应用格式设置(如高亮显示)。

复制代码
using System.Drawing;

public static void FindAndHighlight(string inputPath, string outputPath)
{
    Document document = new Document();
    document.LoadFromFile(inputPath);
    
    // 查找所有匹配的文本
    TextSelection[] selections = document.FindAllString("keyword", false, true);
    
    foreach (TextSelection selection in selections)
    {
        // 将匹配的文本设置为高亮黄色
        selection.GetAsOneRange().CharacterFormat.HighlightColor = Color.Yellow;
    }
    
    document.SaveToFile(outputPath, FileFormat.Docx);
    document.Close();
}

总结

本文提供了一套较为完整的 Word 文档文本替换示例:从基础的 Replace 字符串替换、仅替换首次出现、正则表达式模式匹配,到 FindAllString 查找并做格式调整,基本覆盖了 .NET 环境下 Word 文档批量处理的常见需求。

在实际项目中,建议根据文档规模和业务复杂度选择合适的替换策略;对于需要格式保留的复杂内容场景,可进一步利用其他重载或自行封装处理。