springboot使用freemarker导出word

springboot使用freemarker导出word

一、需求说明

需要达到如下效果:根据需求导出word文档,在模板中渲染不通的参数图片

二、制作模板文件

1.修改word留下占位符并另存为.xml文件

此处我的占位符为username

2.将xml文件后缀名改为.ftl

3.打开ftl文件格式化内容

格式化地址:http://www.bejson.com/otherformat/xmlsort

4.将占位符替换成变量

需要会使用freemarker语法

将占位符替换成freemarker变量

三、代码实现

1.引入依赖

自行更改自己的依赖版本

xml 复制代码
<!--freemarker使用start-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--freemarker使用end-->

2.将模板引入resource下

3.编写word导出工具包

java 复制代码
import freemarker.template.Configuration;
import freemarker.template.Template;
import lombok.extern.slf4j.Slf4j;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.util.Map;
import java.util.UUID;

/**
 * word导出工具
 */
@Slf4j
public class WordUtils {
    private static Configuration configuration = null;//配置

    private static  String templateFolder;

    static {
        templateFolder = WordUtils.class.getResource("/templates").getPath();
        configuration = new Configuration();
        configuration.setDefaultEncoding("utf-8");
        try {
            log.info("模板配置路径:" + templateFolder);
            configuration.setDirectoryForTemplateLoading(new File(templateFolder));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private WordUtils() {
        throw new AssertionError();
    }

    /**
     * 导出word
     *
     * @param request
     * @param response
     * @param map      参数
     * @param wordName 模板名,示例xxx.ftl
     * @param fileName 要到处的word文件名称,示例:test.doc
     * @throws IOException
     */
    public static void exportMillCertificateWord(HttpServletRequest request, HttpServletResponse response, Map map, String wordName, String fileName) throws IOException {
        Template freemarkerTemplate = configuration.getTemplate(wordName);
        File file = null;
        InputStream fin = null;
        ServletOutputStream out = null;
        String uuName=UUID.randomUUID().toString();
        try {
            // 调用createDoc方法生成Word文档
            file = createDoc(map, freemarkerTemplate, uuName);
            fin = new FileInputStream(file);
            response.setCharacterEncoding("utf-8");
            response.setContentType("application/x-download");
            fileName = new String(fileName.getBytes(), "ISO-8859-1");
            response.setHeader("Content-Disposition", "attachment;filename=".concat(String.valueOf(fileName)));
            out = response.getOutputStream();
            byte[] buffer = new byte[512];// 缓冲区
            int bytesToRead = -1;
            // 通过循环将读入的Word文件的内容输出到浏览器中
            while ((bytesToRead = fin.read(buffer)) != -1) {
                out.write(buffer, 0, bytesToRead);
            }
        } finally {
            if (fin != null) fin.close();
            if (out != null) out.close();
            if (file != null) file.delete();// 删除临时文件
        }
    }

    private static File createDoc(Map<?, ?> dataMap, Template template, String name) {
        File f = new File(name);
        Template t = template;
        try {
            //这个地方不能使用FileWriter因为需要指定编码类型否则生成的Word文档会因为有无法识别的编码而无法打开
            Writer w = new OutputStreamWriter(new FileOutputStream(f), "utf-8");
            t.process(dataMap, w);
            w.close();
        } catch (Exception ex) {
            ex.printStackTrace();
            throw new RuntimeException(ex);
        }
        return f;
    }
}

4.创建接口调用

bash 复制代码
/**
 * 打印导出
 * @param dclx 导出类型:zhdy桌号打印、dzddy对照单打印、zkzdy准考证打印
 */
@RequestMapping(value = "xxxxxForWord")
public void xxxxxForWord(HttpServletRequest request, HttpServletResponse response, HttpSession session) throws IOException {
		//封装word需要的数据
        Map<String, Object> map = new HashMap<>();
        map.put("teachers",list);
        //模板名
        String wordName="teacher.ftl";
        //导出文件名
        String fileName="invite_teacher_"+System.currentTimeMillis()+".doc";
        WordUtils.exportMillCertificateWord(request, response, map, wordName, fileName);
}
相关推荐
hello_simon1 小时前
【Word转PDF】在线Doc/Docx转换为PDF格式 免费在线转换 功能强大好用
职场和发展·pdf·word·学习方法·word转pdf·石墨文档·word转换
Asthenia04123 小时前
浏览器缓存机制深度解析:电商场景下的性能优化实践
后端
databook4 小时前
『Python底层原理』--Python对象系统探秘
后端·python
超爱吃士力架5 小时前
MySQL 中的回表是什么?
java·后端·面试
追逐时光者5 小时前
Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
后端·.net
典龙3306 小时前
如何使用springboot项目如何实现小程序里面商品的浏览记录功能案例
spring boot
苏三说技术6 小时前
10亿数据,如何迁移?
后端
bobz9656 小时前
openvpn 显示已经建立,但是 ping 不通
后端
customer087 小时前
【开源免费】基于SpringBoot+Vue.JS个人博客系统(JAVA毕业设计)
java·vue.js·spring boot·后端·开源
qq_459238497 小时前
SpringBoot整合Redis和Redision锁
spring boot·redis·后端