freemark介绍
FreeMarker 是一款 模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页,电子邮件,配置文件,源代码等)的通用工具。 它不是面向最终用户的,而是一个Java类库,是一款程序员可以嵌入他们所开发产品的组件。详细文档参考官方网址http://freemarker.foofun.cn/
主要文件结构
引入依赖
在pom.xml中引入freemarker依赖
<!-- 引入 freemarker 模板依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
添加配置信息
在application.properties中添加freemarker配置信息
#设定ftl文件路径
spring.freemarker.template-loader-path=classpath:/templates
# 关闭缓存, 即时刷新, 上线生产环境需要改为true
spring.freemarker.cache=false
spring.freemarker.charset=UTF-8
spring.freemarker.check-template-location=true
spring.freemarker.content-type=text/html
spring.freemarker.expose-request-attributes=true
spring.freemarker.expose-session-attributes=true
spring.freemarker.request-context-attribute=request
spring.freemarker.suffix=.ftl
编写Controller
ExportDocController.java
package com.example.controller;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import com.example.utils.ExportWordUtil;
@RestController
@RequestMapping("/export")
public class ExportDocController {
@RequestMapping(value = "/exportWord", method = RequestMethod.GET)
public void exportWord(HttpServletRequest request, HttpServletResponse response) throws Exception {
String fileName = "测试.doc"; // 文件名称
Map<String, Object> dataMap = new HashMap<>();
dataMap.put("title", "freemarker导出word"); // 设置要导出的数据,这里的title要和word模板中保持一致
new ExportWordUtil("UTF-8").exportDoc(response, fileName, "test.ftl", dataMap);
}
}
ExportWordUtil.java 导出文件的工具类
package com.example.utils;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.net.URLEncoder;
import java.util.Map;
import javax.servlet.http.HttpServletResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import freemarker.template.Configuration;
import freemarker.template.Template;
public class ExportWordUtil {
private static Logger logger = LoggerFactory.getLogger(ExportWordUtil.class);
private Configuration configuration;
private String encoding;
private String exportPath = "D:\\test\\";
/**
* 构造函数 配置模板路径
*
* @param encoding
*/
public ExportWordUtil(String encoding) {
this.encoding = encoding;
configuration = new Configuration();
configuration.setDefaultEncoding(encoding);
configuration.setClassForTemplateLoading(this.getClass(), "/templates/freemarker");
}
/**
* 获取模板
*
* @param name
* @return
* @throws Exception
*/
public Template getTemplate(String name) throws Exception {
return configuration.getTemplate(name);
}
/**
* 导出word文档到指定目录
*
* @param fileName
* @param tplName
* @param data
* @throws Exception
*/
public void exportDocFile(String fileName, String tplName, Map<String, Object> data) throws Exception {
logger.debug("导出word到D:\test");
// 如果目录不存在,则创建目录
File exportDirs = new File(exportPath);
if (!exportDirs.exists()) {
exportDirs.mkdirs();
}
Writer writer = new BufferedWriter(
new OutputStreamWriter(new FileOutputStream(exportPath + fileName), encoding));
getTemplate(tplName).process(data, writer);
}
/**
* 导出word文档到客户端
*
* @param response
* @param fileName
* @param tplName
* @param data
* @throws Exception
*/
public void exportDoc(HttpServletResponse response, String fileName, String tplName, Map<String, Object> data)
throws Exception {
response.reset();
response.setCharacterEncoding("UTF-8");
response.setContentType("application/msword");
response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(fileName, "UTF-8"));
// 把本地文件发送给客户端
Writer out = response.getWriter();
Template template = getTemplate(tplName);
template.process(data, out);
out.close();
}
}
前端模板文件准备
新建一个word文档,里面的表达式是你controller里面要设置的值,这里写的title,和controller里面的对应
文件另存为xml格式
xml文件的内容
复制xml文件到templates中freemarker目录下,并改变后缀为ftl格式,这里的名称要和controller里面的名称保持一致
注意事项:工具类中这个路径要和模板的路径保持一致,可以根据自己的情况进行修改
运行效果
访问http://localhost:8088/export/exportWord,推荐用谷歌浏览器测试
打开文档里面之前设置的title变成了controller里面设置的值