Spring Boot集成EasyExcel实现excel导入导出操作

这篇具有很好参考价值的文章主要介绍了Spring Boot集成EasyExcel实现excel导入导出操作。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


Easy Excel 官网

Spring Boot集成EasyExcel实现excel导入导出操作

0 简要说明

Java解析、生成Excel比较有名的框架有Apache poi、jxl。但他们都存在一个严重的问题就是非常的耗内存,poi有一套SAX模式的API可以一定程度的解决一些内存溢出的问题,但POI还是有一些缺陷,比如07版Excel解压缩以及解压后存储都是在内存中完成的,内存消耗依然很大。
easyexcel重写了poi对07版Excel的解析,一个3M的excel用POI sax解析依然需要100M左右内存,改用easyexcel可以降低到几M,并且再大的excel也不会出现内存溢出;03版依赖POI的sax模式,在上层做了模型转换的封装,让使用者更加简单方便。

Spring Boot集成EasyExcel实现excel导入导出操作,问题汇总,spring boot,excel,后端

简单使用

引入依赖

        <!--easyexcel-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>easyexcel</artifactId>
            <version>3.1.1</version>
        </dependency>

读操作

excel源文件

Spring Boot集成EasyExcel实现excel导入导出操作,问题汇总,spring boot,excel,后端

实体类

@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class TempData {

    private Long id;

    /**
     * 用户名
     */

    private String userName;
    /**
     * 生日
     */

    private Date birthday;
    /**
     * 性别
     */

    private String sex;
    /**
     * 地址
     */

    private String address;

}
监听器

Spring Boot集成EasyExcel实现excel导入导出操作,问题汇总,spring boot,excel,后端

// 有个很重要的点 DemoDataListener 不能被spring管理,要每次读取excel都要new,然后里面用到spring可以构造方法传进去

package com.geekmice.springbootselfexercise;

import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.read.listener.ReadListener;
import com.alibaba.excel.util.ListUtils;
import com.alibaba.fastjson.JSON;
import com.geekmice.springbootselfexercise.dao.UserDao;
import com.geekmice.springbootselfexercise.domain.TempData;
import com.geekmice.springbootselfexercise.service.UserService;
import lombok.extern.slf4j.Slf4j;

import java.util.List;

/**
 * @BelongsProject: spring-boot-self-exercise
 * @BelongsPackage: com.geekmice.springbootselfexercise
 * @Author: pingmingbo
 * @CreateTime: 2023-08-07  10:19
 * @Description: easyexcel读操作监听器
 * @Version: 1.0
 */
@Slf4j
public class UserListener  implements ReadListener<TempData> {
    /**
     * 每隔5条存储数据库,实际使用中可以100条,然后清理list ,方便内存回收
     */
    private static final int BATCH_COUNT = 100;
    /**
     * 缓存的数据
     */
    private List<TempData> cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);
    /**
     * 假设这个是一个DAO,当然有业务逻辑这个也可以是一个service。当然如果不用存储这个对象没用。
     */
    private UserService userService;

    /**
     * 如果使用了spring,请使用这个构造方法。每次创建Listener的时候需要把spring管理的类传进来
     *
     * @param demoDAO
     */
    public UserListener(UserService userService) {
        this.userService = userService;
    }

    /**
     * 这个每一条数据解析都会来调用
     *
     * @param data    one row value. Is is same as {@link AnalysisContext#readRowHolder()}
     * @param context
     */
    @Override
    public void invoke(TempData data, AnalysisContext context) {
        log.info("解析到一条数据:{}", JSON.toJSONString(data));
        cachedDataList.add(data);
        // 达到BATCH_COUNT了,需要去存储一次数据库,防止数据几万条数据在内存,容易OOM
        if (cachedDataList.size() >= BATCH_COUNT) {
            saveData();
            // 存储完成清理 list
            cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);
        }
    }

    /**
     * 所有数据解析完成了 都会来调用
     *
     * @param context
     */
    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {
        // 这里也要保存数据,确保最后遗留的数据也存储到数据库
        saveData();
        log.info("所有数据解析完成!");
    }

    /**
     * 加上存储数据库
     */
    private void saveData() {
        log.info("{}条数据,开始存储数据库!", cachedDataList.size());
        // this.s(cachedDataList);
        // userService.saveBatch(cachedDataList);
        log.info("存储数据库成功!");
    }
}
业务代码

//userService业务service,也可以是dao,如果是多个mapper或者service,通过构造方法或者set方法传递
也可以使用工具类getBean获取,不需要通过构造方法,这种方式主要是多个mapper或者service进行业务操作

  @Override
    public void uploadFileByEasyExcel(MultipartFile file) {
        try {
            EasyExcel.read(file.getInputStream(), TempData.class, new UserListener(userService)).sheet().doRead();
        } catch (IOException e) {
            log.error("error msg 【{}】", e);
            throw new IllegalArgumentException(e);
        }
    }

写操作

