在使用 Word 模板时,我们经常需要将特定占位符替换为实际内容,例如姓名、日期,甚至公司 Logo。手动逐一修改不仅耗时,还可能增加重复操作的工作量。通过编写代码,可以自动完成这一过程。本教程将介绍如何使用 C# 正则表达式替换 Word 文档中的文本,包括在整个文档中查找和替换内容、针对特定段落进行替换,以及将匹配的文本替换为图片。
开始之前:安装 Word 处理库
在处理 Word 文档时,可以借助相关的 .NET 文档处理库,实现文件读取、编辑和格式转换等操作。通过调用相应的 API,还可以使用少量 C# 代码完成 Word 文档中的正则表达式查找与替换。
可以通过 NuGet 安装所需的库,使用以下命令:
cs
PM> Install-Package Spire.Doc
使用正则表达式替换整个 Word 文档中的文本
首先来看一种常见的场景:替换整个 Word 文档中的指定文本。可以使用正则表达式匹配 #name、#tel 等占位符,再将它们替换为实际内容,例如姓名或电话号码。
通过调用文档处理库提供的 Document.Replace() 方法,可以简化这一操作。下面将通过分步说明和示例代码,介绍如何使用 C# 正则表达式替换 Word 文档中的文本。
代码示例------使用 C# 将整个 Word 文档中的 #name 替换为 "May":
cs
using Spire.Doc;
using System.Text.RegularExpressions;
namespace FindText
{
class Program
{
static void Main(string[] args)
{
// 创建 Document 类的对象并加载 Word 文档
Document doc = new Document();
doc.LoadFromFile("/input/replace template.docx");
// 设置正则表达式
Regex regex = new Regex(@"#\w+\b");
// 将所有匹配项替换为 "May"
doc.Replace(regex, "May");
// 保存文档
doc.SaveToFile("/output/replacealloccurences.docx", FileFormat.Docx2013);
}
}
}
在 C# 中使用正则表达式替换指定段落中的文本
在整个 Word 文档中替换文本相对简单,但如果只需要修改某个特定段落,该如何实现呢?
当需要更精确地控制替换范围时,例如仅在指定段落中执行正则表达式替换,可以先获取目标段落的文本,再根据需要重新设置其内容。具体来说,可以使用正则表达式查找目标段落中的匹配文本,删除原有内容,并插入替换后的文本。
下面先来看一个实际的代码示例,随后再详细介绍具体步骤。
代码示例------使用正则表达式将第一个段落中的 #name 替换为 "Lily":
cs
using Spire.Doc;
using Spire.Doc.Documents;
using System.Text.RegularExpressions;
class Program
{
static void Main(string[] args)
{
// 创建 Document 对象并加载模板
Document doc = new Document();
doc.LoadFromFile("/input/replace template.docx");
Regex regex = new Regex(@"#\w+\b");
// 获取第一个段落
Paragraph para = doc.Sections[0].Paragraphs[0];
string originalText = para.Text;
if (regex.IsMatch(originalText))
{
string newText = regex.Replace(originalText, "Lily");
// 清除原有内容并添加替换后的文本
para.ChildObjects.Clear();
para.AppendText(newText);
}
// 保存修改后的文档
doc.SaveToFile("/output/replacefirstpara.docx", FileFormat.Docx2013);
}
}
使用 C# 将 Word 中匹配正则表达式的文本替换为图片
了解如何替换整个文档或指定段落中的文本后,接下来看看更进阶的用法------将文本替换为图片。这种方式常用于自动生成报告、公司宣传册等场景。例如,可以将 [logo] 这样的占位符替换为公司的实际 Logo。
结合 C# 正则表达式和图片插入 API,可以自动完成这一操作。下面先看一个实际代码示例,再详细介绍其实现原理。
代码示例------将 [avatar] 替换为图片:
cs
using Spire.Doc;
using Spire.Doc.Documents;
using Spire.Doc.Fields;
using System.Text.RegularExpressions;
namespace RegexReplaceWithImage
{
class Program
{
static void Main(string[] args)
{
// 创建 Document 对象并从磁盘加载 Word 文件
Document document = new Document();
document.LoadFromFile(@"\input\replace template.docx");
// 定义用于匹配占位符的正则表达式
Regex regex = new Regex(@"\[\w+\]", RegexOptions.IgnoreCase);
// 查找文档中所有符合匹配规则的内容
TextSelection[] selections = document.FindAllPattern(regex);
// 遍历每个匹配到的占位符
foreach (TextSelection selection in selections)
{
// 创建图片对象并从磁盘加载图片
DocPicture pic = new DocPicture(document);
pic.LoadImage(@"\avatar-1.png");
// 将匹配到的文本作为单个文本范围获取
TextRange textRange = selection.GetAsOneRange();
// 获取该文本范围在所属段落中的索引
int index = textRange.OwnerParagraph.ChildObjects.IndexOf(textRange);
// 在匹配位置插入图片
textRange.OwnerParagraph.ChildObjects.Insert(index, pic);
// 删除原有的占位符文本
textRange.OwnerParagraph.ChildObjects.Remove(textRange);
}
// 将修改后的文档保存到磁盘
document.SaveToFile(@"\output\ReplaceTextWithImage.docx", FileFormat.Docx2016);
document.Close();
}
}
}
使用 VB.NET 正则表达式替换文本
如果使用的是 VB.NET,也可以通过正则表达式在整个 Word 文档中查找和替换文本。实现思路与 C# 类似:先加载文档,再应用正则表达式匹配规则,最后更新文档内容。下面通过一个简单的示例,帮助你快速上手。
cs
Imports Spire.Doc
Imports System.Text.RegularExpressions
Module Module1
Sub Main()
' 创建 Document 对象
Dim doc As New Document()
doc.LoadFromFile("/input/replace template.docx")
' 设置正则表达式
Dim regex As New Regex("#\w+\b")
' 将匹配的文本替换为 "Lena"
doc.Replace(regex, "Lena")
' 保存文档
doc.SaveToFile("/output/regexreplace.docx", FileFormat.Docx2013)
End Sub
End Module
以上是使用正则表达式替换整个 Word 文档中指定文本的 VB.NET 代码示例。
如果还需要完成其他操作,例如替换特定段落中的文本或将文本替换为图片,也可以使用C#与VB.NET代码转换工具,将 C# 示例代码转换为 VB.NET。
总结
借助正则表达式,可以使用 C# 高效地替换 Word 文档中的文本,甚至将指定内容替换为图片。无论是处理模板、报告还是个性化文档,这种方式都能减少重复操作,提高处理效率。