Java使用freemarker动态导出word

编程入门 行业动态 更新时间:2024-10-07 19:21:48

Java使用freemarker<a href=https://www.elefans.com/category/jswz/34/1771299.html style=动态导出word"/>

Java使用freemarker动态导出word

Java使用freemarker动态导出word

适用于Java项目导出word文件,通过freemarker模板引擎动态填充word模板并导出。

1. 所需依赖

<dependency><groupId>org.freemarker</groupId><artifactId>freemarker</artifactId><version>2.3.13</version>
</dependency>

2. word模板

模板位置放在resource/ftl下面

<html>
<head><title>Welcome!</title>
</head>
<body>
<h1>Welcome ${user}!</h1>
<p>Your Blog Site:<a href="${blog.url}">${blog.name}</a>!<table border="1"><tr><#list headers as header><th>${header}</th></#list></tr><#list fansList as fans><tr><td>${fans.name}</td><td>${fans.gender}</td><td>${fans.age}</td></tr></#list>
</table>
</body></html>

3. 工具类

import freemarker.template.Configuration;
import freemarker.template.Template;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;import java.io.*;
import java.nio.charset.StandardCharsets;
import java.util.Map;/*** @author zxg* @date Created in 2022/02/08 17:19* Description 文档导出工具类*/
@Component
@Slf4j
public class DocumentHandler {public  void createDoc(Map<String,Object> dataMap, String fileName)  {Configuration configuration = new Configuration();configuration.setDefaultEncoding("UTF-8");//dataMap 要填入模本的数据文件//这里我们的模板是放在/resource/ftl包下面configuration.setClassForTemplateLoading(this.getClass(), "/ftl");Template t=null;try {//test.ftl为要装载的模板t = configuration.getTemplate("test.ftl");} catch (IOException e) {log.error("load template error, err: <{}>",e.getMessage(),e);}//输出文档路径及名称File outFile = new File(fileName);Writer out = null;try(FileOutputStream fos = new FileOutputStream(outFile)) {OutputStreamWriter oWriter = new OutputStreamWriter(fos, StandardCharsets.UTF_8);out = new BufferedWriter(oWriter);t.process(dataMap, out);} catch (Exception  e) {log.error("export word error,err: <{}>",e.getMessage(),e);}try {if(out!=null){out.close();}} catch (IOException e) {log.error("error: {}",e.getMessage(),e);}}
}

业务代码

@RestController
@RequestMapping("/export")
public class ExportController {@Autowiredprivate ExportService exportService;@PostMapping("/word")public void auditReport(HttpServletResponse response) {exportService.exportAuditReport(response);}
}
import com.study.exportword.util.DocumentHandler;
import lombok.Builder;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.assertj.core.util.Lists;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Service;import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.URLEncoder;
import java.util.HashMap;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;/*** @author zxg* @date Created in 2022/02/08 17:16* Description 导出word文件*/
@Service
@Slf4j
public class ExportService {@Data@Builderpublic static class User {private String name;private String gender;private int age;}@Autowiredprivate DocumentHandler documentHandler;public void exportAuditReport(HttpServletResponse response) {// dataMap未模板填充的数据HashMap<String, Object> dataMap = new HashMap<>();generateDataMap(dataMap);String tmpFile = "C:\\Users\\lenovo\\Desktop\\test.docx";documentHandler.createDoc(dataMap, tmpFile);File file = new File(tmpFile);//文件名编码String fileName = file.getName();log.info("download file: {}", fileName);try {fileName = URLEncoder.encode(fileName, "UTF-8");} catch (UnsupportedEncodingException e) {log.error("file download error, error msg <{}>", e.getMessage(), e);}//输出流try (FileInputStream fis = new FileInputStream(file);BufferedInputStream bis = new BufferedInputStream(fis);OutputStream os = response.getOutputStream()) {response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);response.setHeader(HttpHeaders.ACCESS_CONTROL_EXPOSE_HEADERS, HttpHeaders.CONTENT_DISPOSITION);response.setHeader(HttpHeaders.CONTENT_DISPOSITION, "attachment;filename=" + fileName);byte[] buffer = new byte[1024];int i = bis.read(buffer);while (i != -1) {os.write(buffer);i = bis.read(buffer);}} catch (Exception e) {log.error("file download error, error msg <{}>", e.getMessage(), e);}}private void generateDataMap(HashMap<String, Object> dataMap) {dataMap.put("user", "admin");HashMap<String, String> blog = new HashMap<>();blog.put("url","");blog.put("name","admin的博客");dataMap.put("blog", blog);dataMap.put("headers", Lists.newArrayList("粉丝姓名", "性别", "年龄"));List<User> fansList = Stream.of(User.builder().name("张三").gender("男").age(20).build(),User.builder().name("李四").gender("女").age(21).build(),User.builder().name("王五").gender("男").age(24).build()).collect(Collectors.toList());dataMap.put("fansList",fansList);}
}

4. 运行结果

更多推荐

Java使用freemarker动态导出word

本文发布于:2024-03-23 15:09:21,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1739608.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:动态   Java   freemarker   word

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!