实体类
名称 默认值 备注
value 用于匹配excel中的头,必须全匹配,如果有多行头,会匹配最后一行头
order Integer.MAX_VALUE 优先级高于value,会根据order的顺序来匹配实体和excel中数据的顺序
index -1 优先级高于valueorder,会根据index直接指定到excel中具体的哪一列
converter 自动选择 指定当前字段用什么转换器,默认会自动选择。读的情况下只要实现com.alibaba.excel.converters.Converter#convertToJavaData(com.alibaba.excel.converters.ReadConverterContext<?>) 方法即可

ExcelIgnore

默认所有字段都会和excel去匹配,加了这个注解会忽略该字段

ExcelIgnore

默认所有字段都会和excel去匹配,加了这个注解会忽略该字段

package com.geekmice.springbootselfexercise.domain;

import cn.afterturn.easypoi.excel.annotation.Excel;
import cn.afterturn.easypoi.excel.annotation.ExcelIgnore;
import com.alibaba.excel.annotation.ExcelProperty;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.Date;

/**
 * @BelongsProject: spring-boot-self-exercise
 * @BelongsPackage: com.geekmice.springbootselfexercise.domain
 * @Author: pingmingbo
 * @CreateTime: 2023-08-07  09:53
 * @Description: TODO
 * @Version: 1.0
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class TempData {
    /**
     * 忽略这个字段
     */
    @ExcelIgnore
    private Long id;

    /**
     * 用户名
     */
    @ExcelProperty(value = "用户名")
    private String userName;
    /**
     * 生日
     */
    @ExcelProperty(value ="生日",format = "yyyy-MM-dd")
    private Date birthday;
    /**
     * 性别
     */
    @ExcelProperty(value ="性别")
    private String sex;
    /**
     * 地址
     */
    @ExcelProperty(value = "地址")
    private String address;

}
excel示例

Spring Boot集成EasyExcel实现excel导入导出操作,问题汇总,spring boot,excel,后端

业务代码
    @Override
    public void downloadFileByEasyExcel() {
         EasyExcel.write("D:\\easyexcel.xls", TempData.class)
                 .sheet()
                 .doWrite(data());
                     }
根据参数指定列导出

Spring Boot集成EasyExcel实现excel导入导出操作,问题汇总,spring boot,excel,后端

    /**
     * 根据参数指定列导出
     */
    @Test
    public void t2(){
        List<String> list = new ArrayList(16);
        list.add("sex");
        list.add("userName");
        EasyExcel.write("D://easyexcel_by_columns.xlsx", TempData.class)
                .excludeColumnFieldNames(null)
                .sheet()
                .includeColumnFieldNames(list)
                .doWrite(data());
        log.info("导出结束 [{}]", DateFormatUtils.format(new Date(), DateUtils.DATE_FORMAT_19));
    }
指定哪几列导出

使用index属性,index=2空余出来,这样一来第二列为空
Spring Boot集成EasyExcel实现excel导入导出操作,问题汇总,spring boot,excel,后端
Spring Boot集成EasyExcel实现excel导入导出操作,问题汇总,spring boot,excel,后端

复杂头导出

Spring Boot集成EasyExcel实现excel导入导出操作,问题汇总,spring boot,excel,后端
Spring Boot集成EasyExcel实现excel导入导出操作,问题汇总,spring boot,excel,后端

    /**
     * 用户名
     */
    @ExcelProperty(value = {"父级","用户名"},index = 0)
    private String userName;
    /**
     * 生日
     */
    @ExcelProperty(value ={"父级","生日"},format = "yyyy-MM-dd",index = 1)
    private Date birthday;
    /**
     * 性别
     */
    @ExcelProperty(value ={"父级","性别"},index = 2)
    private String sex;
    /**
  List<String> list = new ArrayList(16);
        list.add("sex");
        list.add("userName");
        list.add("birthday");
        EasyExcel.write("D://easyexcel_by_columns.xlsx", TempData.class)
                .excludeColumnFieldNames(null)
                .sheet()
                .includeColumnFieldNames(list)
                .doWrite(data());
        log.info("导出结束 [{}]", DateFormatUtils.format(new Date(), DateUtils.DATE_FORMAT_19));

关于数值型,日期型,浮点型数据解决方案

Spring Boot集成EasyExcel实现excel导入导出操作,问题汇总,spring boot,excel,后端文章来源地址https://www.toymoban.com/news/detail-633948.html

实体类接收字符串获取
package com.geekmice.springbootselfexercise.domain;

import cn.afterturn.easypoi.excel.annotation.Excel;
import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.format.DateTimeFormat;
import com.alibaba.excel.annotation.format.NumberFormat;
import com.geekmice.springbootselfexercise.utils.CustomStringStringConverter;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.Date;

/**
 * @BelongsProject: spring-boot-self-exercise
 * @BelongsPackage: com.geekmice.springbootselfexercise.domain
 * @Author: pingmingbo
 * @CreateTime: 2023-08-07  14:04
 * @Description: TODO
 * @Version: 1.0
 */
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class ConverterData {
    /**
     * 生日
     */
    @ExcelProperty(value = "生日")
    private String birthday;
    /**
     * 性别
     */
    @ExcelProperty(value = "性别")
    private String sex;

    /**
     * 分数
     */
    @ExcelProperty(value = "分数")
    private String score;
}

