1

Java使用FreeMarker模版技术动态生成word实践

 2 years ago
source link: https://blog.51cto.com/u_15495434/5380916
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

在日常开发中,常常有动态word文件生成的需求,通过编制模版,然后动态修改word内容以组合成新的文件。报告单、请假单、发票页等都可以使用动态生成word来解决。

笔者总结归纳出通用技术要点,尽可能降低广大开发者的使用技术门槛。

二、制作与渲染模版

(一)总体流程

1、准备数据

通过查询数据库获取需要修改的数据,或者是调用远程API接口获得数据,数据准备完毕后,进入下一步。

2、制作word模版

新建并设计出期望效果的word文档样式,包含字体、字号、段落样式布局等,先做出一个静态的word文件。

3、制作freemark模版

在新建word模版的基础上,使用freemark语法,结合已经准备填充的数据结构,将需要动态变化的内容用变量表示。

用变量替换时常见的情形时对象属性和循环。

freemark模版制作完成后,保存为ftl后缀文件。

4、渲染字符串

将数据和freemark模版组合,并且将前期制作的变量占位符替换,形成最终的word文件

(二)编码实践

按照笔者提供的流程和SDK编码实践相对比较简单。

1、引入依赖

如下依赖包含封装的工具方法,大幅降低使用门槛。

<dependency>
    <groupId>xin.altitude.cms</groupId>
    <artifactId>ucode-cms-word</artifactId>
    <version>1.5.6</version>
</dependency>
/* 模拟准备数据 */
List<HumanDemo> data = TempUtils.readJsonList("HumanDemo.json", HumanDemo.class);
/* 将数据填充到模版中并生成word文档 */
DocUtils.fillWord("templates/HumanDemo.ftl", data);

从流程到编码实践比较简单。

到此为止,已经可以快速体验word生成技术了。

三、内容拓展

上述分析的word生成如果页面结构较为简单,实现起来难度不大,假如涉及到如下情形,实现起来就会增加不少难度。

增加的困难主要来源于页面布局复杂、使用各种组件控件多多媒体资源的引入。解决方法仍然参考上述流程。

(一)复杂模版

1、多媒体资源布局
Java使用FreeMarker模版技术动态生成word实践_freemarker

当模版中需求多媒体(图片)内容,并且数量动态变化,位置不固定时,实现难度较大。

2、复杂内容布局
Java使用FreeMarker模版技术动态生成word实践_freemarker_02

当模版中包含文本,选择框,横向合并单元格、纵向合并单元格时,实现难度较大。

3、动态渲染表格
Java使用FreeMarker模版技术动态生成word实践_freemarker_03

涉及到动态渲染合并单元格时,实现难度较大。

上述复杂模版制作,笔者均有实践。

(二)文件格式

对于word文件格式有两种,一种是.doc后缀文件,一种是.docx后缀文件,上述讨论属于前者,后者模版制作与生成比前者要复杂,将在后续的版本中提供API操作接口。

.docx后缀文件的word在转PDF方面兼容性比较好。

(三)使用建议

开发前,尽可能将模版布局确认,对于复杂页面结构修改需要增加较大投入

熟悉FreeMark语法、word文件结构将会对word模版开发受益

多使用、多练将有助于制作出漂亮的文档


源码在 GitHub ,视频讲解在 B站 ,本文收藏在 博客天地



About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK