freemarker-word
介绍
Java结合Freemarker模板技术生成office word 文档。并提供两种功能:
根据模板导出word到本地
根据模板响应到服务端,提供word下载
软件架构
Java、Freemarker、Fastjson
开发工具及依赖
IDEA-2017.2
freemarker-2.3.20.jar
fastjson-1.2.47.jar
commons-lang-2.5.jar
junit-4.10.jar
Freemarker模板简介
API: api
数据模型+模板=输出
首先,你应该创建一个 freemarker.template.Configuration 实例, 然后调整它的设置。Configuration 实例是存储 FreeMarker 应用级设置的核心部分。同时,它也处理创建和 缓存 预解析模板(比如 Template 对象)的工作。
不需要重复创建 Configuration 实例; 它的代价很高,尤其是会丢失缓存。Configuration实例就是应用级别的单例。因此Configuration需要设计成全应用单例模式。
创建数据模型
Map root 或者符合JavaBean规范具有getxxx()方法的对象
获取模板
从Configuration实例中获取Template实例Template temp = cfg.getTemplate("test.ftl");
Configuration 缓存 Template 实例,当再次获得 test.ftl 的时候,它可能再读取和解析模板文件了, 而只是返回第一次的 Template实例。
合并模板和数据模型
合并是由模板实例Template的process()完成的。
template.process(dataMap,out)
制作Freemarker模板(.ftl)
将word模板格式另存为.xml格式文档(注意:不是直接改文件后缀名,而是转为word .xml格式文档!)
使用在线xml格式工具,格式化word .xml中的xml内容后,直接修改后缀名为 .ftl
修改模板变量名 ${name}
${name}
早上好,今天是晴天!
数据模型
@Test
public void exportDoc() throws Exception {
IDocument IDocument = new FreemarkerService();
Map dataMap = new HashMap();
dataMap.put("name", "yacongliu");
String msg = IDocument.exportDoc(dataMap, "D:/test.doc");
System.out.println(msg);
}
文档效果
见 imgs 文件夹内图片
接口调用说明
设计IDocument 文档接口,定义文档操作方法:导出word到本地以及响应服务端提供下载。
/**
* 〈word 操作接口〉
* 〈.doc〉
*
* @author yacong_liu
* @create 2019/3/18
* @since 1.0.0
*/
package com.kingdee.shr.doc;
import javax.servlet.http.HttpServletResponse;
import java.util.Map;
public interface IDocument {
/**
* 导出word到本地
*
* @param dataMap 数据模型
* @param filePath 文件路径
* @return
*/
String exportDoc(Map, ?> dataMap, String filePath);
/**
* 导出word响应到服务端Response
*
* @param docName 文档名称
* @param dataMap 数据模型
* @param response HttpServletResponse
* @return
*/
String exportDoc(String docName, Map, ?> dataMap, HttpServletResponse response);
}
接口实现类com.kingdee.shr.doc.impl.FreemarkerService 进行具体的文档操作编码。
工厂类DocumentFactory 提供接口实例 采用静态工厂方法模式
/**
* Copyright (C), 2016-2019
* FileName: DocumentFactory
* Author: yacnog_liu
* Date: 2019/3/19 8:43
* Description: DocumentFactory
*
* 设计模式-静态工厂方法模式
*/
package com.kingdee.shr.doc;
import com.kingdee.shr.doc.impl.FreemarkerService;
public class DocumentFactory {
public static IDocument produceFreemarker() {
return new FreemarkerService();
}
}
接口调用示例
@Test
public void exportDocFactory() throws Exception {
IDocument IDocument = DocumentFactory.produceFreemarker();
Map dataMap = new HashMap(2);
dataMap.put("name", "yacong_liu");
String msg = IDocument.exportDoc(dataMap, "D:/test.doc");
System.out.println(msg);
}
参与贡献
Fork 本仓库
新建 Feat_xxx 分支
提交代码
新建 Pull Request