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

2024-03-01 01:30

本文主要是介绍使用卓正PageOffice--实现用户自定义Word模板,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

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

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

1710

用户定义模板时可以使用全部数据,也可以使用5个数据中的任意4个、3个甚至1个,但模板中数据标签的数量总是这个集合的子集。

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

1711

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

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

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

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

注意:【合同日期】和【##合同日期##】是两个不同的数据标签,同一个数据标签一定要是文本格式完全一致,比如:【##合同日期##】和【##合同日期##】虽然字体颜色和大小都不一样,但是文本内容是完全一样的,就被认为是同一个数据标签,所以在模版制作的时候定义数据标签是很简单的,只需要插入同样格式的文本就可以了。

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

一、 使用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中的相关示例演示:
二、30、用户自定义模板中数据区域(DataRegion)的位置(专业版、企业版)
二、31、用户自定义模板中数据标签(DataTag)的位置(专业版、企业版)
三、12、实现“用户自定义Word模板”动态生成文件(专业版、企业版)

转载于:https://my.oschina.net/u/3850288/blog/2049579

这篇关于使用卓正PageOffice--实现用户自定义Word模板的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:https://blog.csdn.net/weixin_34144848/article/details/92416290
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/760753

相关文章

Spring Boot配置和使用两个数据源的实现步骤

《SpringBoot配置和使用两个数据源的实现步骤》本文详解SpringBoot配置双数据源方法,包含配置文件设置、Bean创建、事务管理器配置及@Qualifier注解使用,强调主数据源标记、代... 目录Spring Boot配置和使用两个数据源技术背景实现步骤1. 配置数据源信息2. 创建数据源Be

Java中使用 @Builder 注解的简单示例

《Java中使用@Builder注解的简单示例》@Builder简化构建但存在复杂性,需配合其他注解,导致可变性、抽象类型处理难题,链式编程非最佳实践,适合长期对象,避免与@Data混用,改用@G... 目录一、案例二、不足之处大多数同学使用 @Builder 无非就是为了链式编程,然而 @Builder

在MySQL中实现冷热数据分离的方法及使用场景底层原理解析

《在MySQL中实现冷热数据分离的方法及使用场景底层原理解析》MySQL冷热数据分离通过分表/分区策略、数据归档和索引优化,将频繁访问的热数据与冷数据分开存储,提升查询效率并降低存储成本,适用于高并发... 目录实现冷热数据分离1. 分表策略2. 使用分区表3. 数据归档与迁移在mysql中实现冷热数据分

mybatis-plus QueryWrapper中or,and的使用及说明

《mybatis-plusQueryWrapper中or,and的使用及说明》使用MyBatisPlusQueryWrapper时,因同时添加角色权限固定条件和多字段模糊查询导致数据异常展示,排查发... 目录QueryWrapper中or,and使用列表中还要同时模糊查询多个字段经过排查这就导致只要whe

linux批量替换文件内容的实现方式

《linux批量替换文件内容的实现方式》本文总结了Linux中批量替换文件内容的几种方法,包括使用sed替换文件夹内所有文件、单个文件内容及逐行字符串,强调使用反引号和绝对路径,并分享个人经验供参考... 目录一、linux批量替换文件内容 二、替换文件内所有匹配的字符串 三、替换每一行中全部str1为st

SpringBoot集成MyBatis实现SQL拦截器的实战指南

《SpringBoot集成MyBatis实现SQL拦截器的实战指南》这篇文章主要为大家详细介绍了SpringBoot集成MyBatis实现SQL拦截器的相关知识,文中的示例代码讲解详细,有需要的小伙伴... 目录一、为什么需要SQL拦截器?二、MyBATis拦截器基础2.1 核心接口:Interceptor

Python使用openpyxl读取Excel的操作详解

《Python使用openpyxl读取Excel的操作详解》本文介绍了使用Python的openpyxl库进行Excel文件的创建、读写、数据操作、工作簿与工作表管理,包括创建工作簿、加载工作簿、操作... 目录1 概述1.1 图示1.2 安装第三方库2 工作簿 workbook2.1 创建:Workboo

SpringBoot集成EasyPoi实现Excel模板导出成PDF文件

《SpringBoot集成EasyPoi实现Excel模板导出成PDF文件》在日常工作中,我们经常需要将数据导出成Excel表格或PDF文件,本文将介绍如何在SpringBoot项目中集成EasyPo... 目录前言摘要简介源代码解析应用场景案例优缺点分析类代码方法介绍测试用例小结前言在日常工作中,我们经

基于Python实现简易视频剪辑工具

《基于Python实现简易视频剪辑工具》这篇文章主要为大家详细介绍了如何用Python打造一个功能完备的简易视频剪辑工具,包括视频文件导入与格式转换,基础剪辑操作,音频处理等功能,感兴趣的小伙伴可以了... 目录一、技术选型与环境搭建二、核心功能模块实现1. 视频基础操作2. 音频处理3. 特效与转场三、高

Python实现中文文本处理与分析程序的示例详解

《Python实现中文文本处理与分析程序的示例详解》在当今信息爆炸的时代,文本数据的处理与分析成为了数据科学领域的重要课题,本文将使用Python开发一款基于Python的中文文本处理与分析程序,希望... 目录一、程序概述二、主要功能解析2.1 文件操作2.2 基础分析2.3 高级分析2.4 可视化2.5