1 导入依赖
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.30</version>
</dependency>
2 创建一个docx文件
加入内容
3 将该docx文件保存为xml文件
4 将这个文件放到templates目录下,使用idea可以打开ftl文件,可以使用ctrl+alt+L格式化代码
4 可以使用ctrl+f查找${name},这个是将要替换的值
直接上工具类
import com.alibaba.fastjson.JSONObject;
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import org.omg.CORBA.OBJ_ADAPTER;
import org.springframework.core.io.ByteArrayResource;
import org.springframework.core.io.InputStreamSource;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;
/**
* word下载工具类
*
* @author qsk
* @email 1150024214@qq.com
* @date 2021-01-12 18:38:25
*/
public class WordUtil {
/**
* 导出Word文件
* @param dataMap ftl中的 key-value
* @param ftlPath ftl模板路径
* @param request
* @param response
* @throws Exception
*/
public InputStreamSource exportToWord(Map<String, Object> dataMap , String ftlPath , HttpServletRequest request, HttpServletResponse response) throws Exception {
// 纠正编码
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("utf-8");
// ** 初始化配置文件**//*
Configuration configuration = new Configuration();
// ** 设置编码 **//*
configuration.setDefaultEncoding("utf-8");
//********
configuration.setClassForTemplateLoading(WordUtil.class,"/");
// 加载模板,通过Word转XML文件转换过来的
Template template = configuration.getTemplate(ftlPath);
// 指定输出word文件的路径
// 调用工具类WordUtils的createDoc方法生成Word文档
InputStreamSource file = createDoc(dataMap, template);
InputStream fin = file.getInputStream();
ServletOutputStream out;
response.setContentType("application/msword");
// 设置浏览器以下载的方式处理该文件
response.setHeader("content-disposition", "attachment;filename=document.doc");
out = response.getOutputStream();
// 缓冲区
byte[] buffer = new byte[512];
int bytesToRead;
// 通过循环将读入的Word文件的内容输出到浏览器中
while ((bytesToRead = fin.read(buffer)) != -1) {
out.write(buffer, 0, bytesToRead);
}
fin.close();
if (out != null) {
out.close();
}
return file;
}
/**
* 创建word文件
*
* @param dataMap
* @param template
* @return
* @throws TemplateException
* @throws IOException
*/
public static InputStreamSource createDoc(Map<String, Object> dataMap, Template template)
throws TemplateException, IOException, TemplateException {
//生成随机的合同名称
StringWriter out1 = new StringWriter();
Writer out = new BufferedWriter(out1, 10240);
//将数据输出到模板
template.process(dataMap, out);
out.close();
out1.close();
return new ByteArrayResource(out1.toString().getBytes(StandardCharsets.UTF_8));
}
}
controller写法
/**
* word 控制层
*
* @author qsk
* @email 1150024214@qq.com
* @date 2021-01-12 18:38:25
*/
@Controller
@RequestMapping(value = "/word")
public class WordController {
final static String TEST_WORD_FTL="templates/word.ftl";
/**
* 提交表单,下载Word文件
* @param request
* @param response
* @return
* @throws Exception
*/
@PostMapping("/export")
public String a( HttpServletRequest request, HttpServletResponse response) throws Exception {
WordUtil u = new WordUtil();
Map<String, Object> dataMap =new HashMap<String,Object>();
dataMap.put("name","老李");
u.exportToWord(dataMap,TEST_WORD_FTL,request,response);
return "";
}
}
总结:首先要把模板建立好,建立好之后,将工具类和controller复制进去即可