java使用easypoi模版导出word详细步骤

文章目录

第一步、引入pom依赖

xml 复制代码
<dependency>
     <groupId>cn.afterturn</groupId>
     <artifactId>easypoi-spring-boot-starter</artifactId>
     <version>4.4.0</version>
</dependency>

第二步、新建导出工具类WordUtil

java 复制代码
import cn.afterturn.easypoi.word.WordExportUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.springframework.stereotype.Component;
import org.springframework.util.Assert;

import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URLEncoder;
import java.util.Map;

@Component
@Slf4j
public class WordUtil {

    /**
     * 导出word
     * 模版变量中变量格式:{{a}}
     *
     * @param templatePath word模板地址
     * @param fileName     文件名
     * @param params       替换的参数
     * @param response     响应头
     * 
     */
    public static void exportWord(String templatePath, String fileName, Map<String, Object> params, HttpServletResponse response) {
        Assert.notNull(templatePath, "模板路径不能为空");
        Assert.notNull(fileName, "导出文件名不能为空");
        Assert.isTrue(fileName.endsWith(".docx"), "word导出请使用docx格式");

        try {
            XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params);
            //设置响应体内容类型
            response.setContentType("application/octet-stream");
            //添加响应头
            response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));
            //暴露新添加的响应头
            response.setHeader("Access-Control-Expose-Headers", "Content-Disposition");
            //将word文档流输出到输出流中
            doc.write(response.getOutputStream());
            //关闭流
            doc.close();
        } catch (Exception e) {
            log.error("exportWord方法出现问题", e);
            e.printStackTrace();
        }
    }

}

第三步、创建模版word

在静态资源目录下resources/static/templates新建exportWord.docx,编写以下模版内容:

4.编写接口代码

java 复制代码
    @GetMapping("/exportWord")
    public void exportWord(HttpServletResponse response) throws FileNotFoundException {
        //存放数据,也就是填充在word里面的值
        Map<String, Object> params = new HashMap<>();
        params.put("ceshi","测试使用easypoi模版导出word");
        params.put("name","张三");
        params.put("text","知之为知之不知为不知");

        //模板路径
        // String templatePath = "E:\\demo\\word.docx";
        // 或模板在静态资源的相对路径
        File rootFile = new File((ResourceUtils.getURL("classpath:").getPath()));
        File templateFile = new File(rootFile, "/static/templates/exportWord.docx");
        //jar包获取不到文件路径
        //URLDecoder.decode() 解决获取中文名称文件路径乱码
        String templatePath = URLDecoder.decode(templateFile.getPath());
        //生成文件名
        String fileName = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()) + "_" + System.currentTimeMillis() + ".docx";
        // 导出wold
        try {
            // 导出Word文档为文件
           WordUtil.exportWord(templatePath, fileName, params,response);
            // 将导出的Word文件转换为流
        } catch (Exception e) {
            System.out.println("导出Word文档时出现异常:" + e.getMessage());
        }
    }

5.导出结果示例

通过浏览器访问接口:http://localhost:8080//exportWord,导出word内容如下

相关推荐
二月夜6 小时前
剖析Java正则表达式回溯问题
java·正则表达式
xuhaoyu_cpp_java6 小时前
项目学习(三)分页查询
java·经验分享·笔记·学习
想吃火锅10056 小时前
【leetcode】405.数字转换为十六进制数js
开发语言·javascript·ecmascript
程序员二叉7 小时前
【Java】集合面试全套精讲|HashMap/ArrayList高频考点完整版
java·面试·哈希算法
专注VB编程开发20年7 小时前
AI 生成C# WinForm 窗体 = 目前就是垃圾
开发语言·人工智能·c#
cfm_29147 小时前
JVM GC垃圾回收初步了解
java·开发语言·jvm
心之伊始7 小时前
LangChain4j RAG 实战:Java 后端如何把本地文档接入 Embedding 检索链路
java·架构·源码分析·csdn
~小先生~7 小时前
Python从入门到放弃(一)
开发语言·python
许彰午8 小时前
17_synchronized关键字深度解析
java·开发语言
z落落8 小时前
C# 泛型接口和泛型类+泛型约束
开发语言·c#