1、功能介绍
PageOffice的一键套红功能是用来实现在线编辑时能方便、快捷、简单地对Word文档进行套红操作。
在线编辑Word文档时,有时需要对Word文档进行套红设置,如有些政府文件、公司内部颁发的文件等等,使用红头模板对文档正文套红时,并不是简单的把文档正文插入模板中标记的正文位置就算完成了,模板中往往还有很多的位置需要填写具体的数据,比如:发文号、发文单位、主题词、打印份数等等。一般来说,这些数据已经在起草文件时,在页面表单中填写过一次,如果套红之后还需要用户在Word文件中重新填写,一是增加了用户的工作量,二是可能出现两次填写数据不一致的错误。若是这些文件使用的非常频繁,而每次都要通过手动的一个个添加套红并设置格式,这将非常的繁琐和麻烦。
而通过PageOffice的一键套红功能,则使得对Word文件进行的套红的操作将变得非常简单而容易。
PageOffice的一键套红功能需先将用到的套红样式结合书签使用做成Word模版。也就是在Word模版中先设置好套红样式,然后在需要通过程序填充数据的位置(如发文号、发文单位、发文时间等等)插入书签。
一般的开发人员使用Word比较少,可能不清楚Word书签是怎样插入的,下面简单的介绍一下插入书签的方法。
第一种方法:把光标定位到需要标记数据位置的地方,点Word菜单中的“插入”-“书签”,就会弹出一个标题为“书签”的对话框(如下图所示),输入新书签的名称,注意:书签名必须以字母、汉字、中文标点等开头,可以包含数字但中间不能有空格(用PageOffice开发的时候不推荐使用中文命名书签名)。点右侧的“添加”按钮,新的书签名将出现在下面的列表中。
第二种方法:选择几个文字、或一段文字、或者选择一段包含表格和图片的内容,为选中的内容指定书签的对象,然后执行第一种方法的同样操作,“插入”→“书签”……
注意:如果新插入位置或新对象采用的是已有的书签名,原有的书签将自动取消。
PageOffice示例代码中的模板在制作的时候,多采用第二中方法定义书签,插入书签之前会先写一个标示性的词语用中括号括起来,比如:[姓名],然后选中“[姓名]”,再插入书签。这样做的目的是便于在查看或编辑模板数据位置的时候一目了然。
在使用PageOffice开发的过程中,为了避免出现与用户自己定义的书签出现冲突,要求插入的书签名称必须以“PO_”开头。注意是字母o,不是数字0。
在PageOffice的概念里提到的数据区域,本质上就是书签,但是只有“PO_”(或者小写的“po_”)开头的书签才叫数据区域,请大家注意这点。
编辑好Word模版后,可先通过PageOffice控件类实现在线加载显示正文的Word文档,然后选择要添加的套红模版,之后结合数据区域(DataRegion),通过程序将正文内容、发文号、发文单位、发文时间等等赋值到数据区域中,就可在线显示添加套红后的Word文档了。
什么是数据区域?数据区域是Word文档中具有 "PO_" 前缀命名的书签所定位的文档区域。简单来说,数据区域就是一种特殊的Word书签对象,便于定位Word文档中的内容。数据区域是PageOffice开发平台中重要的技术概念。
这里举个简单的例子说明什么是数据区域:假设开发者需要在待打开的Word文档指定位置处显示产品名称,就可以先手动打开此Word文档,在指定位置处插入书签"PO_ProductName",保存文档。这样数据区域"ProductName"就定义好了。编写代码 doc.OpenDataRegion("ProductName").Value ="PageOffice"; 即可在此数据区域处生成想要的内容。
数据区域的填充及数据区域格式的控制都是通过DataRegion类实现的,很多Word操作都需要调用DataRegion类完成。DataRegion类能通过调用 OpenDataRegion(String) 方法或CreateDataRegion(String, DataRegionInsertType, String) 方法获得 DataRegion 对象。
二、一键套红的具体使用
PageOffice一键套红的使用方法简单地说就是通过程序先拷贝一份所想要的套红模板文件作为正式文件,然后再在线打开该正式文件,并且将文件的正文、发文日期、发文编号、发文人等等信息通过数据区域动态填充到正式文件中,即实现了一键套红,获得了添加了套红的正式的发文文件。
PageOffice一键套红具体实现时只需要将PageOfficeCtrl控件类结合WordDocument类和DataRegion类使用即可实现。具体实现步骤如下:
①,通过调用PageOfficeCtrl控件类的WebOpen()方法在线打开和显示存储文件正文的Word文档: PageOfficeCtrl1.WebOpen("doc/" + fileName, PageOffice.OpenModeType.docNormalEdit, "张三");
这一步不是必须的,也可在设置程序时自行设计跳过这一步,直接进行下一步。
②,选择想要的套红模板,通过程序拷贝该模板文件,将拷贝后的文件作为正式文件。
③,在调用WebOpen()方法打开Word文件之前通过DataRegion类将文件的正文、发文人、发文号、发文时间等数据赋值到相应的数据区域中,如:
WordDocument doc = new WordDocument();
DataRegion sTextS =doc.OpenDataRegion("PO_STextS");// 打开数据区域
"[word]doc/test.doc[/word]";//把正文文件插入到正式文件中
DataRegion copies =doc.OpenDataRegion("PO_Copies");
"6";
数据区域值的类型可以是文本类型、Word文件类型、Excel文件类型、Image图片类型等。一般将Word、Excel、图片类型的值赋值给数据区域时,写法为:“[word]word文件路径[/word]”、“[excel]excel文件路径[/excel]”、“[image]image图片路径[/image]”。但须注意的是PageOffice标准版只支持文本类型,专业版只支持文本、图片和Word文件类型,企业版文本、Word文件、Excel文件、Image图片类型都支持。使用时请一定要注意。
④,调用WebOpen()方法打开已经填充了数据区域的正式文件,即为添加套红后的正式发文文件。
另外,如果要保存套红后的正式发文文件,还可以通过设置PageOfficeCtrl类对象的“SaveFilePage”属性的值来设置保存页面。在保存页面中借助FileSaver类的SaveToFile(绝对路径及文件名)方法,实现保存一键套红后的正式发文文件。
PageOffice一键套红的部分实现代码为:
//Java实现代码
// 复制模板,命名为正式发文的文件名:zhengshi.doc
fileName = "zhengshi.doc";
String templateName = request.getParameter("mb");// 获取选择的模版文件名称
String templatePath = getServletContext().getRealPath("TaoHong/doc/" + templateName);
String filePath = getServletContext().getRealPath("TaoHong/doc/" + fileName);
copyFile(templatePath, filePath);//复制模板文件
......
PageOfficeCtrl poCtrl1 = new PageOfficeCtrl(request);
poCtrl1.setServerPage(request.getContextPath()+"/poserver.zz"); //此行必须
poCtrl1.setSaveFilePage("savefile.jsp");//设置保存页面
... ...
// 填充数据和正文内容到“zhengshi.doc”
WordDocument doc = new WordDocument();
DataRegion copies = doc.openDataRegion("PO_Copies");
copies.setValue("6");
DataRegion issueDept = doc.openDataRegion("PO_IssueDept");
issueDept.setValue("开发部");
DataRegion sTextS = doc.openDataRegion("PO_STextS");
sTextS.setValue("[word]doc/test.doc[/word]"); // 填充正文到数据区域
DataRegion sTitle = doc.openDataRegion("PO_sTitle");
sTitle.setValue("北京某公司文件");
DataRegion topicWords = doc.openDataRegion("PO_TopicWords");
topicWords.setValue("Pageoffice、套红");
... ...
poCtrl1.setWriter(doc); // 不要忘记此行
... ...
poCtrl1.webOpen("doc/" + fileName, OpenModeType.docNormalEdit, "张三");//打开Word文件
poCtrl1.setTagId("PageOfficeCtrl1"); //此行必须
//C#实现代码
// 打开word文件
private voidOpenWord(string
{
//*************卓正PageOffice组件的使用***************
Session.Add("fileName",fileName);//保存word文件名称
PageOfficeCtrl1.SaveFilePage = "Savefile.aspx";//设置保存页面
PageOfficeCtrl1.WebOpen("doc/"+ fileName, PageOffice.OpenModeType.docNormalEdit,"张三");//打开Word文件
}
......
// 套红
protected voidBtnTaoHong_Click(object sender, EventArgs
{
//套红模板时,复制模板文件为“正式发文文件”(zhengshi.doc),填充数据和“正文文件”到“正式发文文件”
//复制模板,命名为正式发文的文件名:zhengshi.doc
string fileName = "zhengshi.doc";
mb = Request.Form["templateName"];
System.IO.File.Copy(Server.MapPath("doc/"
Server.MapPath("doc/" + fileName), true);//拷贝文件
//给正式发文的文件填充数据
WordDocument doc = new WordDocument();
DataRegion copies =doc.OpenDataRegion("PO_Copies");
copies.Value = "6";
DataRegion sTextS =doc.OpenDataRegion("PO_STextS");
sTextS.Value = "[word]doc/test.doc[/word]";// 把正文文件插入到正式文件中
DataRegion sTitle =doc.OpenDataRegion("PO_sTitle");
sTitle.Value = "北京某公司文件";
DataRegion topicWords =doc.OpenDataRegion("PO_TopicWords");
topicWords.Value = "Pageoffice、套红";
... ...
PageOfficeCtrl1.SetWriter(doc); //不要忘记此行
//打开word文件
OpenWord(fileName);
}
... ...
以上示例的完整代码,请参考相应开发语言的Samples示例包中综合演示中的第9个示例:“使用PageOffice实现模板套红(专业版、企业版)”。