SpringBoot集成EasyExcel实现文件上传

一、背景

为什么会用Easyexcel来做Excel上传

平时项目中经常使用EasyExcel从本地读取Excel中的数据,还有一个前端页面对需要处理的数据进行一些配置(如:Excel所在的文件夹,Excel的文件名,以及Sheet列名、处理数据需要的某些参数),由于每次都是读取的本地的文件,我就在想,如果某一天需要通过前端上传excel给我,让我来进行处理我又应该怎么办呢?我怎么才能在尽量少修改代码的前提下实现这个功能呢(由于公司经常改需求,项目已经重新写了3次了)?后来查了很多资料,发现Excel可以使用InPutStream流来读取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多一点。

二、集成EasyExcel

6、测试

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

SpringBoot集成EasyExcel实现文件上传

 

然后通过Postman模拟发送请求

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

 

返回值如下:

由于我读了两次都放在同一个List中返回,所以返回值中有8个对象。

[
    {
        "name": "小黑",
        "age": 25,
        "id": 1
    },
    {
        "name": "小白",
        "age": 22,
        "id": 2
    },
    {
        "name": "小黄",
        "age": 22,
        "id": 3
    },
    {
        "name": "小绿",
        "age": 23,
        "id": 4
    },
    {
        "name": "小黑",
        "age": 25,
        "id": 1
    },
    {
        "name": "小白",
        "age": 22,
        "id": 2
    },
    {
        "name": "小黄",
        "age": 22,
        "id": 3
    },
    {
        "name": "小绿",
        "age": 23,
        "id": 4
    }
]

三、EasyExcel中的Read方法汇总

/**
     * Build excel the read
     *
     * @return Excel reader builder.
     */
    public static ExcelReaderBuilder read() {
        return new ExcelReaderBuilder();
    }
​
    /**
     * Build excel the read
     *
     * @param file
     *            File to read.
     * @return Excel reader builder.
     */
    public static ExcelReaderBuilder read(File file) {
        return read(file, null, null);
    }
​
    /**
     * Build excel the read
     *
     * @param file
     *            File to read.
     * @param readListener
     *            Read listener.
     * @return Excel reader builder.
     */
    public static ExcelReaderBuilder read(File file, ReadListener readListener) {
        return read(file, null, readListener);
    }
​
    /**
     * Build excel the read
     *
     * @param file
     *            File to read.
     * @param head
     *            Annotate the class for configuration information.
     * @param readListener
     *            Read listener.
     * @return Excel reader builder.
     */
    public static ExcelReaderBuilder read(File file, Class head, ReadListener readListener) {
        ExcelReaderBuilder excelReaderBuilder = new ExcelReaderBuilder();
        excelReaderBuilder.file(file);
        if (head != null) {
            excelReaderBuilder.head(head);
        }
        if (readListener != null) {
            excelReaderBuilder.registerReadListener(readListener);
        }
        return excelReaderBuilder;
    }
​
    /**
     * Build excel the read
     *
     * @param pathName
     *            File path to read.
     * @return Excel reader builder.
     */
    public static ExcelReaderBuilder read(String pathName) {
        return read(pathName, null, null);
    }
​
    /**
     * Build excel the read
     *
     * @param pathName
     *            File path to read.
     * @param readListener
     *            Read listener.
     * @return Excel reader builder.
     */
    public static ExcelReaderBuilder read(String pathName, ReadListener readListener) {
        return read(pathName, null, readListener);
    }
​
    /**
     * Build excel the read
     *
     * @param pathName
     *            File path to read.
     * @param head
     *            Annotate the class for configuration information.
     * @param readListener
     *            Read listener.
     * @return Excel reader builder.
     */
    public static ExcelReaderBuilder read(String pathName, Class head, ReadListener readListener) {
        ExcelReaderBuilder excelReaderBuilder = new ExcelReaderBuilder();
        excelReaderBuilder.file(pathName);
        if (head != null) {
            excelReaderBuilder.head(head);
        }
        if (readListener != null) {
            excelReaderBuilder.registerReadListener(readListener);
        }
        return excelReaderBuilder;
    }
