使用卓正PageOffice--实现用户自定义Word模板

导读: 在涉及到word文档生成的项目中,通常采用编程将数据填充到word模板中生成文件的实现方式,若是模板由开发人员本身设计,那么编程填充数据是相对容易实现的;但若是用户但愿能够本身修改模板或本身定义新模板,而且又不须要开发人员针对新模板重写代码,那么应该使用怎样的技术来实现这种需求呢?本文就此问题展开论述。html

在实际的开发过程当中,针对导出生成word文档的需求,都是用程序填充数据到word模板中来实现的。所谓模板也就是标记了数据位置和字体段落样式的Word文件。通常来讲,模板中的数据能够分为两种:一种是一对一的,一个数据在模版中对应一个数据位置,好比一个模板只须要使用“部门、姓名、缘由、天数、日期”5个数据,每一个数据只须要在文件中使用一次,以下图模板所示:编程

1710

用户定义模板时可使用所有数据,也可使用5个数据中的任意4个、3个甚至1个,但模板中数据标签的数量老是这个集合的子集。服务器

另外一种是一对多,一个数据在同一个模版中可使用一次,也可使用屡次。例以下图的介绍信的模板,每个数据都须要在文件中出现两次。字体

1711

若是一个项目系统中全部的模板都是固定的,那么只须要在系统开发过程当中由开发人员和用户一块儿把模板作好,以后,开发人员根据业务逻辑编写程序,给模板中的数据位置填充具体的数据便可实现,但在实际的应用中,不少时候不是这样的,最终用户仍是但愿能本身随时新建和修改模板,以知足不断变化的业务需求,若是每次模板的变化都须要和开发人员一块儿来完成,那么这个项目就永远不会完工。
为了知足用户的这一需求,在项目中就须要提供一个模板制做和管理的模块,又为了让程序能够控制和识别用户定义模板中的数据位置,那么就须要开发人员来制做一个约定,让最终用户在新建或编辑模板时必须按照约定来制做模板。那么应该如何约定呢? PageOffice提供的解决方案就是使用书签和特殊格式的文原本对文档中须要插入数据的位置作标记。spa

第一种方法使用书签来标记数据位置。Word文档中插入书签的方法:把光标定位到须要标记数据位置的地方,点Word菜单中的“插入”-“书签”,就会弹出一个标题为“书签”的对话框,输入新书签的名称,书签名能够包含数字但中间不能有空格,用PageOffice开发的时候不推荐使用中文命名书签名。注意:若是新插入位置或新对象采用的是已有的书签名,原有的书签将自动取消,因此使用书签来标记数据位置的话,确定是一个数据对应模板中一个位置的一对一模式。
在使用PageOffice开发的过程当中,为了不出现与用户本身定义的书签出现冲突,要求插入的书签名称必须以“PO_”开头。注意是字母o,不是数字0。书签名是不区分大小写的也能够写成“po_”。在PageOffice的概念里提到的数据区域,本质上就是书签,可是只有“po_”开头的书签才叫数据区域(DataRegion),请你们注意这点。设计

第二种方法就是使用特殊格式的文原本标记数据位置,好比说:【合同日期】、【##合同日期##】、[合同日期]……等等。使用书签标记数据位置有一个明显的缺点,同一个书签名称在一个word文档中只能出现一次,也就是说一个数据区域在文档中确定是惟一的,可是不少时候模版中须要多处位置使用一样的数据变量,例如上面举例使用的“合同日期”可能就须要在一个合同中多个位置出现,使用数据区域确定是没法知足需求的,可是使用特殊格式的文原本标记就没有这种限制了。3d

在PageOffice的概念里,这种【合同日期】、【##合同日期##】、[合同日期]……等等特殊格式的文本均可以被认为是数据标签(DataTag),同一个数据标签能够在一份文件中多个位置出现屡次,动态填充数据标签生成文件的时候,同一个数据标签都会被一样的数据替换。code

