C# 实现多种Word邮件合并功能

在处理Word文档的工作中经常会遇见这样一种情况:文件的主要内容和格式大体相同,只是需要填充的数据不同。如果一个一个填写数据的话会非常麻烦,而且很耗时间。这时候我们就可以灵活运用Word邮件合并功能来快速实现这一操作。

这里我将介绍如何使用C#和Word组件Spire.Doc实现一些常用的Word文档邮件合并功能。

Spire.Doc组件概述

Spire.Doc是一款专门对 Word 文档进行操作的 .NET类库,用于在.NET应用程序中创建、编辑、打印和转换Word文档,并且无需安装Microsoft Word。它支持几乎所有的 Word 文档元素,主要包括页面、节、页眉、页脚、脚注、尾注、段落、项目符号和编号、表格、文本、域、超链接、书签、注释、图片、样式、背景设置、打印功能、文档设置和文档保护。同时,也支持形状、文本框、图片、OLE 对象和内容控件。

它的安装比较简单,可以从官网或Nuget直接下载组件的dll文件。在VisualStudio的NuGet Package Manager Console中输入以下PowerShell命令回车,组件的dll就会自动地引用到项目中:

PM>Install-Package Spire.Doc


1. 创建邮件合并模板文档

1.1. Microsoft Word创建邮件合并模板文档

我们知道,执行邮件合并前需要先根据需求创建带有合并域的模板文档。下图展示了如何在Microsoft Word中插入合并域(MergeField)到Word文档。

1.2. Spire.Doc创建邮件合并模板文档

在Spire.Doc中,我们可以通过Paragraph对象调用AppendField (string fieldName, FieldTypefieldType) 方法插入合并域到Word文档。

//创建Word文档
Document document = new Document();
//添加节
Section section = document.AddSection();
//添加段落
Paragraph paragraph = section.AddParagraph();//添加文本
paragraph.AppendText("编号:");
//添加合并域“Emp_Id”
paragraph.AppendField("Emp_Id",FieldType.FieldMergeField);//添加文本
paragraph.AppendText("\n姓名:");
//添加合并域“Name”
paragraph.AppendField("Name",FieldType.FieldMergeField);//添加文本
paragraph.AppendText("\n电话:");
//添加合并域“Phone”
paragraph.AppendField("Phone",FieldType.FieldMergeField);//添加文本
paragraph.AppendText("\n部门:");
//添加合并域“Department”
paragraph.AppendField("Department",FieldType.FieldMergeField);//保存文档
document.SaveToFile("模板.docx",FileFormat.Docx2013);
document.Close();

注:此处如果不想使用\n换行,可在每次插入域之后再插入换行符:

paragraph.AppendBreak(BreakType.LineBreak);

2. 执行邮件合并

2.1. 简单邮件合并

MailMerge类中提供了执行邮件合并的方法Execute (),它共有7种重载方法:

从上图可以看出,选择不同的重载方法,可以从不同的数据源如Datatable,Dataview,DataReader和数组等合并数据。

下面我使用刚刚创建的模板文档,并以一对数组作为Execute ()方法的参数。其中第一个数组表示域的名称,第二个数组表示域的值。名称和值的数量需要一致。

//加载模板文档
Document document = new Document("模板.docx");string[] fieldNames = new string[] { "Emp_Id","Name", "Phone","Department" };string[] fieldValues = new string[] { "0065","李强", "+86151XXXX1101", "开发部" };//执行邮件合并(也就是添加数据)
document.MailMerge.Execute(fieldNames, fieldValues);//保存文档
document.SaveToFile("MergeText.docx", FileFormat.Docx2013);
document.Close();

2.2. 带图片邮件合并

除简单的文字合并以外,MailMerge类还支持通过MergeImageField事件来添加图片到合并域。

Document doc = new Document();
doc.LoadFromFile("图片.docx");
var fieldNames = new string[] { "Photo "};
var fieldValues = new string[] { "Photo.jpg"};doc.MailMerge.MergeImageField += new MergeImageFieldEventHandler(MailMerge_MergeImageField);doc.MailMerge.Execute(fieldNames, fieldValues);doc.SaveToFile("MergeImage.docx",FileFormat.Docx);static void MailMerge_MergeImageField(object sender, MergeImageFieldEventArgsfield)
{string filePath =field.FieldValue as string;if (!string.IsNullOrEmpty(filePath)){field.Image= Image.FromFile(filePath);}
}

2.3. 区域邮件合并

