372010年11月刊软件开发与设计信息与电脑ChinaComputer&Communication引言在日常的生活工作中,常常需要制作大量的信函、请柬、证书等等统一格式的Word文档,这是一项重复而繁琐的工作。通常完成这些工作的方法有两种:一是首先制作一个文档模板,然后通过重复的复制粘贴来手工完成任务,这种方法耗时费力,不适合制作大量的文档;另一种是使用Word提供的一项“邮件合并”的数据管理功能,该功能可以在固定内容的文档中合并一些数据源资料,从而批量生成需要的文档,但是数据源是一些手工制作的数据表或Excel表,记录比较多时容易出错并且工作量较大。本文使用.NET和VSTO技术,开发了一个Word的外接程序(见下图1),该程序可以读取已有数据库中所需要的数据字段,然后通过拖拽的方式把数据源放到自定义格式的Word文档中,完成文档定制后还可以自动的生成批量的Word文档。图1系统运行效果1.主要技术VSTO(VisualStudioToolsforOffice)是Microsoft公司推出的专门用来开发Office应用程序的可视化工具,它集成在VisualStudio.NET中并可以利用.NETFramework的所有特性和能力去定制Office。以下是本文主要使用的.NET和VSTO技术:(1)WordAddIn:是Word的外接插件,开发好的插件程序嵌入到Word当中,可以应用于所有的Word文档。(2)Ribbon:是全新的固定式工具栏界面,它是继下拉式菜单后新的标准用户界面,在Office2007和Windows7中已经开始大规模被使用。在VSTO当中,可以很方便的对Ribbon功能区进行定制。(3)CustomTaskPane:称为任务窗格,是一种附加到Word或Excel上的Windows窗体控件,在VSTO中,可以像开发Windows窗体应用程序一样定制各种各样的窗体和应用程序。(4)读写Word文档:Word文档包括了文档内容和文档格式,VSTO可以用多种方式读取Word文档中的内容和格式,另外.NET也提供了很多编辑和生成Word文档的类。(5)LINQ:称为语言集成查询(LanguageIntegratedQuery),是VisualStudio2008和.NETFramework3.5版中一项创新,它在对象领域和数据领域之间架起了一座桥梁,通过LINQ可以使用一种类似SQL的语法来查询任何形式的数据。2.方案设计2.1设计思路系统任务是要批量生成信函、请柬、证书等等统一格式的Word文档,分析这些文档可以得出任务需要完成以下功能:(1)这些文档包括了两部分:不变部分和变化部分,不变部分是指生成的所有Word文档中具有相同内容和格式的部分;变化部分是指生成的文档中不相同的部分,例如:批量生成信封,寄信人信息是不变部分,而收信人信息是变化部分。不变部分是由用户在Word中自由定制和编写,为了提高效率,变化部分则是来自于相关的数据源,这部分也是任务处理的重点。(2)定制完文档的不变和变化部分后,还要批量的生成所有的Word文档。这部分也涉及两个问题:一个是如何读取定制文档的不变部分和变化部分;二是在批量写Word文档时,如何把变化部分(数据源的数据)和不变部分合并成一个文档。根据上面的分析,制定了以下的方案:开发一个Word的外接插件程序,可以在Word中Ribbon工具栏中打开该程序,程序运行时,在Word工作区的右侧将会出现任务窗格,在上面可以根据用户的需要选择不同的数据库、数据表和数据字段,通过拖拽的方式把数据字段拖到自定义文档的相应位置中,完成定制文档后,就可以点击任务窗格中的批量生成按钮来自动的生成所有的Word文档。2.2系统架构系统设计的架构如图1所示,由以下几部分组成:(1)WordDocument:分为不变部分和变化部分,不变部分可以在OfficeWord里正常定制格式和编写内容,变化部分可以从任务窗格中列出的数据字段中按需要拖过来。(2)WordAddIn:集成了所有的程序控制代码,包括了生成Ribbon工具栏界面、任务窗格等等,它一方面通过LINQ读取后台数据库,另一方面接受用户的拖拽数据字段的动作,昀后还能自动生成基于VSTO自动批量生成WORD文档的设计与实现关巍广东水利电力职业技术学院,广东广州510530摘要:批量制作统一格式的Word文档在教育和商务活动中使用得很广泛,利用.NET和VSTO技术,在用户自定义格式的Word文档中嵌入数据库字段变量,并实现自动批量生成Word文档。关键词:VSTO;.NET;Word;Office;批量中图分类号:TP311文献标识码:A文章编号:1003-9767(2010)11-0037-02382010年11月刊软件开发与设计信息与电脑ChinaComputer&Communication所有的Word文档。(3)Database:是Word文档中变化部分的数据来源,一般是已有系统的数据库,例如:批量生成毕业证,那么毕业证中的学生姓名、系部、专业等变化部分的数据源就可以从教务系统的后台数据库中读取。图2系统结构图3.技术实现3.1定制Ribbon功能区为了使用户很方便的调用到外接插件程序,本系统需要在OfficeWord的工具栏区添加一个Ribbon功能区,功能区内设置了一个调用程序任务窗格的按钮。在VSTO中添加Ribbon功能区有两种办法:一是通过可视化设计器设计,另一种是用XML进行编写,下面的XML是本系统的Ribbon功能区设计代码,其中btCreateDoc是按钮名称,btCreateDoc_Click是按钮所触发的事件。ribbontabstabidMso=TabAddInslabel=外接程序groupid=group1label=CreateOfficeDocbuttonid=btCreateDoconAction=btCreateDoc_Clicklabel=CreateMassWordDoc//group/tab/tabs/ribbon3.2添加任务窗格任务窗格是实现系统功能的主要控件,并负责和用户进行交互,它是由Ribbon功能区的按钮所触发。添加任务窗格有两个步骤:(1)设计用户控件在.NET中,用户控件就是可以查看的类,可以通过用户控件设计器来设计,这种设计类似于窗体设计,以可视化的方式完成用户控件外观和行为的属性的设置。(2)把用户控件添加到任务窗格并在Word中显示出来//定义任务窗格,并把用户控件UserControlCreateMassWord添加到任务窗格CustomTaskPanectp=CustomTaskPanes.Add(newUserControlCreateMassWord(),CreateMassWord);//在Word中显示任务窗格ctp.Visible=true;3.3使用LINQ获取数据源Word文档中变化部分的数据是来源于后台数据库,本系统通过LINQ来读取后台数据库,其中需要获取的数据有:数据库名、数据表名列表、数据字段名列表,其中获取数据字段名列表的代码如下://获取选定的数据表vartable=(fromtinadc.Mapping.GetTables()wheret.TableName==this.cbTable.SelectedItem.ToString()selectt).First();//获取选定数据表的所有字段并添加到列表框里foreach(varcolintable.RowType.DataMembers){this.lbField.Items.Add(col.MappedName);}3.4拖拽实现Word文档中变化部分是通过从任务窗格的字段列表中拖拽过来实现的,为了它能在批量生成Word文档前被程序识别出来,因此需要定义变化部分的数据格式。变化部分的数据格式定义为:数据字段名,实现代码如下://拖拽动作触发以下程序privatevoidlbField_MouseDown(objectsender,MouseEventArgse){//把数据字段名封装了定义格式后生成变化部分this.lbField.DoDragDrop(+this.lbField.Items[this.lbField.SelectedIndex].ToString()+,DragDropEffects.Move);}3.5分析和读写Word文档用户完成Word文档的定制后(包括不变部分和变化部分),系统首先会读取和分析该文档,然后经修改后批量的写成新的文档,新的文档数实际上就是所选择数据表的行数,新的文档中把原文档不变的内容和格式保留下来,而变化的内容以数据字段的实际数据来代替。其中实现的关键代码如下://获取文档中每个段落的内容stringstr=newDocument.Paragraphs[i].Range.Text;foreach(varcolintable.RowType.DataMembers){//分析文档中是否存在着变化的部分if(str.IndexOf(+col.MappedName+)=0){//变化的部分使用对应的字段数据来代替str=str.Replace(+col.MappedName+,dv[col.MappedName].ToString());}}4.结束语自动批量生成Word文档系统的开发,利用了先进的.NET和VSTO技术,把程序嵌入到Word当中,增强了Word的功能,实现了固定格式的文档和变化的数据库有效的合并。实验表明系统可以大大的提高工作效率,适合于制作大批量的信函、证书、单据等等统一格式的Word文档。参考文献:[1]叶明张诤.基于C#.NET的Word报告生成功能开发[J].计算机工程与应用,2008,44(9):104-106.[2]RamaKrishnaVavilala.BuildingaWebMessageBoardusingVisualStudio2008PartII-PostingmessagesusingMicrosoftWord[EB/OL].