注意:【合同日期】和【##合同日期##】是两个不一样的数据标签,同一个数据标签必定要是文本格式彻底一致,好比:【##合同日期##】和【##合同日期##】虽然字体颜色和大小都不同,可是文本内容是彻底同样的,就被认为是同一个数据标签,因此在模版制做的时候定义数据标签是很简单的,只须要插入一样格式的文本就能够了。htm

虽然以上的两点约定已经定好了,可是让用户在编辑模版的时候使用office自身的功能来制做和编辑模版,仍是步骤繁琐、困难重重,制做的模板也容易出现一些问题,为此,PageOffice提供了定义模板的接口,由开发人员使用程序预先定义好用户可使用的数据区域和数据标签,当用户编辑模版的时候,给用户弹出一个数据区域和数据标签的选择窗口,用户只须要选择使用这些数据区域和数据标签插入到word模版中,设置好数据的段落格式、字体、样式、颜色等等。这样以来,不但处理好了约定的问题,并且使得用户自定义模板的操做更加简单快捷。对象

1、 使用PageOffice提供的编辑模版功能:

PageOffice给开发人员提供了定义模版的接口DefineDataRegion和DefineDataTag方法,

  • PageOffice.WordWriter.WordDocument.Template.DefineDataRegion
  • PageOffice.WordWriter.WordDocument.Template.DefineDataTag
  1. 使用DefineDataRegion定义数据区域,例如Java代码以下:
WordDocument doc = new WordDocument();
        doc.getTemplate().defineDataRegion("Name", "[ 姓名 ]");
        doc.getTemplate().defineDataRegion("Address", "[ 地址 ]");
        doc.getTemplate().defineDataRegion("Tel", "[ 电话 ]");
        doc.getTemplate().defineDataRegion("Phone", "[ 手机 ]");
        doc.getTemplate().defineDataRegion("Sex", "[ 性别 ]");
        doc.getTemplate().defineDataRegion("Age", "[ 年龄 ]");
        doc.getTemplate().defineDataRegion("Email", "[ 邮箱 ]");
        doc.getTemplate().defineDataRegion("QQNo", "[ QQ号 ]");
        doc.getTemplate().defineDataRegion("MSNNo", "[ MSN号 ]");

或者用ASP.NET开发的话,代码以下:

PageOffice.WordWriter.WordDocument doc = new PageOffice.WordWriter.WordDocument();
        doc.Template.DefineDataRegion("Name", "[ 姓名 ]");
        doc.Template.DefineDataRegion("Address", "[ 地址 ]");
        doc.Template.DefineDataRegion("Tel", "[ 电话 ]");
        doc.Template.DefineDataRegion("Phone", "[ 手机 ]");
        doc.Template.DefineDataRegion("Sex", "[ 性别 ]");
        doc.Template.DefineDataRegion("Age", "[ 年龄 ]");
        doc.Template.DefineDataRegion("Email", "[ 邮箱 ]");
        doc.Template.DefineDataRegion("QQNo", "[ QQ号 ]");
        doc.Template.DefineDataRegion("MSNNo", "[ MSN号 ]");

开发人员用服务器端程序定义好用户可以使用的数据区域,用户在客户端编辑模版的时候就可使用这些数据区域。注意,这里的代码中不须要写PO_ 开头,PageOffice会自动添加这个前缀。用户编辑模版时看到的数据区域管理窗口,以下图所示:

1712

左侧“待添加数据区域”列表是能够用户目前可使用的数据区域,右侧“已添加数据区域”列表是文档中已经添加的数据区域。此窗口的实现代码已经由PageOffice封装完毕,无需开发人员本身写复杂的js+html代码去实现,而且此窗口中内容的样式是能够修改的,若是对那些样式不太满意,只须要对此窗口html代码的样式作简单的调整便可。用户编辑数据区域时的效果,以下图所示:

