许多程序员在开发项目中经常会遇到客户想要将多个文件放在一个文档中呈现的问题,如后台服务器上保存了若干word文档和一个word模板文档。(若干word文档目录保存在数据库中)当用代码打开word模板文档后,模板文档中可显示其它若干word文档中的数据和从数据库获得的数据(实现动态填充),下面我就把自己解决这一问题的具体步骤和大家分享一下。

就以政府发布的某一项公文为例吧!在打开的word文档中需要显示公文的文件名、发文人(或单位)、发文号、发文日期、发文内容的标题、发文的内容等信息。

第一步:请先安装PageOffice的服务器端的安装程序,之后在你的网站中根目录下添加pageoffice文件夹(在www.zhuozhengsoft.com网站的“下载中心”中可下载相应的压缩包,解压之后直接将PageOffice实例代码里的pageoffice文件夹拷贝到根目录下就可以了)。

第二步:在网站中添加文件夹存放word模板文件,我习惯命名为“doc”,将要合并的文件拷贝到该文件夹下,我要合并的文件分别为:content.doc(公文的内容模板)、title.doc(公文的文件名、发文人、发文号、发文时间模板)、template.doc(文档合并后要打开的文档模板)。

第三步:在这三个文件中的相应位置手动插入书签(template.doc中:“PO_title”、“PO_content”;title.doc中:“PO_fwh”、“PO_fwr”、“PO_date”;content.doc中:“PO_theme”、“PO_content2”)。注意:书签名字不要重复、相邻书签之间至少要有一个字符,不然,后一个书签会把前一个书签覆盖掉;书签的名字需以“PO_”为前缀。

第四步:在网站中创建动态页面MergeWord.aspx。在工具箱中拖动一个PageOfficeCtrl控件到页面上(PageOfficeCtrl控件位于工具箱最下方)。

第五步:在MergeWord.aspx页面中,为PageOfficeCtrl控件所在的层(<div></div>)设置大小,否则Word文件在线打开后无法正常显示,在MergeWord.aspx.cs中实现公文的相应信息的动态填充,部分代码如下:

OleDbConnectionnewOleDbConnection(connstring);
conn.Open();
 
string"select * from FileInfo where ID=2";
OleDbCommandnewOleDbCommand(sql, conn);
cmd.CommandType = CommandType.Text;
OleDbDataReader Reader = cmd.ExecuteReader();
if (Reader.Read())
{
docFileName = Reader["FileName"].ToString();//文件名
docFwr = Reader["Fwr"].ToString();//发文人
docFwh = Reader["Fwh"].ToString();//发文号
if"CreateTime"] != null&& Reader["CreateTime"].ToString().Length > 0)
{
docDate = DateTime.Parse(Reader["CreateTime"].ToString()).ToString("yyyy-MM-dd");//发文日期
}
docTitle = Reader["Title"].ToString();//内容标题
docContent = Reader["Content"].ToString();//内容
}
Reader.Close();
conn.Close();

第六步:在MergeWord.aspx.cs中,利用PageOfficeCtrl控件实现文档的合并显示,代码如下:

//-----------PageOffice 服务器端编程开始-------------------//
PageOffice.WordWriter.WordDocument doc = new PageOffice.WordWriter.WordDocument();
PageOffice.WordWriter.DataRegion title = doc.OpenDataRegion("PO_title");//打开数据区域PO_title
title.Value = "[word]doc/title.doc[/word]";//该DataRegion对象的值就是要插入的word文档路径,格式为:"[word]文件的路径[/word];若插入的是图片则格式为:“[p_w_picpath]图片路径[/p_w_picpath]”"
//title.Editing = false;//该属性值默认为false,当DataRegion对象的值为插入的文件时,将该区域的可编辑性设置为false
PageOffice.WordWriter.DataRegion content = doc.OpenDataRegion("PO_content");
content.Value = "[word]doc/content.doc[/word]";//要显示的内容文件
 
PageOffice.WordWriter.DataRegion fwh = doc.OpenDataRegion("PO_fwh");
fwh.Value = docFwh;//要显示的发文号
//fwh.Editing = true;//若数据需要修改时,将将该区域的可编辑性设置为true,并将文档的打开方式设置为:PageOffice.OpenModeType.docSubmitForm
PageOffice.WordWriter.DataRegion fwr = doc.OpenDataRegion("PO_fwr");
fwr.Value = docFwr;//要显示的发文人
PageOffice.WordWriter.DataRegion date = doc.OpenDataRegion("PO_date");
date.Value = docDate;//要显示的发文日期
 
PageOffice.WordWriter.DataRegion theme = doc.OpenDataRegion("PO_theme");
theme.Value = docTitle;//要显示的公文内容标题
PageOffice.WordWriter.DataRegion content2 = doc.OpenDataRegion("PO_content2");
content2.Value = docContent;//要显示的公文内容
 
doc.WaterMark.Text = "机密公文";//添加的水印
 
// 设置PageOffice组件服务页面
PageOfficeCtrl1.ServerPage = "pageoffice/server.aspx";
 
// 设置界面样式
//PageOfficeCtrl1.Caption = "公文";//设置文件的Caption属性
//PageOfficeCtrl1.BorderStyle = PageOffice.BorderStyleType.BorderThin;//设置边框样式
// 添加自定义工具条按钮
PageOfficeCtrl1.AddCustomToolButton("保存", "poSave", 1);
PageOfficeCtrl1.AddCustomToolButton("全屏/还原", "poSetFullScreen", 4);
 
// 设置保存文档的服务器页面
PageOfficeCtrl1.SaveFilePage = "SaveData.aspx?";
获取数据对象
PageOfficeCtrl1.SetWriter(doc);
// 打开文档
PageOfficeCtrl1.WebOpen("doc/template.doc", PageOffice.OpenModeType.docNormalEdit, "SomeBody");

运行,查看文件合并的效果。

方案总结:

利用PageOffice组件实现服务器上多个word文件的合并是非常简单、方便、易用的。它不仅能实现多个文件的合并,还能实现数据的动态填充和动态更新数据库信息,大大的节省了程序员的开发时间,提升了开发效率,而且实现的功能更加全面,解决了开发OA系统的程序员的一大技术难题。

另外,PageOffice的这一功能还能用于教育机构,如在系统中设置好模板,然后可将多张word文档中的试题总结到一张试卷上,可大大节约教师的出题和总结题型的时间,具体的实现过程与上例类似,大家可以试一下。

 


转载于:https://blog.51cto.com/6949400/1213617