​
    /**
     * Build excel the read
     *
     * @param inputStream
     *            Input stream to read.
     * @return Excel reader builder.
     */
    public static ExcelReaderBuilder read(InputStream inputStream) {
        return read(inputStream, null, null);
    }
​
    /**
     * Build excel the read
     *
     * @param inputStream
     *            Input stream to read.
     * @param readListener
     *            Read listener.
     * @return Excel reader builder.
     */
    public static ExcelReaderBuilder read(InputStream inputStream, ReadListener readListener) {
        return read(inputStream, null, readListener);
    }
​
    /**
     * Build excel the read
     *
     * @param inputStream
     *            Input stream to read.
     * @param head
     *            Annotate the class for configuration information.
     * @param readListener
     *            Read listener.
     * @return Excel reader builder.
     */
    public static ExcelReaderBuilder read(InputStream inputStream, Class head, ReadListener readListener) {
        ExcelReaderBuilder excelReaderBuilder = new ExcelReaderBuilder();
        excelReaderBuilder.file(inputStream);
        if (head != null) {
            excelReaderBuilder.head(head);
        }
        if (readListener != null) {
            excelReaderBuilder.registerReadListener(readListener);
        }
        return excelReaderBuilder;
    }

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

四、扩展

  • 读取本地Excel
    public static void main(String[] args) {
       EasyExcel.read("C:/Users/Lonely Programmer/Desktop/新建 Microsoft Excel 工作表.xlsx"
                      ,ExcelEntity.class
                      ,new UploadExcelListener())
          .doReadAll();
    }

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

  • MultipartFile文档

    MultipartFile文档地址:https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/multipart/MultipartFile.html

    翻译是通过Google Chrome自带翻译插件进行翻译的,建议大家使用Google Chrome打开,自带翻译功能

SpringBoot集成EasyExcel实现文件上传

 

平时上班比较忙,操作过程中如果遇到什么问题,可以评论提问,我看到了的话,有时间基本上都会回复的(前提是我会,哈哈哈)。

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

-> 加入科技玩家交流群组:点击加入 注意:
1.文中二维码和链接可能带有邀请性质,请各位玩家自行抉择。
2.请勿通过链接填写qq号与密码、银行卡号与密码等个人隐私信息。
3.禁止纯拉人头,拉app注册等信息,发现必小黑屋。
4.同一种信息仅发一次,多发会被删除。
5.文章中源码或APP等,无法保证其绝对安全,需自行辨别。
6.文章关联方不想展示也可以微信站长“socutesheep”删除。
本文由 @codebird 发布。如若转载,请注明出处: 科技玩家 » SpringBoot集成EasyExcel实现文件上传

给TA买糖
共{{data.count}}人
人已买糖
教程玩家投稿精选文章

手动抓包之写入青龙、boxjs

2021-12-5 12:16:41

教程玩家投稿精选文章

SpringBoot集成EasyExcel实现Excel下载

2021-12-5 14:55:44

56 条回复 A文章作者 M管理员
贴心提醒
请认真对待作者付出,勿发表无意义言论,触发过滤规则的评论将无法提交,包含敏感词的评论会自动变成待审核状态哦。
  1. 幻念

    感谢分享,插眼学习

  2. slimei

    谢谢大佬分享,谢谢!

  3. 七年

    辛苦了,学习一下

  4. slimei

    mark一下。

  5. slimei

    先看看,不明白的地方再问

  6. 七年

    真棒,感谢分享!

  7. 凉生

    感谢分享,插眼学习

  8. slimei

    真棒,感谢分享!

  9. 84896150

    这个好 给赞

  10. 老六

    收藏,有空细读

  11. 84896150

    很详细,支持一下

  12. 84896150

    真棒,感谢分享!

  13. 七年

    这真是个好文章,谢谢

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索