到了这里,关于Spring Boot集成EasyExcel实现excel导入导出操作的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 使用Spring Boot和EasyExcel的导入导出

    在当今信息化社会,数据的导入和导出在各种业务场景中变得越来越重要。为了满足复杂的导入导出需求,结合Java编程语言、Spring Boot框架以及EasyExcel库,我们可以轻松地构建出强大而灵活的数据处理系统。本文将引导您通过一个案例学习如何使用这些工具,实现一个复杂的

    2024年02月14日
    浏览(28)
  • 使用EasyExcel实现Excel的导入导出

    在真实的开发者场景中,经常会使用excel作为数据的载体,进行数据导入和导出的操作,使用excel的导入和导出有很多种解决方案,本篇记录一下EasyExcel的使用。 EasyExcel是一个开源的项目,是阿里开发的。EasyExcel可以简化Excel表格的导入和导出操作,使用起来简单快捷,易上手

    2023年04月15日
    浏览(35)
  • EasyExcel实现Excel文件导入导出功能

    Java领域解析、生成Excel比较有名的框架有Apache poi、jxl等。但他们都存在一个严重的问题就是非常的耗内存。如果你的系统并发量不大的话可能还行,但是一旦并发上来后一定会OOM或者JVM频繁的full gc。 EasyExcel是阿里巴巴开源的一个excel处理框架,以使用简单、节省内存著称。

    2024年02月02日
    浏览(52)
  • 使用EasyExcel实现Excel表格的导入导出

    Java解析、生成Excel比较有名的框架有Apache poi、jxl。但他们都存在一个严重的问题就是非常的耗内存,poi有一套SAX模式的API可以一定程度的解决一些内存溢出的问题,但POI还是有一些缺陷,比如07版Excel解压缩以及解压后存储都是在内存中完成的,内存消耗依然很大。 easyexcel重

    2024年02月12日
    浏览(30)
  • springboot中使用EasyExcel实现Excel 导入导出

    EasyExcel 是一款基于 Java 的简单易用的 Excel 文件操作工具。它提供了丰富的 API,可以方便地读取、写入和操作 Excel 文件,支持常见的 Excel 操作,如读取/写入单元格数据、合并单元格、设置样式、处理大数据量等。EasyExcel能大大减少占用内存的主要原因是在解析Excel时没有将

    2024年02月12日
    浏览(55)
  • 使用POI和EasyExcel来实现excel文件的导入导出

    废话不多说咱们直接上干货!!!! 一.读取Excel表格 【1】使用POI读取excel表格中的数据 POI还可以操作我们这个word文档等等,他不仅仅只能弄Excel,而JXI只能操作excel 1.POI的结构,我们可以更具文件的类去选择 相关的对象我当前是使用的XLSX来操作的 HSSF - 提供读写Microsoft

    2024年02月05日
    浏览(36)
  • SpringBoot 集成 EasyExcel 3.x 实现 Excel 导出

    目录   EasyExcel官方文档 EasyExcel是什么? EasyExcel注解  springboot集成EasyExcel 简单入门导出 : 实体类  自定义转换类 测试一下 复杂表头一对多导出 :   自定义注解 定义实体类 自定义单元格合并策略  测试一下     EasyExcel官方文档 EasyExcel官方文档 - 基于Java的Excel处理工具

    2024年02月13日
    浏览(39)
  • Spring boot easyexcel 实现复合数据导出、按模块导出

    场景: 导出数据为1对多的复合数据 一个模块是一条数据,直接填充数据无法实现 如图: 红框内为一条数据(1对多),下方箭头指向为第二条数据 如果直接填充,只能填充第一条,第二条就没办法了。 由于多行都包含许多,固定表头,只能走填充路线,怎么实现呢 实现思路

    2024年02月07日
    浏览(30)
  • Spring Boot 引入 easyexcel 最新版本 3.3.2,实现读写 Excel

    EasyExcel是一个基于Java的、快速、简洁、解决大文件内存溢出的Excel处理工具。 他能让你在不用考虑性能、内存的等因素的情况下,快速完成Excel的读、写等功能 在 Spring Boot 环境中使用 easyexcel,需要完成以下几个步骤 pom.xml中引入easyexcel的依赖,此处版本号3.3.2 建立一个实体

    2024年02月11日
    浏览(26)
  • SpringBoot整合EasyExcel,Excel导入导出就靠它了

    作者主页 :Designer 小郑 作者简介 :3年JAVA全栈开发经验,专注JAVA技术、系统定制、远程指导,致力于企业数字化转型,CSDN学院、蓝桥云课认证讲师。 主打方向 :Vue、SpringBoot、微信小程序 本文讲解了如何在SpringBoot项目中整合EasyExcel,实现Excel快捷导入导出,解析Excel导入导

    2024年02月16日
    浏览(21)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包