1713

  1. 使用DefineDataTag定义数据标签,例如Java的代码以下:
WordDocument doc = new WordDocument();
        doc.getTemplate().defineDataTag("{ 甲方 }");
		doc.getTemplate().defineDataTag("{ 乙方 }");
		doc.getTemplate().defineDataTag("{ 担保人 }");
		doc.getTemplate().defineDataTag("【 合同日期 】");
		doc.getTemplate().defineDataTag("【 合同编号 】");

或者用ASP.NET开发的代码以下:

PageOffice.WordWriter.WordDocument doc = new PageOffice.WordWriter.WordDocument();
        doc.Template.DefineDataTag("{ 甲方 }");
        doc.Template.DefineDataTag("{ 乙方 }");
        doc.Template.DefineDataTag("{ 担保人 }");
        doc.Template.DefineDataTag("【 合同日期 】");
        doc.Template.DefineDataTag("【 合同编号 】");

开发人员用服务器端程序定义好用户可以使用的数据标签,用户在客户端编辑模版的时候就可使用这些数据标签。用户编辑模版时看到的数据标签管理窗口,以下图所示:

1714

同数据区域同样,对此窗口的实现代码,PageOffice也已经封装完毕,无需开发人员本身写复杂的js+html代码去实现,而且此窗口中内容的样式是能够修改的,若是对那些样式不太满意,只须要简单的调整一下此窗口html代码中的样式便可。开发人员只管编写程序给数据标签赋值对应的数据,用户本身定义模版的样式、数据位置和数据的多少,用户可使用所有的数据区域,也能够只使用部分, PageOffice在生成文件的时候,会自动忽略没有使用的数据标签,而不须要开发人员作任何代码的调整。

与数据区域的管理不一样的是,因为数据标签在文件中不是惟一的,因此无论在文件中添加了多少个数据标签,在数据标签管理窗口中的数据标签都是不会减小的。

二. 使用PageOffice.WordWriter 命名空间中的对象填充数据到Word模版,动态生成文档:

  • PageOffice.WordWriter.WordDocument.OpenDataRegion 方法
  • PageOffice.WordWriter.WordDocument.OpenDataTag 方法

开发人员只须要使用上面的两个方法,针对word模版编写程序,给全部的数据区域和数据标签赋值相应的数据便可,无需关心模版中到底使用了多少个数据区域和数据标签,那些Word模版中历来没有使用过的数据区域和数据标签,PageOffice会自动忽略,而无需开发人员作任何代码的修改,从而完美实现用户自定义模板的需求。

Java开发的赋值代码以下:

WordDocument doc = new WordDocument();
        doc.openDataRegion("Name").setValue("张三");        
        doc.openDataRegion("Age").setValue("21");  
		……
        doc.openDataTag("{ 甲方公司名称 }").setValue("微软中国总部"); 
        doc.openDataTag("{ 乙方公司名称 }").setValue( "北京幻想科技公司"); 
		……
        poCtrl.setWriter(doc);

ASP.NET开发的赋值代码以下,

PageOffice.WordWriter.WordDocument doc = new PageOffice.WordWriter.WordDocument();
        doc.OpenDataRegion("Name").Value = "张三";        
        doc.OpenDataRegion("Age").Value = "21";
		……
        doc.OpenDataTag("{ 甲方公司名称 }").Value = "微软中国总部";
        doc.OpenDataTag("{ 乙方公司名称 }").Value = "北京幻想科技公司";
		……
        PageOfficeCtrl1.SetWriter(doc);

详细请参考PageOffice开发包里Samples4中的相关示例演示: 2、30、用户自定义模板中数据区域(DataRegion)的位置(专业版、企业版) 2、3一、用户自定义模板中数据标签(DataTag)的位置(专业版、企业版) 3、十二、实现“用户自定义Word模板”动态生成文件(专业版、企业版)

相关文章
相关标签/搜索