1、首先引入maven坐标
<!--引入freemarker 模板依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
2、接口代码
@PostMapping(path = "/exportTotalEvaReportWord")
public ResultEntity exportTotalEvaReportWord(@RequestParam(name = "eventId") String id, HttpServletResponse response, HttpServletRequest request)throws Exception {
service.exportTotalEvaReportWord(id,response,request);
return ResultUtils.success();
}
public void exportTotalEvaReportWord(String id, HttpServletResponse response, HttpServletRequest request) throws Exception {
TotalEvaReportVo reportVo = totalClient.findTotalEvaReport(id);;
if (null != reportVo) {
Map<String, Object> dataMap = new HashMap<String, Object>();
dataMap.put("eventName",reportVo.getEventName());
dataMap.put("overallEva",reportVo.getOverallEva());
dataMap.put("evaScoreList",evaScore);
//template.ftl
String templateName = TotalEvaGlobal.EXPORT_TOTAL_EVA_TEMPLATE;
//template
String fileName = TotalEvaGlobal.EXPORT_TOTAL_EVA_FILENAME;
this.createDoc(dataMap,templateName,fileName,response,request);
}
}
/**
* 导出word
* @param dataMap 数据集
* @param templateName 模板名称
* @param fileName 导出的文件名
* @param response
* @param request
*/
private void createDoc(Map dataMap, String templateName, String fileName, HttpServletResponse response,
HttpServletRequest request) throws IOException, TemplateException {
String templatePath = "templates" + File.separator + templateName;
ClassPathResource classPathResource = new ClassPathResource(templatePath);
// 将模板文件拷贝到临时文件夹
InputStream templateStream = classPathResource.getInputStream();
String templatePrefix = "template-";
File templateFile = File.createTempFile(templatePrefix, templateName);
try {
FileUtils.copyInputStreamToFile(templateStream, templateFile);
} finally {
IOUtils.closeQuietly(templateStream);
}
// freemarker 模板文件夹设置
Configuration cfg = new Configuration(Configuration.DEFAULT_INCOMPATIBLE_IMPROVEMENTS);
cfg.setDefaultEncoding("utf-8");
cfg.setOutputEncoding("utf-8");
cfg.setDirectoryForTemplateLoading(new File(templateFile.getParent()));
// 临时文件,生成 word 文档
File outFile = File.createTempFile("doc-" + fileName, ".doc");
FileOutputStream fileOutputStream = new FileOutputStream(outFile);
// 将模板和数据模型合并生成文件
Writer writer = new BufferedWriter(new OutputStreamWriter(fileOutputStream, StandardCharsets.UTF_8));
// 生成文件
Template template = cfg.getTemplate(templateFile.getName());
template.process(dataMap, writer);
// 关闭流
writer.flush();
writer.close();
fileOutputStream.flush();
fileOutputStream.close();
// 文件写入输出流
byte[] bFile = Files.readAllBytes(outFile.toPath());
OutputStream out = response.getOutputStream();
fileName = getFileName(fileName, request);
response.setHeader("Content-Disposition", "attachment; filename=" + fileName + ".doc");
response.setContentType("application/octet-stream;charset=UTF-8");
out.write(bFile);
out.flush();
out.close();
outFile.deleteOnExit();
}
/**
* 对文件名进行转码
* @param fileName
* @param request
* @return
*/
private String getFileName(String fileName, HttpServletRequest request) {
String header = request.getHeader("User-Agent");
try {
if (header.toLowerCase().indexOf("firefox") > 0) {
fileName = new String(fileName.getBytes(StandardCharsets.ISO_8859_1), "ISO8859-1");
} else if (header.toUpperCase().indexOf("MSIE") > 0) {
fileName = URLEncoder.encode(fileName, "UTF-8");
} else {
fileName = URLEncoder.encode(fileName, "UTF-8");
}
} catch (UnsupportedEncodingException e) {
log.debug("文件名转码失败!", e);
}
return fileName;
}
3、freemarker模板
截图截取的是有效部分,及供参考。