Spring Boot+EasyExcel实现Excel文件

问题

最近遇到一个问题,Excel文件下载,本来是很简单的,结果下载后一直提示下面的信息

搞了两天,查了好多资料,都没解决,最后发现是参数问题,是参数问题

有问题版本

引用

pom文件引用对应jar包

复制代码
<dependency>
     <groupId>com.alibaba</groupId>
     <artifactId>easyexcel</artifactId>
     <version>3.1.1</version>
</dependency>

实现代码

复制代码
@GetMapping("/EasyExcel")
    public void EasyExcel(@Valid @RequestBody TestTaskInfoSceneQueryReqVo vo ,HttpServletResponse response) throws IOException {

        // 1. 生成数据
        List<User> users = new ArrayList<>();
        users.add(new User(1, "张三", 25, "zhangsan@test.com"));
        users.add(new User(2, "李四", 30, "lisi@test.com"));
        users.add(new User(3, "王五", 28, "wangwu@test.com"));

        response.addHeader("Content-Disposition", "attachment;filename=" + "huyuqiao.xlsx");
        response.setContentType("application/vnd.ms-excel;charset=gb2312");
        try {
//            从HttpServletResponse中获取OutputStream输出流
            ServletOutputStream outputStream = response.getOutputStream();
            /*
             * EasyExcel 有多个不同的read方法,适用于多种需求
             * 这里调用EasyExcel中通过OutputStream流方式输出Excel的write方法
             * 它会返回一个ExcelWriterBuilder类型的返回值
             * ExcelWriterBuilde中有一个doWrite方法,会输出数据到设置的Sheet中
             */
            EasyExcel.write(outputStream, User.class).sheet("测试数据").doWrite(users);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

问题说明

主要问题就是使用了@Valid @RequestBody TestTaskInfoSceneQueryReqVo vo 参数,这个会改变response流,影响下载结果。

可以改为下面的方式。

正常版本

引用

pom引用保持不变

实现代码

复制代码
@PostMapping("/EasyExcel")
    @Operation(summary = "测试任务下载接口")
    public void download(@RequestParam(required = false) Integer taskType,
                         @RequestParam(required = false) String station,
                         @RequestParam(required = false) @DateTimeFormat(pattern = "yyyy-MM-dd") Date startDate,
                         @RequestParam(required = false) @DateTimeFormat(pattern = "yyyy-MM-dd") Date endDate,HttpServletResponse response) throws IOException {
        // 1. 生成数据
        List<User> users = new ArrayList<>();
        users.add(new User(1, "张三", 25, "zhangsan@test.com"));
        users.add(new User(2, "李四", 30, "lisi@test.com"));
        users.add(new User(3, "王五", 28, "wangwu@test.com"));

        response.addHeader("Content-Disposition", "attachment;filename=" + "huyuqiao.xlsx");
        response.setContentType("application/vnd.ms-excel;charset=gb2312");
        try {
//            从HttpServletResponse中获取OutputStream输出流
            ServletOutputStream outputStream = response.getOutputStream();
            /*
             * EasyExcel 有多个不同的read方法,适用于多种需求
             * 这里调用EasyExcel中通过OutputStream流方式输出Excel的write方法
             * 它会返回一个ExcelWriterBuilder类型的返回值
             * ExcelWriterBuilde中有一个doWrite方法,会输出数据到设置的Sheet中
             */
            EasyExcel.write(outputStream, User.class).sheet("测试数据").doWrite(users);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

各位小伙伴有好的方法,可以评论区留言。

相关推荐
嘻哈∠※12 分钟前
0061基于 SpringBoot 的投稿与稿件处理系统设计与实现
java·spring boot·后端
白狐_7981 小时前
408数据结构第8章:排序②——性质对比秒杀、场景选择与外部排序
java·数据结构·算法
zander2582 小时前
LeetCode 84:柱状图中的最大矩形——单调栈如何确定左右边界
java·数据结构·算法
码匠许师傅2 小时前
【C++ 面试真题】聊聊 C++ 的拷贝构造与拷贝赋值
java·c++·面试
极创信息3 小时前
系统安全隐患全方位排查方案:标准化渗透测试全流程
java·opencv·struts·数据挖掘·eclipse·语音识别·hibernate
汉字萌萌哒4 小时前
2019CCF-CSP入门级C++试题解析
java·开发语言·c++
喜欢的名字被抢了4 小时前
程序出问题怎么查,以及如何让它不掉线
java·运维·数据库
数据知道5 小时前
反序列化漏洞:Java、PHP、Python 三条线各讲透
java·网络·python·安全·网络安全·php
2601_949950635 小时前
Java 面试准备,用练题簿把“背过八股”变成“真正会答”
java·开发语言·面试·刷题·小程序推荐
Rain的Java大神之路6 小时前
MQ重复消费问题怎么解决
java·经验分享·后端·面试·架构·rabbitmq·rocketmq