在Java web项目中使用FreeMarker导出word文档
在最近的项目中,有需求需要导出word文档。经过一番研究,笔者发现导出word文档的方法的确是有很多种,比如使用Jacob、Apache POI、Java2Word、iText等等,但是都没有使用freemarker来的简单直接预方便。因此,下面笔者演示一下利用freemarker生成简单word文档的例子。当然,复杂的word文档的生成也是同样的原理与方法。
FreeMarker
首先,我们看一段FreeMarker官方的介绍:Apache FreeMarker是一个模板引擎:基于模板和更改数据生成文本输出(HTML网页,电子邮件,配置文件,源代码等)的Java库。 模板是使用FreeMarker模板语言(FTL)编写的,这是一种简单的专业语言(不是像PHP这样的全面的编程语言)。 您的意图是准备数据以真正的编程语言显示,例如问题数据库查询和进行业务计算,然后模板显示已准备好的数据。 在模板中,您将重点关注如何呈现数据,而在模板外,您将关注要显示的数据。
也就是说,使用FreeMarker模板,我们可以生成各种文本,包括word文档。
下面我们就使用FreeMarker生成word文档。
- 制作ftl模板
因为freemarker是基于模板,所以,首先我们需要制作ftl即freemarker模板。
制作步骤:如下图所示:
(1).新建word模板
假如,我们就要生成这样的一个word文档,注意${}中,即是我们将要填充的动态数据。
(2).将上面的word文档另存为xml格式
使用编辑工具打开查看,比如使用notepad++打开:
如上图显示。
(3).修改此xml文件的格式为ftl,即生成我们最终的模板
至此,模板制作完成。 - 新建Dynamic web project项目WordDemo
- 引入freemarker的jar,下载地址
http://freemarker.org/freemarkerdownload.html - 将上面的ftl模板引入项目,同时建立如下的目录结构:
- 编写MDoc类:
package cn.com.mp.utils;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
import java.io.Writer;
import java.util.Map;
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;
public class MDoc {
private Configuration configuration = null;
public MDoc() {
configuration = new Configuration();
configuration.setDefaultEncoding("utf-8");
}
/**
*
* @param dataMap 要填充的数据集合
* @param fileName 生成的word文档路劲与名称
* @throws UnsupportedEncodingException
*/
public void createDoc(Map<String,Object> dataMap,String fileName) throws UnsupportedEncodingException {
//读取模板
configuration.setClassForTemplateLoading(this.getClass(), "/cn/com/mp/utils");
Template t=null;
try {
t = configuration.getTemplate("template.ftl");
} catch (IOException e) {
e.printStackTrace();
}
File outFile = new File(fileName);
Writer out = null;
FileOutputStream fos=null;
try {
fos = new FileOutputStream(outFile);
//注意对流的编码
OutputStreamWriter oWriter = new OutputStreamWriter(fos,"UTF-8");
out = new BufferedWriter(oWriter);
} catch (FileNotFoundException e1) {
e1.printStackTrace();
}
try {
t.process(dataMap, out);
out.close();
fos.close();
} catch (TemplateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
6 . 编写测试类
package test;
import java.io.UnsupportedEncodingException;
import java.util.HashMap;
import java.util.Map;
import cn.com.mp.utils.MDoc;
public class Main {
public static void main(String[] args) {
Map<String, Object> dataMap = new HashMap<String, Object>();
dataMap.put("title", "如何使用freemarker生成word文档");
dataMap.put("context", "首先建立ftl模板,引入freemarker的jar包,编写MDoc类读取模板,编写Main测试类,使用map集合填充模板");
dataMap.put("author", "mp");
dataMap.put("date", "2017-05-18");
MDoc mdoc = new MDoc();
try {
mdoc.createDoc(dataMap, "E:/outFile.doc");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
}
7 . 测试结果:
在e盘,确实存在outFile文件,打开查看:
生成我们预期的word文档。
8 . 总结
至此,我们使用freemarker完成了word文档的导出。如果你使用过其他的技术导出过word文档,那么此刻,使用freemarker的好处就不言而喻,很直接很方便。
更多FreeMarker的知识,查看Freemarker官网
编写的过程难免会出现各种错误,欢迎大家指教。