SpringBoot集成easyexcel实现动态模板导出

添加依赖

xml 复制代码
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>easyexcel</artifactId>
            <version>3.3.2</version>
        </dependency>
            
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>4.1.2</version>
        </dependency>

查看easyexcel 开发文档,定义excel动态模板

根据自己需求:

单属性用{} + 属性名填充,列表属性用{.} + 属性名填充

代码实战

导入请求,Controller层:

java 复制代码
    @GetMapping("/export")
    @ApiOperation("导出盘库范围")
    public void export(@ApiParam("盘库任务id") String id, HttpServletResponse response) {
        storeInventoryTaskService.export(id, response);
    }

业务实现,主要是查询需导出的数据比较简单:主要,使用map设置属性,map键值与excel中属性名对应上

java 复制代码
    public void export(String id, HttpServletResponse response) {
        StoreInventoryTaskDetailVo taskInfo = taskInfo(id);
        List<InventoryListVo> vos = rangeInfo(id);
        Map<String, Object> map = new HashMap<>();
        map.put("inventoryNo", taskInfo.getInventoryNo());
        map.put("storeName", taskInfo.getStoreName());
        map.put("startTime", DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS, taskInfo.getStartTime()));
        map.put("endTime", DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS, taskInfo.getEndTime()));
        // 自增序号
        AtomicInteger idx = new AtomicInteger();
        vos.forEach(el -> el.setIdx(idx.incrementAndGet()));
        map.put("list", vos);
        try {
            TemplateExcelUtil.downLoadExcel("盘库工单" + taskInfo.getInventoryNo(), "盘库工单模板.xlsx", map, response);
        } catch (Exception e) {
            throw new ServiceException("导出盘库工单报错");
        }
    }

核心类

TemplateExcelUtil.downLoadExcel

根据模板名称获取输入流,输出流也为固定套路,同时设置导出excel文件名,其余代码基本和官方文档保持一致即可

java 复制代码
@Slf4j
public class TemplateExcelUtil {

    /**
     * 根据模板导出数据
     *
     * @param fileName   导出文件名
     * @param sourcePath resource/template文件夹下路径
     */
    public static void downLoadExcel(String fileName, String sourcePath, Map<String, Object> beanParams, HttpServletResponse response)
            throws Exception {
        try (OutputStream os = getOutputStream(fileName, response);
             InputStream is = TemplateExcelUtil.class.getClassLoader().getResourceAsStream("template/" + sourcePath);
             ExcelWriter excelWriter = EasyExcel.write(os).withTemplate(is).build()) {

            WriteSheet writeSheet = EasyExcel.writerSheet().build();
            FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build();
            excelWriter.fill(beanParams.get("list"), fillConfig, writeSheet);
            excelWriter.fill(beanParams, writeSheet);

            // 关闭流
            excelWriter.finish();
        } catch (Exception e) {
            e.printStackTrace();
            throw e;
        }
    }

    /**
     * 导出文件时为Writer生成OutputStream.
     *
     * @param fileName 文件名
     * @param response response
     */
    private static OutputStream getOutputStream(String fileName,
                                                HttpServletResponse response) throws Exception {
        try {
            fileName = URLEncoder.encode(fileName, "UTF-8");
            response.setContentType("application/vnd.ms-excel");
            response.setCharacterEncoding("utf8");
            response.setHeader("Content-Disposition", "attachment; filename=" + fileName + ".xlsx");
            response.setHeader("Pragma", "public");
            response.setHeader("Cache-Control", "no-store");
            response.addHeader("Cache-Control", "max-age=0");
            return response.getOutputStream();
        } catch (IOException e) {
            throw new Exception("导出excel表格失败!", e);
        }
    }
}

经测试,导出效果如下:

相关推荐
短剑重铸之日4 分钟前
《设计模式》第十一篇:总结
java·后端·设计模式·总结
倒流时光三十年30 分钟前
SpringBoot 数据库同步 Elasticsearch 性能优化
数据库·spring boot·elasticsearch
码农小卡拉1 小时前
深入解析Spring Boot文件加载顺序与加载方式
java·数据库·spring boot
Dragon Wu1 小时前
Spring Security Oauth2.1 授权码模式实现前后端分离的方案
java·spring boot·后端·spring cloud·springboot·springcloud
一个有梦有戏的人1 小时前
Python3基础:进阶基础,筑牢编程底层能力
后端·python
爬山算法2 小时前
Hibernate(88)如何在负载测试中使用Hibernate?
java·后端·hibernate
独断万古他化2 小时前
【Spring 原理】Bean 的作用域与生命周期
java·后端·spring
我爱加班、、2 小时前
Websocket能携带token过去后端吗
前端·后端·websocket
一 乐3 小时前
校园二手交易|基于springboot + vue校园二手交易系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·后端
80530单词突击赢3 小时前
SpringBoot整合SpringMVC全解析
java·spring boot·后端