邮件合并(Mail Merge)是 Microsoft Word 的一项强大功能,它允许您从一个模板文档和数据源生成多份文档,例如信件、标签、信封,甚至电子邮件。当需要向大量收件人发送个性化信件的时候,您可以使用这个功能,就无需逐封撰写。
在本文中,您将学习如何使用 Spire.Doc for .NET 在 Word 文档中执行邮件合并。
安装 Spire.Doc for .NET
首先,您需要将 Spire.Doc for.NET 包含的 DLL 文件作为引用添加到您的 .NET 项目中。DLL 文件可以从此链接下载,也可以通过 NuGet 安装。
PM> Install-Package Spire.Doc
理解邮件合并的组成部分
- 主文档:模板文件,也就是在其中设计信件、标签或其他类型的文档,并且包含占位符(也称为合并域),这些占位符将在邮件合并时由数据源中的数据填充。
- 数据源:它包含您希望用于填充主文档信息的电子表格或数据库。它可以是 Excel 表格、Access 数据库、CSV 文件、XML 文件,甚至是简单的文本文件等。
- 合并域:这些是主文档中的占位符,将被数据源中相应记录的数据替换。
创建模板 Word 文档
想要生成带有合并域的模板 Word 文档,建议使用 Microsoft Word 等 Word 编辑器。Word 编辑器的视觉界面使您能够自由地设计模板的独特布局、格式和其他元素。
下图展示了如何使用 MS Word 向 Word 文档中添加邮件合并域。如果您想将图像合并到合并域中,请记得使用“Image:FieldName”格式。
如果您想要使用 C# 创建一个模板文档,请参照以下步骤:
- 创建一个 Documen 类的对象。
- 添加一个节。
- 在节中添加一个段落。
- 在段落中,使用 Paragraph.AppendField() 方法添加合并域。
- 保存结果文档。
- C#
using Spire.Doc;
using Spire.Doc.Documents;
namespace CreateTemplate
{
class Program
{
static void Main(string[] args)
{
// 创建一个 Document 对象
Document document = new Document();
// 添加一个节
Section section = document.AddSection();
// 添加一个段落
Paragraph paragraph = section.AddParagraph();
// 在段落中添加文本和邮件合并域
paragraph.AppendText("姓名:");
paragraph.AppendField("Name", FieldType.FieldMergeField);
paragraph.AppendBreak(BreakType.LineBreak);
paragraph.AppendText("邮件地址:");
paragraph.AppendField("Email", FieldType.FieldMergeField);
paragraph.AppendBreak(BreakType.LineBreak);
paragraph.AppendText("个人头像:");
paragraph.AppendField("Image:Avatar", FieldType.FieldMergeField);
// 保存结果文档
document.SaveToFile("/模板.docx", FileFormat.Docx2019);
// 释放资源
document.Dispose();
}
}
}
Word 文档中的简单邮件合并
Spire.Doc 提供了 MailMerge.Execute() 方法,用于在 Word 文档中执行指定的邮件合并操作。该方法有 6 个重载版本,允许用户从不同的数据源(如 DataTable、DataView 和字符串数组)执行邮件合并。
使用数组提供的数据执行邮件合并的步骤如下:
- 创建一个 Document 类的对象。
- 从指定的文件路径加载模板 Word 文档。
- 定义一个数组来占用合并域名称。
- 定义一个数组来保存用于填充合并域的值。
- 使用 MailMerge.Execute() 方法将数据合并到邮件合并域中。
- 将文档保存为新的 Word 文件。
- C#
using Spire.Doc;
using Spire.Doc.Reporting;
using System.Drawing;
namespace MailMergeInDocument
{
class Program
{
static void Main(string[] args)
{
// 创建一个 Document 对象
Document document = new Document();
// 加载 Word 模板
document.LoadFromFile("/模板.docx");
// 指定合并域的名称
string[] fieldNames = {
"Name",
"Email",
"Avatar"
};
// 指定用来填充合并域的值
string[] fieldValues = {
"谢雨",
"xieyu @e-iceblue.com",
"C:/Users/Administrator/Desktop/avatar.png"
};
// 注册合并图片合并域时触发的事件
document.MailMerge.MergeImageField += new MergeImageFieldEventHandler(MailMerge_MergeImageField);
// 将数据邮件合并到文档中
document.MailMerge.Execute(fieldNames, fieldValues);
// 保存结果文档
document.SaveToFile("/邮件合并.docx", FileFormat.Docx2019);
// 释放资源
document.Dispose();
}
// 使用图片填充图像合并域
private static void MailMerge_MergeImageField(object sender, MergeImageFieldEventArgs field)
{
string filePath = field.FieldValue as string;
if (!string.IsNullOrEmpty(filePath))
{
field.Image = Image.FromFile(filePath);
}
}
}
}
使用区域执行邮件合并
这里的区域指的是文档中的特定区域,您可以在区域插入数据源中的数据。邮件合并会针对数据源中的每条记录重复该区域。Spire.Doc 提供了 MailMerge.ExecuteWithRegion() 方法来执行区域内的邮件合并。
使用 DataTable 提供的数据执行带区域的邮件合并的步骤如下:
- 创建一个 Document 对象。
- 从指定的文件路径加载模板 Word 文档。
- 创建一个 DataTable 对象,作为数据源。
- 使用 MailMerge.ExecuteWithRegion() 方法执行带区域的邮件合并。
- 将合并后的文档保存为另一个 Word 文件。
- C#
using Spire.Doc;
using System.Data;
namespace MailMergeWithGroup
{
class Program
{
static void Main(string[] args)
{
// 创建一个 Document 对象
Document document = new Document();
// 加载模板 Word 文件
document.LoadFromFile("/邮件模板.docx");
// 创建一个 数据表,并指定表名
DataTable table = new DataTable("OrderDetails");
// 添加示例数据
table.Columns.Add("ProductName");
table.Columns.Add("Quantity");
table.Columns.Add("UnitPrice");
table.Columns.Add("TotalPrice");
table.Rows.Add("无线鼠标", "2", "39.99", "79.98");
table.Rows.Add("机械键盘", "1", "89.99", "89.99");
table.Rows.Add("电竞耳机", "3", "59.99", "179.97");
table.Rows.Add("显示器支架", "1", "49.99", "49.99");
// 在区域内执行邮件合并
document.MailMerge.ExecuteWidthRegion(table);
// 保存修改后的文档
document.SaveToFile("/区域邮件合并.docx", FileFormat.Docx2019);
// 释放资源
document.Dispose();
}
}
}
使用嵌套区域执行邮件合并
在执行嵌套分组的邮件合并时,系统会将嵌套区域内的合并域替换为按照层次结构组织的数据。嵌套区域可以创建更复杂的布局,其中一个区域的内容将依赖于另一个区域中的数据。
使用 XML 文件中的数据执行嵌套区域邮件合并的步骤如下:
- 创建一个 Document 对象。
- 从指定的文件路径加载模板 Word 文档。
- 读取 XML 文件中的数据到 DataSet 对象。
- 创建一个 List<DictionaryEntry> 对象来存储合并域信息。
- 创建 DictionaryEntry 对象并将其添加到列表中,指定合并域名称及其关联的表达式。
- 使用 MailMerge.ExecuteWithNestedRegion() 方法执行嵌套区域的邮件合并。
- 将合并后的文档保存为另一个 Word 文件。
- C#
using Spire.Doc;
using System.Collections;
using System.Data;
namespace MailMergeWithNestedRegions
{
class Program
{
static void Main(string[] args)
{
// 创建一个 Document 对象
Document document = new Document();
// 加载 Word 模板文档
document.LoadFromFile("/模板.docx");
// 从 XML 文件读取数据到 DataSet 对象
DataSet dataSet = new DataSet();
dataSet.ReadXml("/Orders.xml");
// 创建一个 List 对象,用以存储合并域信息
List list = new List();
// 创建两个 DictionaryEntry 对象,并将它们添加到列表中(每个对象指定合并域名称和相关的表达式)
DictionaryEntry dictionaryEntry = new DictionaryEntry("Customer", string.Empty);
list.Add(dictionaryEntry);
dictionaryEntry = new DictionaryEntry("Order", "Customer_Id = %Customer.Customer_Id%");
list.Add(dictionaryEntry);
// 执行嵌套区域的邮件合并
document.MailMerge.ExecuteWidthNestedRegion(dataSet, list);
// 保存结果文件
document.SaveToFile("嵌套区域的邮件合并.docx", FileFormat.Docx2019);
// 释放资源
document.Dispose();
}
}
}
申请临时 License
如果您希望删除结果文档中的评估消息,或者摆脱功能限制,请该Email地址已收到反垃圾邮件插件保护。要显示它您需要在浏览器中启用JavaScript。获取有效期 30 天的临时许可证。