前言
在项目中遇到,需要使用数据库里面的数据填入word模板中,最后找到了FreeMarker,可以说是非常好用了。
Apache FreeMarker™是一个模板引擎:一个Java库,用于根据模板和更改数据生成文本输出(HTML网页,电子邮件,配置文件,源代码等)。模板是用FreeMarker模板语言(FTL)编写的,这是一种简单的专用语言(不像PHP这样的完整编程语言)。通常,使用通用编程语言(如Java)来准备数据(发布数据库查询,进行业务计算)。然后,Apache FreeMarker使用模板显示准备好的数据。在模板中,您将关注如何呈现数据,而在模板之外,您将关注于要呈现的数据。
创建配置实例
首先,您必须创建一个 freemarker.template.Configuration实例并调整其设置。一个Configuration实例是存储FreeMarker的应用水平设置的中心位置。此外,它还处理预解析模板(即 对象)的创建和 缓存Template。
通常,您只在应用程序(可能是servlet)生命周期开始时执行此操作一次:
1 | //创建您的Configuration实例,并指定是否属于FreeMarker |
从现在开始,您应该使用这个单一 配置实例(即它的单例)。但请注意,如果系统有多个使用FreeMarker的独立组件,那么他们当然会使用自己的私有 Configuration实例。
不要不必要地重新创建Configuration 实例; 它很昂贵,其中包括你丢失了模板缓存。Configuration实例意味着应用程序级单例。
我的使用
1 | <dependency> |
- 首先建立一个Word文档 在需要填充的地方写上几个字母或者数字方便等会定位别用空格或者特殊符号
- 另存为XML文件 查找
<w:t> 之前填充地方填的字母 </w:t>
然后把字母改成需要映射的方法或者属性${getName()} 或者 ${Name}
- 改完后把后缀名改为
.ftl 或者 .ftlh
- 然后就可以开始写代码了
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38//根据上面官网所说 我们需要它是一个单例
import java.io.File;
import java.io.IOException;
import freemarker.template.Configuration;
import freemarker.template.TemplateExceptionHandler;
public class Freemark {
private Freemark() {
}
private static class CfgSingleton {
private static final Configuration CFG = new Configuration(Configuration.VERSION_2_3_28);
static {
try {
CFG.setDirectoryForTemplateLoading(new File("templates"));
} catch (IOException e) {
e.printStackTrace();
}
CFG.setDefaultEncoding("UTF-8");
//设置错误的显示方式。
//在网页开发期间 TemplateExceptionHandler.HTML_DEBUG_HANDLER更好。
CFG.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER);
//不要在FreeMarker中记录它会抛出的异常:
CFG.setLogTemplateExceptions(false);
//将模板处理期间抛出的未经检查的异常包装到TemplateException-s中。
CFG.setWrapUncheckedExceptions(true);
}
}
public static Configuration getCfg() {
return CfgSingleton.CFG;
}
}
1 |
|
为了简化第2和第3步的操作
*我的规则是文档中每个需要的地方写上get{Num} 对应 Class 中的getFunc() 然后替换掉,需要注意的是顺序一定要是一样的,当然也可以在Xml中写上对应的方法然后做判断再替换 *
1 | import org.slf4j.Logger; |