maven依赖
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.28</version>
</dependency>
将word模板参数替换并另存为为xml格式文件
将xml文件后缀改为ftl
转化工具类
import freemarker.template.Configuration;
import freemarker.template.Template;
import sun.misc.BASE64Encoder;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.util.Map;
/**
* word模板生成报告
* Created by it on 2019/10/25.
*/
public class TemplateWordUtil {
/**
* 初始化配置文件
*
* @param folderPath 生成word的文件夹路径
* @return Configuration
*/
private static Configuration initConfiguration(String folderPath) {
Configuration configuration = new Configuration();
configuration.setDefaultEncoding("utf-8");
try {
configuration.setDirectoryForTemplateLoading(new File(folderPath));
} catch (IOException e) {
System.out.println("初始化configuration失败,路径不存在:{}" + folderPath);
e.printStackTrace();
}
return configuration;
}
/**
* 导出word文档,响应到请求端
* @param folderPath,路径指向到模板文件下
* @param tempName,要使用的模板
* @param docName,导出文档名称
* @param dataMap,模板中变量数据
* @param response,HttpServletResponse
*/
public static boolean exportDoc(String folderPath, String tempName, String docName, Map<?, ?> dataMap, HttpServletRequest request, HttpServletResponse response) {
boolean status = false;
Configuration configuration = initConfiguration(folderPath);
ServletOutputStream sos = null;
if (request != null) {
response.reset();
}
Template t = null;
try {
// tempName.ftl为要装载的模板
t = configuration.getTemplate(tempName);
t.setEncoding("utf-8");
} catch (IOException e) {
e.printStackTrace();
}
// 输出文档路径及名称 ,以临时文件的形式导出服务器,再进行下载
String url = folderPath + "temp" + (int) (Math.random() * 100000) + ".doc";
File outFile = new File(url);
Writer out = null;
try {
out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile), "utf-8"));
status = true;
t.process(dataMap, out);
out.close();
FileSource.download(url, docName, request, response);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (sos != null)
try {
sos.close();
} catch (IOException e) {
e.printStackTrace();
}
if (outFile != null)
outFile.delete(); // 删除临时文件
}
return status;
}
}
调用工具类
Map<String, Object> map = new HashMap<>();
map.put("name", "java");
map.put("gender", "male");
map.put("age", 18);
TemplateWordUtil.exportDoc("C:\\test\\userfiles\\", "word模板.ftl", "helloword.doc", map, request, response);
导出后
无论是list集合等取值直接按照freemarker方式来就可以