区域邮件合并顾名思义就是在Word文档的指定区域添加数据。需要注意的是区域邮件合并需要模板文档中含有指定区域的标识符,这种标识符应该由一对组成(包括区域开始标识和区域结束标识),且通常有两种类型:«GroupStart:XXX» 和 «GroupEnd:XXX»,以及«TableStart:XXX»和«TableEnd:XXX»。其中XXX表示区域的名称。如下图所示:

我首先创建了一个类"Product",在这个类中创建了构造函数 Product (int number, string type, stringname, string price, string vendor) 并添加了一些属性 "Number", "Type","Name", "Price" 和"Vendor"。

Product p1 = new Product(1, "Software","A", "799","Company A");
Product p2 = new Product(2, "Software","B", "599","Company B");List<Product>list = new List<Product>();
list.Add(p1);
list.Add(p2);//加载模板
Document document = new Document("产品清单.docx");MailMergeDataTable table = new MailMergeDataTable("Products", list); //注意此处所使用的区域名称必须和模板文档中的区域名称一致//执行区域邮件合并
document.MailMerge.ExecuteGroup(table);//保存文档
document.SaveToFile("MergeWithinRegion.docx");

从生成结果可以看出区域邮件合并会为数据源中的每条数据创建一条单独的记录,换句话说区域合并可以在Word文档的指定区域重复添加多条相同类型的数据。

2.4. 邮件合并时生成多个文档

我们还可以为每条数据创建一个单独的文档,只需要在每条数据执行合并前复制一次模板文档,然后在副本中进行数据合并,并将结果保存为一个单独的文档。也可以加载文档,但复制文档速度更快。

DataTable datatable = new DataTable();
datatable.Columns.Add("TeamName", typeof(string));
datatable.Columns.Add("TotalPoint",typeof(int));
datatable.Columns.Add("Ranking",typeof(int));
datatable.Columns.Add("Prize",typeof(string));DataRow dr1 = datatable.NewRow();
dr1["TeamName"]= "A";
dr1["TotalPoint"]= "20";
dr1["Ranking"]= "1";
dr1["Prize"]= "$1000";datatable.Rows.Add(dr1);DataRow dr2 = datatable.NewRow();
dr2["TeamName"]= "B";
dr2["TotalPoint"]= "15";
dr2["Ranking"]= "2";
dr2["Prize"]= "$500";datatable.Rows.Add(dr2);int i = 0;
Document document = new Document();
document.LoadFromFile("团队排名.docx");foreach (DataRow row in datatable.Rows)
{DocumentdestDocument = document.Clone();destDocument.MailMerge.Execute(row);destDocument.SaveToFile(string.Format("FileOut{0}.doc",i++));
}

2.5. 嵌套邮件合并

嵌套邮件合并是在两个或多个嵌套的区域中添加数据。在下面的模板中包含了两个嵌套区域(Group和Table):

接下来我将从下面的xml文档中读取数据并填充到以上模板中。

List<DictionaryEntry>list = new List<DictionaryEntry>();
DataSet dsData = new DataSet();
//读取xml文件
dsData.ReadXml(@"Orders.xml");
//加载模板文档
Document document = new Document();
document.LoadFromFile(@"报价单.docx");DictionaryEntry dictionaryEntry = new DictionaryEntry("Quote", string.Empty);
list.Add(dictionaryEntry);
dictionaryEntry = newDictionaryEntry("Supply","Quote_Id = %Quote.Quote_Id%");
list.Add(dictionaryEntry);//由于我的xml文件中有多条记录,因此插入分页符以便查看
document.MailMerge.MergeGroup +=MailMerge_MergeGroup;//执行嵌套合并
document.MailMerge.ExecuteWidthNestedRegion(dsData,list);//保存文档
document.SaveToFile("NestedMailMerge.docx",FileFormat.Docx2013);static voidMailMerge_MergeGroup(object sender, MergeGroupEventArgs args)
{if(args.EventType == GroupEventType.GroupStart){if(args.RowIndex > 0){MergeField mergeField =args.MergeField as MergeField;Paragraph ownerPara =mergeField.OwnerParagraph;ownerPara.AppendBreak(BreakType.PageBreak);}}
} 

总结

以上就是博主所总结的Spire.Doc所支持的一些Word邮件合并功能,如有任何疑问,欢迎给博主留言!。

