SpringBoot集成EasyExcel实现Excel下载

SpringBoot集成EasyExcel实现Excel下载

一、背景

为什么会用Easyexcel来做Excel下载

项目中的Excel导入功能刚做好,领导又来了:这次要导出功能。我导入才刚整明白呢,你又来了。但是没有办法,领导才是衣食父母嘛,只有干了。

阿里巴巴语雀团队对EasyExcel是这样介绍的
Java解析、生成Excel比较有名的框架有Apache poi、jxl。但他们都存在一个严重的问题就是非常的耗内存,
poi有一套SAX模式的API可以一定程度的解决一些内存溢出的问题,但POI还是有一些缺陷,比如07版Excel解
压缩以及解压后存储都是在内存中完成的,内存消耗依然很大。easyexcel重写了poi对07版Excel的解析,能
够原本一个3M的excel用POI sax依然需要100M左右内存降低到几M,并且再大的excel不会出现内存溢出,03
版依赖POI的sax模式。在上层做了模型转换的封装,让使用者更加简单方便。
当然还有急速模式能更快,但是内存占用会在100M多一点。
  • 这篇文章很多地方都与上传的文章相同,只是controller有所变动,因为是同一个框架嘛。

二、集成EasyExcel

1、 在pom.xml中添加EasyExcel依赖
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>easyexcel</artifactId>
            <version>2.1.3</version>
        </dependency>
2、创建EasyExcel映射实体类
import com.alibaba.excel.annotation.ExcelProperty;

public class ExcelEntity {
    // ExcelProperty中的参数要对应Excel中的标题
    @ExcelProperty("ID")
    private int ID;

    @ExcelProperty("NAME")
    private String name;

    @ExcelProperty("AGE")
    private int age;

    public ExcelEntity() {
    }

    public ExcelEntity(int ID, String name, int age) {
        this.ID = ID;
        this.name = name;
        this.age = age;
    }

    public int getID() {
        return ID;
    }

    public void setID(int ID) {
        this.ID = ID;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}
3、创建controller
  • 这里必须设置setContentType以及setHeader两个东西,否则下载出来的文件会有问题。
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelReader;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

@RestController
@CrossOrigin
@RequestMapping("/loggerItem")
public class LoggerItemController {


    @GetMapping("/download")
    public void downLoad(HttpServletResponse response){
//        设置响应类型为excel
        response.setContentType("application/vnd.ms-excel");
        /*
         * 设置响应头以及文件名称
         *      Content-disposition 是 MIME 协议的扩展,MIME 协议指示 MIME 用户代理如何显示附加的文件。
         *      浏览器接收到头时,它会激活文件下载对话框
         *      attachment 附件
         *      filename 附件名
         */
        response.setHeader("Content-Disposition", "attachment;filename=aaa.xlsx");

        try {
//            从HttpServletResponse中获取OutputStream输出流
            ServletOutputStream outputStream = response.getOutputStream();
            /*
             * EasyExcel 有多个不同的read方法,适用于多种需求
             * 这里调用EasyExcel中通过OutputStream流方式输出Excel的write方法
             * 它会返回一个ExcelWriterBuilder类型的返回值
             * ExcelWriterBuilde中有一个doWrite方法,会输出数据到设置的Sheet中
             */
            EasyExcel.write(outputStream,ExcelEntity.class).sheet("测试数据").doWrite(UploadExcelListener.list);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
5、application.yml配置

这里的文件上传大小,如果单做导出的话可以不用配,由于我这里需要上传数据进行测试,所以进行了配置

server:
  # 指定端口号
  port: 8080
spring:
  servlet:
    multipart:
      # 配置单个上传文件大小
      file-size-threshold: 100Mb
      # 配置总上传大小
      max-request-size: 300Mb
6、测试

我们先搞一个简单的Excel,上传上去用来测试

在这里插入图片描述

然后通过Postman模拟发送上传请求,上传测试文件

  • 选择Post请求并输入请求地址
  • 在下面选择Body
  • Key的框中输入controller中的请求的方法中的参数,后面的下拉框中选择File
  • VALUE框中有一个Select File ,点击后选择自己刚才创建的测试的Excel
  • 最后点击Send发送请求

在这里插入图片描述

然后在浏览器中发送下载请求

在这里插入图片描述

在这里插入图片描述

成功下载

三、EasyExcel中的write方法汇总

    /**
     * Build excel the write
     *
     * @return
     */
    public static ExcelWriterBuilder write() {
        return new ExcelWriterBuilder();
    }

    /**
     * Build excel the write
     *
     * @param file
     *            File to write
     * @return Excel writer builder
     */
    public static ExcelWriterBuilder write(File file) {
        return write(file, null);
    }

    /**
     * Build excel the write
     *
     * @param file
     *            File to write
     * @param head
     *            Annotate the class for configuration information
     * @return Excel writer builder
     */
    public static ExcelWriterBuilder write(File file, Class head) {
        ExcelWriterBuilder excelWriterBuilder = new ExcelWriterBuilder();
        excelWriterBuilder.file(file);
        if (head != null) {
            excelWriterBuilder.head(head);
        }
        return excelWriterBuilder;
    }

    /**
     * Build excel the write
     *
     * @param pathName
     *            File path to write
     * @return Excel writer builder
     */
    public static ExcelWriterBuilder write(String pathName) {
        return write(pathName, null);
    }

    /**
     * Build excel the write
     *
     * @param pathName
     *            File path to write
     * @param head
     *            Annotate the class for configuration information
     * @return Excel writer builder
     */
    public static ExcelWriterBuilder write(String pathName, Class head) {
        ExcelWriterBuilder excelWriterBuilder = new ExcelWriterBuilder();
        excelWriterBuilder.file(pathName);
        if (head != null) {
            excelWriterBuilder.head(head);
        }
        return excelWriterBuilder;
    }

    /**
     * Build excel the write
     *
     * @param outputStream
     *            Output stream to write
     * @return Excel writer builder
     */
    public static ExcelWriterBuilder write(OutputStream outputStream) {
        return write(outputStream, null);
    }

    /**
     * Build excel the write
     *
     * @param outputStream
     *            Output stream to write
     * @param head
     *            Annotate the class for configuration information.
     * @return Excel writer builder
     */
    public static ExcelWriterBuilder write(OutputStream outputStream, Class head) {
        ExcelWriterBuilder excelWriterBuilder = new ExcelWriterBuilder();
        excelWriterBuilder.file(outputStream);
        if (head != null) {
            excelWriterBuilder.head(head);
        }
        return excelWriterBuilder;
    }

所有的方法都在这儿了,其实如果看不懂到底应该调用哪一个write方法的话,可以以根据自己所能得到的参数来判断。

四、扩展

  • 导出到本地Excel
 public static void main(String[] args) {
     EasyExcel.write("C:/Users/Lonely Programmer/Desktop/输出文件名.xlsx"
             ,ExcelEntity.class)
             .sheet("测试数据")
             .doWrite(UploadExcelListener.list);
 }

输出本地的Excel和通过OutputStream流输出的方式是一样的,只是参数变了,原本传的是OutputStream流,现在传的是文件的绝对路径。

最后欢迎大家进群交流:251199521

平时上班比较忙,所以一般更新也不会很快,操作过程中如果遇到什么问题,可以群内提问,我看到了的话,有时间基本上都会回复的。

其实百度才是最好的老师。

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值