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,用来测试

 

然后通过Postman模拟发送请求

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

 

返回值如下:

由于我读了两次都放在同一个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打开,自带翻译功能

 

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

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

-> 加入科技玩家交流群组:点击加入 <-
注意:
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

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

    学习一下

  2. LAzySleep

    又学习到了,写的非常好😁

  3. Atlantis

    干活,学习了!

  4. 小牛牛

    好方法。

  5. 萝卜头

    谢谢分享,学习了

  6. seatom

    又学习到了,写的非常好😁

  7. nightmare

    学习了

  8. guo

    学习了

  9. 幻影骑士

    学习下

  10.  22333

    学习学习

  11. seatom

    感谢分享,谢谢楼主,赞

  12. LAzySleep

    继续加油哦,争取发表更多优秀帖子

  13. 这把看我表演

    谢谢分享,学习了

  14. 听书人

    感谢大佬的教程

  15. 萝卜头

    谢谢,分享学习了

  16. 为威哥神

    又学习了😁

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