C# 实现多种Word邮件合并功能相关推荐

  1. Word邮件合并功能详解:合并后生成多个word文档,删除空白页

    Word邮件合并功能详解:合并后生成多个word文档,删除空白页 最近在实习,干了很多打杂得工作,所以office软件用的很多很多,瞬间觉得自己可以去裸考计算机二级了哈哈哈哈哈哈.今天因为工作用到了邮 ...

  2. word邮件合并功能的用法

    为您找到了一些邮件合并的实例: 一个实例是使用邮件合并来制作和发送电子邮件邀请函.您需要准备一个Excel表格,存储收件人的姓名和邮箱地址等信息,然后在Word中创建一个邀请函模板,插入合并域,连接数 ...

  3. Word 邮件合并功能(Excel表中指定列数据插入到Word模板指定位置,批量生成Word)

    [邮件]选项卡[开始邮件合并]下拉按钮,选择[邮件合并分布向导] 在"邮件合并"任务窗格中的"选择文档类型"中选择"信函",单击" ...

  4. Aspose-words结合Freemarker实现word邮件合并功能,批量处理word模板文件

    最近的工作中有一个需求,需要处理word文档,有一些内容需要根据不同用户进行替换修改,使用的是word文档,替换后的内容还需要转换为pdf进行签章确认,并进行防篡改处理. 所以记录一下处理步骤,首先可 ...

  5. WORD中“邮件合并”功能和应用

    应用 Word邮件合并功能在制作信函.信封或者是准考证.成绩通知单.毕业证.工资条.问卷等方面有着丰富的应用. 应用领域:批量打印信封,信件,请柬,工资条,个人简历,成绩单,获奖证书,明信片等等,由电 ...

  6. word删除分节符后之前的格式乱了_办公室高级技能之Word邮件合并拆分

    当我们需要批量生成名片,合同,成绩单等有相同内容的文件时,使用word邮件合并功能非常方便.如果你还需要把word文件发给不同的人就需要再拆分一下,用复制粘贴的方法拆分word,数量一多不仅效率低,还 ...

  7. java实现word邮件合并,Aspose.Words控件操作实例—邮件合并功能概述

    本文中会介绍Aspose.Words的邮件合并的功能,邮件合并是时常需要使用的功能,比如在学校教务系统中,需要将学生证数据信息导出成Word文文件,如果以系统已写好的格式输出,会缺乏灵活性,但若使用A ...

  8. 利用Word的邮件合并功能,自动发送工资表邮件(亲自实践)

    Excel中的工资条,希望能够把每个人的信息,发送给个人. 如果手工来发送的话,工作量太大 其实可以用Word的"邮件合并"功能,直接读取Excel,然后通过outlook来实现自 ...

  9. 实现一张A4纸上能够打印6个学员证,利用excel数据源和word(wps)的邮件合并功能实现批量打印

    实现一张A4纸上能够打印6个学员证,利用excel数据源和word(wps)的邮件合并功能实现批量打印 1.首先我们要准备好数据源,以本文为了,excel表中保存了学员信息. 2.打开word(wps ...

最新文章

  1. Python设计模式-策略模式
  2. php开发 linux作用是什么,linux有什么用?
  3. Spring Boot WebFlux-02——WebFlux Web CRUD 实践
  4. UITableView的动态获取高度 排版
  5. php拍视频上传,php视频拍照上传头像功能实现代码分享
  6. 第一个 PyQt5程序
  7. C语言斐波那契数列(附完整源码)
  8. Java 动态代理与class字节码动态修改技术
  9. Vue中render: h = h(App)的含义
  10. PyCharm点击设置没反应,无法进行设置
  11. 51nod 1836:战忽局的手段
  12. IGNITE TROUBLESHOOT
  13. python函数拟合求导_python – 使用scipy curve_fit通过两个数据点拟合指数函数
  14. j连接oracle数据库,JFinal连接Oracle数据库实战
  15. [转载] Python字符串函数
  16. python移动文件_python 复制/移动文件
  17. lnmp一键安装远程连接mysql_阿里云 lnmp一键安装包远程访问Mysql
  18. 推荐比较好的广告联盟之BloggerAds-部落格行销,来自台湾的CPM博客赚钱联盟
  19. 腾达ac1200开虚拟服务器,腾达F1200 11AC双频无线路由器的上网设置教程
  20. 201809-3-元素选择器

热门文章

  1. 深度解读USB4® 2.0版规范--如何实现80Gbps数据传输?
  2. 北京房租大涨?Python 6个维度,数万条数据帮你揭秘
  3. 形象快速理解贝叶斯定理
  4. 如何提高测试质量(技术)
  5. Vue.js 简介与入门指南
  6. SpringBoot 集成ES集群CRUD及分页解决方案
  7. 为何公众号推送会延迟发送_关于公众号推送延迟更新的说明
  8. postgre连接符
  9. 【nextcloud】群晖 Web Station 搭建的 Nextcloud 出现文件锁(文件无法删除或修改)问题的解决
  10. This is Water