1、FreeMarker 文 档 生 成技 术 在 毕 业设 计 管 理 系 统 中 的应 用 周建锋 天 津 理工 大 学中 环 信息 学 院计 算 机工 程 系 摘 要: FreeMarker 是一种使用 Java 语言编写的模板引擎框架技术。 使用该技术构建了 一种模板样式与模型数据相互分离的 Word 文档动态生成方案。该方案应用于毕 业设计管理信息系统,可以在线生成选题审批表、任务书、开题报告、中英文摘 要、论文扉页等具有固定结构的 Word 文档。实践证明,该方案代码量少,文档内 容及样式控制方便, 保证了毕业设计相关文档格式的高度一致性。 关键词 : FreeMarker; 模板技术
2、; Word 自动生成; 毕业设计管理; 作 者简 介: 周建锋(1983-),男,天津人,硕士,天津理工大学中环信息学院计算机 工程系讲师,研究方向为软件工程、系统分析与设计。 基 金: 天津理工大学中 环信息学院青年教师科研育苗基金项目(KYLG04) 0 引言 随着教育信息化的发展,众多高校将计算机技术应用于日常教学管理中1 。毕 业设计( 论文)是高校实现人才培养目标的重要实践教学环节,应充分利用先进的 信息技术提高管理效率,从而提高毕业设计质量。笔者为天津理工大学中环信息 学院设计开发了一个基于 B/S 架构的毕业设计管理信息系统2 ,系统使用 Java Web 技术实现,采用基于组
3、件式开发的MVC(Model View Controller) 设计模式3 , 高效实现了毕业设计信息化、规范化管理。系统中涉及的所有基础性数据(如学 生信息、指导教师信息、题目信息等)以及毕业设计过程中师生在线填写的各类 文档都持久化存储在对应的 MySQL 数据库表中。 但是,诸如选题审批表、 任务书、 开题报告、提交审核表等文档仍需要打印纸质版后由学生或指导教师签字,这些 纸质版文档或者要求院系存档,或者需要装订在毕业设计说明书(论文)中。如何 将MySQL 中的相关数据导出并生成符合格式规范要求的Word 文档,成为毕业设计 管理信息系统必须实现的一项功能。本文选用基于 FreeMar
4、ker 模板引擎技术构 建了一种模板样式与模型数据相互分离的 Word 文档动态生成方案,通过较少的 代码量就可以满足毕业设计管理信息系统中的文档导出需求。 1 相关技术介绍 1.1 FreeMarker FreeMarker 是使用纯 Java 编写的一款模板引擎,即一种基于模板、用于生成输 出文本(HTML 、XML、RTF、Java 源代码等)的通用工具4 。FreeMarker 不是面 向最终用户的,而是一个 Java 类库,适合作为嵌入其它开发产品中的一 个组件, 其最初设计被用来在 MVC 模式的Web 开发框架中生成 HTML 页面,但它不依赖于 Servlet 、HTML 或W
5、eb 环境,仅仅专注于展示数据,与具体的程序逻辑相分离。 它 的核心原理是模板+ 数据模型=输出。 首先,FreeMarker 拥有功能强大的模板语言 (FreeMarker Template Language, 简称FTL), 包含了诸如include、 if/elseif/else 、 循环结构等常用指令,在模板中创建和改变变量,并且能够在任 何地方使用复杂表达式来指定值。其次,FreeMarker 具有通用的数据模型,它不 是直接反射到Java 对象,而是通过插件式对象封装,以变量方式在模板中显示 Java 对象。 1.2 Word 对XML 的 支持 微软从Office Word 20
6、03 就开始针对XML 进行了完整设计,支持称为 Word 标记 语言的原生XML 词汇,使Word 文档可以和XML 文档相互转换5 。 开发者可建立 这种XML 和可编程代码来增强 Word 文档,并帮助用户建立和修改文档。 常见的WordXML 格式标签示例如下:表示 Word 文档中的段落,和 html 中的标签类似; 表示一个样式串,指明它包括的文本显示样式,如文本属性加 粗、下划线等; 表示Word 里的字符串, 即文字内容;Word 段落属性包含在标签中; 标签中定义文本格式。 2 系统数据模型 在毕业设计管理信息系统中,具有固定结构和格式规范要求的文档有封皮、 扉页、 选题审批
7、表、 任务书、 开题报告、 中期检查表、 中英文摘要、 提交审核表和装订 审批表等。这些文档结构和格式固定,其中有一部分文档内容由用户在毕业设计 中通过网络在线提交并持久化至系统数据库。本文简要 介绍系统数据库,然后以 开题报告为例说明如何准备模型数据。 2.1 系统 数据库 系统使用MySQL 数据库,主要涉及的数据库表有 adminuser(管理员表)、 teacher( 教师表)、stu(学生表)、syear(学年表)、dept(部门表)、major(专业 表)、rank( 职称表) 、ttask(教师任务表)、project( 题目信息表)等, 其中毕业设 计相关文档数据主要来源于 p
8、roject 表,结构如表 1 所示(限于篇幅, 仅列出 project 表中的部分字段)。 2.2 准备 模型数 据 数据模型并不是文本文件,它来自于Java 对象。图 1 为开题报告的一个 Word 示 例,其中使用矩形方框标出的是生成开题报告需要的动态模型数据。不难发现, 这些数据均来源于project 关系表,系统与project 关系表对应的JavaBean 实体 类为project,对project 关系表进行查询得到的记录将通过ORM(对象关系映射) 转换为一个project 类的对象实例,该对象的成员变量分别对应 project 表中各 字段。 表1 project 结构( 题
9、目信息表) 下载原表 数据模型是树形的, 可以通过HashMap类构建简单的数据模型, 例如将某个题目信息对象 project 以map 映射数据(“project“,project) 存入数据模型, 在flt 模板中则可以通过$project.ptitle 获取毕业设计( 论文)标题, 通过$project.sname 获取学生姓名,其访问模型数据方式类似于 EL 表达式。 3 FreeMarker 模 板 准备 在确定了模型数据对象名称、结构和语义之后,才能准确无误地使用模板语言构 建动态可变内容。 下面以创建开题报告模板为例说明如何准备 FreeMarker 模板。 3.1 准备 Wor
10、d 模板 准备一个如图1 所示的 Word 2003 版本开题报告,需要注意的是开题报告内容比 较多,可能会跨页,为保证表格跨页正常显示,需要将开题报告内容所在的单元格 设置为允许跨页断行。 图1 开题报告文档示例 下载原图 3.2 转换 为 XML 并 保存为 ftl 文件 将准备好的开题报告模板另存为 Word 2003XML 文档,然后将其后缀名修改为 flt 即可。 3.3 修改 ftl 文件, 完成 数据 填充 修改flt 文件,将如图1 所示的需要动态填充 的零散数据替换为ftl 语言表达式。 文献中通过类似$project.sname 方式取出模型数据,完成对模板的填充,但在 实
11、际应用中有可能产生两个问题:(1)当模型数据对象为 NULL 或者不存在的情况 下会抛掉异常;(2)当模型数据中含有 “”、“(2)将分隔字符串替换 为 “ 。该方法利用了 CDATA 区段不被解析特性以及 ftl 模板中的段落组成方式,将开题报告内容中的 多个段落巧妙地拼接构造出来,最终生成格式一致的多段内容。 4 程序实现 4.1 创建 工具类 并初 始化 FreeMarker 配置 实例 首先导入版本号为 2.3.24 的freemarker.jar 包,并在com.bs.util 包下创建 WordUtil.java 工具类。使用 FreeMarker 的第一步是创建配置实例,由于 F
12、reeMarker 的configuration 配置对象全局只需要维护一个,因此在 WordUtil.java 类中将 configuration 定义为静态变量并 通过静态代码初始化: 接着在该类中封装对多个段落进行预处理的stringFilter()方法和生成Word 文 档的creatWord() 方法,下面分别对这两个方法进行介绍。 4.2 对多 个段落 内容 的预 处理 对多个段落内容的处理采用前述的替换填充策略。 在生成选题理由、 开题报告内 容等包含多个段落内容文档时,需要使用该方法对数据进行预处理,代码如下: 4.3 生成 Word 文 档方法 生成Word 的方法封装如下,
13、其中省略了 trycatch 语句块。 需要说明的是,ftl 模板文件设置为统一存放在站点根目录 的“/templates/” 路径下, 方法调用时需要提供参数为:当前的 servletContext 上下文、模型数据 Map 、使用的模板名称、生成 Word 文档的存放目录以及 Word 文档名称。若指定 的Word 文档存放目录不存在,程序会自动创建该目录。 4.4 应用 示例 毕业设计各类文档内容提交时间不同,生成对应 Word 文档的时机也不同。 以生成 开题报告Word 为例,按照系统设计,学生提交开题报告内容后,由指导教师填写 审批意见,当提交审批意见成功后自动生成开题报告 Wor
14、d,此后只有指导教师可 以修改开题报告相关内容。 指导 教师在线修改开题报告内容并提交成功后自动重 新生成开题报告Word 。生成开题报告Word 文档的核心代码如下: 代码说明:(1)当前题目project 对象和对应学生stu 对象已经通过查询得到;(2) 开题报告内容(ktbgnr 字段)和开题报告意见(ktbgyj 字段)包含多个段落内容, 需要进行预处理;(3) 系统最初导入学生信息时,会根据一定的规则自动生成一个 唯一的服务器相对路径并保存在 fpath 字段,此路径下对应存储该学生的所有相 关文档, 因此生成的Word 文档路径由服务器绝对路径basepath+stu.getF-
15、path() 指定。 5 结语 本文基于FreeMarker 模板引擎构建了Word 文档动态生成方案,不仅代码量非常 少,而且解决了零散数据填充时容易被忽略的两个问题,增强了程序的健壮性。 与 此同时, 对应用中可能出现的多个段落内容数据填充问题提出了有效的解决方 案。在毕业设计管理信息系统的应用实践中,实现了数据导出并生成完全符合特 定格式要求的Word 文档功能,满足了具有统一格式规范的各类文档导出需求。 参考文献 1 夏松竹.基于B/S 结 构的本科毕业设计管理信息系统设计与实现J. 工业和 信息化教育,2016(1):82-86. 2 周建锋,付延友. 毕 业设计管理信息系统的设计与
16、实现J.软件导 刊,2016(8):96-98. 3ROD JOHNSON.J2EE 设计开发编程指南M. 魏海萍,于晓菲,毛选, 译.北京:电 子工业出版社,2003. 4 刘全飞,周相兵.基于 FreeMarker 的站群系统模板设计实现J.信息技 术,2015(7):36-39. 5 肖斌,李超,汪敏.基于 C#快速生成 Word 报告J.计算机系统应 用,2012,21(7):232-235. 6 王庆喜,李源.基于freemarker 和XML 技术的 Word 生成方案J. 电脑与信息 技术,2012,20(2):31-33. 7 曾玉林.FreeMarker 在JSP 项目中 Word 报表应用研究J.电脑开发与应 用,2013,26(12):59-61. 8 王正敏,张太红, 李 永可,等.FreeMarker 模板引擎在线动态生成Excel 和Word 文档技术J.计算机与现代化,2016(4):109-113.