导读: 在涉及到word文档生成的项目中,一般采用编程将数据填充到word模板中生成文件的实现方式,如果模板由开发人员自己设计,那么编程填充数据是相对容易实现的;但如果用户希望可以自己修改模板或自己定义新模板,并且又不需要开发人员针对新模板重写代码,那么应该使用怎样的技术来实现这种需求呢?本文就此问题展开论述。
在实际的开发过程中,针对导出生成word文档的需求,都是用程序填充数据到word模板中来实现的。所谓模板也就是标记了数据位置和字体段落样式的Word文件。一般来说,模板中的数据可以分为两种:一种是一对一的,一个数据在模版中对应一个数据位置,比如一个模板只需要使用“部门、姓名、原因、天数、日期”5个数据,每个数据只需要在文件中使用一次,如下图模板所示:
用户定义模板时可以使用全部数据,也可以使用5个数据中的任意4个、3个甚至1个,但模板中数据标签的数量总是这个集合的子集。
另一种是一对多,一个数据在同一个模版中可以使用一次,也可以使用多次。例如下图的介绍信的模板,每一个数据都需要在文件中出现两次。
如果一个项目系统中所有的模板都是固定的,那么只需要在系统开发过程中由开发人员和用户一起把模板做好,之后,开发人员根据业务逻辑编写程序,给模板中的数据位置填充具体的数据即可实现,但在实际的应用中,很多时候不是这样的,最终用户还是希望能自己随时新建和修改模板,以满足不断变化的业务需求,如果每次模板的变化都需要和开发人员一起来完成,那么这个项目就永远不会完工。
为了满足用户的这一需求,在项目中就需要提供一个模板制作和管理的模块,又为了让程序可以控制和识别用户定义模板中的数据位置,那么就需要开发人员来制作一个约定,让最终用户在新建或编辑模板时必须按照约定来制作模板。那么应该如何约定呢? 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
- 使用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会自动添加这个前缀。用户编辑模版时看到的数据区域管理窗口,如下图所示:
左侧“待添加数据区域”列表是可以用户目前可以使用的数据区域,右侧“已添加数据区域”列表是文档中已经添加的数据区域。此窗口的实现代码已经由PageOffice封装完毕,无需开发人员自己写复杂的js+html代码去实现,并且此窗口中内容的样式是可以修改的,如果对那些样式不太满意,只需要对此窗口html代码的样式做简单的调整即可。用户编辑数据区域时的效果,如下图所示:
:-:
- 使用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("【 合同编号 】");
开发人员用服务器端程序定义好用户可使用的数据标签,用户在客户端编辑模版的时候就可以使用这些数据标签。用户编辑模版时看到的数据标签管理窗口,如下图所示:
:-:
同数据区域一样,对此窗口的实现代码,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模板”动态生成文件(专业版、企业版)
相关推荐
Java提供了一些强大的库来实现这个功能,其中就包括利用Word模板生成自定义内容。在这个案例中,我们将探讨如何使用Java,结合XML、Freemarker等技术,来实现这一目标。 首先,让我们了解一下核心的Java库Apache ...
1. **读取数据库数据**:PageOffice支持连接各种类型的数据库,如MySQL、Oracle、SQL Server等,可以从数据库中获取数据,然后将这些数据填充到预先设计好的Word模板中。 2. **模板处理**:开发者可以创建一个包含...
以生成工资条为例,演示了通过PageOffice开发平台,用Java语言实现Word文档的在线打开、编辑和保存,数据区域数据的动态填充和提交,数据区域插入Word文件,动态填充和提交Word文件中Tabel的数据
综上所述,PageOffice提供了强大且灵活的工具,使开发者能够轻松地在Web应用中实现批量Word文档转换,极大地提高了工作效率。通过合理的代码结构和前端交互设计,可以实现高效、用户体验良好的批量处理任务。
6. 生成Word文档:在服务器端,我们可以使用诸如docxtemplater这样的库,根据接收到的表单数据填充预设的Word模板,从而生成Word文档。这个过程涉及到对Word文档格式的解析和内容的动态替换。 7. 下载Word文档:...
Java对PageOffice编程,从空白的word模板动态生成word文件,填充文本内容、图片,同时设置文本的字体、段落、格式。 PageOffice是标准Java组件,标准JSP Tag标签方式引用,完美支持Eclipse、MyEclipse等开发工具。 ...
8. **自定义类名**:描述中提到的`.page`类,可以用于封装整个Word样式区域,方便在其他页面中复用。通过引入这个类,我们可以快速将Word样式的UI应用到任何HTML结构中。 综上所述,实现“css实现Word样式”需要...
此外,还涵盖了如何实现Word文档的全文检索和版本对比,以及用户自定义Word模板和合并多个Word文件的方法。 在Excel篇中,教程介绍了Workbook类、Sheet类、Table类和Cell类等常用接口对象,并指导如何动态填充Excel...
总的来说,PageOffice提供了一套高效、便捷的解决方案,使开发者能以C#语言快速实现Word模板的动态填充和文件生成,极大地提高了文档处理的效率和灵活性。通过深入理解和熟练运用FileMaker控件,可以满足各种复杂...
"WordSalaryBill"可能是示例代码、模板或者一个实际的工资单文档,用于演示如何使用PageOffice处理Word格式的工资单。开发者可以通过分析这个文件,学习如何自定义工资单格式,自动填充数据,以及如何保护和导出文档...
这个压缩包包含了PHP版本的PageOffice组件,允许开发者在网页上直接编辑、创建、预览和保存Word、Excel、PowerPoint等Office文档,而无需借助Microsoft Office软件本身。 在Web应用中,PageOffice的核心功能包括: ...
PageOffice控件是一款用于在网页中实现文档在线编辑和处理的专业控件,它允许用户无需离开浏览器即可创建、编辑和保存各种格式的文档,如Word、Excel、PowerPoint等。这款控件通常被广泛应用于企业信息化系统、在线...
开发者可以通过学习和掌握PageOffice的API,实现与后台数据库的交互,完成诸如数据导入导出、模板编辑、在线协作等功能。 为了使用PageOffice,你需要在Java项目中引入相关的jar包,并根据官方提供的教程配置服务器...
这个过程可以通过使用PageOfficeCtrl和PDFCtrl两个控件来实现,这两个控件是由PageOffice提供的,使得转换和显示变得更加简单高效。 首先,确保已经安装了PageOffice的服务器端安装程序,并在网站的根目录下添加了...
创建一个名为`doc`的文件夹,用于存储Word模板文件和转换后的PDF文件。将待转换的Word文档(如`template.doc`)复制到此目录。 3. **创建Web页面WordToPDF.aspx**: 在这个页面中,添加PageOfficeCtrl控件。在...
- Word 2010预设了多种模板,用户可以根据需要选择并编辑。 9. **功能区管理** - 功能区最小化:右键点击功能区,选择“功能区最小化”命令。 - 显示功能区:再次点击功能区名称或取消“功能区最小化”设置。 ...
类似于Excel中的求和功能,Word可以通过插入表格并使用表格工具中的“公式”来实现。 20. **预览时可编辑文档** 在打印预览模式下,可以通过“编辑文档”选项进行编辑操作。 21. **轻松保存OfficeXP的用户个性...
在实际应用中,你可能需要进一步实现PageOffice的功能,例如在`Word.html`中调用PageOffice提供的JavaScript API,打开本地或网络上的Word文档进行编辑,然后保存回服务器。这通常涉及到在HTML页面中嵌入PageOffice...
2. **下载模板**:需要在Office Online上下载模板时,可以依次点击[帮助] -> [Microsoft Office Online] -> [新建文档] -> [Office Online 模板],然后搜索并下载“培训申请”模板。 3. **简历向导**:建立时间型...