springboot使用EasyExcel导入数据

springboot使用EasyExcel导入数据

1. 引入依赖

<!-- Easy Excel -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>easyexcel</artifactId>
    <version>3.2.1</version>
</dependency>

2. 建立对应实体类

假如,我想要读取的excel数据如下所示

image-20231213140048360.png

那么我的实体类为

@Getter
@Setter
@ToString
public class UserInfoForExcel {
    @ExcelProperty(value = "ID")
    private String userId;
    @ExcelProperty(value = "账号")
    private String account;
    @ExcelProperty(value = "邮箱")
    private String email;
    @ExcelProperty(value = "昵称")
    private String nickname;
    @ExcelProperty(value = "年龄")
    private Integer age;
    @ExcelProperty(value = "生日")
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    private Date birthday;
}

3. 读取代码

前端是以file的形式将excel表传过来的,springboot默认用MultipartFile类型接收,假设读取处理过程在service层

@Service
public class UserService {

    public void handleExcelImport(MultipartFile excelFile) throws IOException {
        InputStream inputStream = excelFile.getInputStream();
        List<UserInfoForExcel> userInfoForExcels = EasyExcel.read(inputStream)
            	.head(UserInfoForExcel.class)	// 行头类型匹配
                .sheet(0)				// sheet(0)为第一张表位置
                .headRowNumber(1)       // 行头所在行位置
                .doReadSync();			// 同步结果返回
        System.out.println(userInfoForExcels);
    }
}

4. 测试接口

@RestController
@RequestMapping("userinfo")
public class UserInfoController {

    @Autowired
    UserService userService;

    @PostMapping("import")
    public String handleExcelImport(MultipartFile file) throws IOException {
        userService.handleExcelImport(file);
        return "读取成功";
    }
}

5. 测试结果

image-20231213185235689.png

6. 补充

以上是最简单的读,且读的时候将所有数据读取到内存中,再进行处理,这样数据量一大,会导致占用内存过高甚至OOM,EasyExcel提供了自定义Listener,在读取时进行自定义操作,例如每次只读取5条数据,避免大量数据占用内存。

这只是举个简单的例子,事实上Listener还可以做很多复杂的操作,详情可以搜索EasyExcel官网,看看其API

7. 自定义监听器

/**
 * 自定义EasyExcel监听器
 */
public class UserInfoListener implements ReadListener<UserInfoForExcel> {
    // 设置缓存数据量
    private static final int BATCH_COUNT = 5;

    // 缓存数据List
    private List<UserInfoForExcel> cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);

    /**
     * 每条数据都会调用该方法
     * @param userInfoForExcel 读取的一行数据
     * @param analysisContext 上下文对象,包含excel表的很多基本信息
     */
    @Override
    public void invoke(UserInfoForExcel userInfoForExcel, AnalysisContext analysisContext) {
        cachedDataList.add(userInfoForExcel);
        if (cachedDataList.size()>=BATCH_COUNT){
            // 达到预定数据量,进行插入数据库操作
            // …… todo
            // 然后清空缓存数据
            cachedDataList.clear();
        }
    }

    /**
     * 所有数据执行完invoke,会调用该方法
     * 由于最后的数据可能没有达到缓存定义的BATCH_COUNT,导致最后缓存中的数据没有进行插入数据库操作,所以需要在此进行数据插入
     * @param analysisContext 上下文对象,包含excel表的很多基本信息
     */
    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
        // 缓存List中剩余的数据进行插入数据库操作
        // …… todo
    }
}

有一点需要注意的是,如果在插入数据库操作时使用spring管理的dao,不能将Listener对象交由spring管理(即是贪图方便在该Listener上添加@Component等注释),而应该将操作数据库的dao通过Listener的有参构造器传进来。EasyExcel官网有特别提醒

8. 使用自定义的监听器

创建完自定义的监听器后,在读取时注册该监听器,并且读时不需要使用doReadSync,改为doRead即可

@Service
public class UserService {

    public void handleExcelImport(MultipartFile excelFile) throws IOException {
        InputStream inputStream = excelFile.getInputStream();
        EasyExcel.read(inputStream).head(UserInfoForExcel.class)
                .sheet(0)
                .registerReadListener(new UserInfoListener()) // 注册自定义监听器
                .headRowNumber(1)       //行头所在行位置
                .doRead();
    }

}

至此,EasyExcel的简单读描述完毕。

事实上EasyExcel的监听器还能做很多有用的事情,强烈建议到官网看文档,基本能解决95%的需求

官网地址:https://easyexcel.opensource.alibaba.com/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/242588.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Visual Studio使用Web Deploy发布.NET Web应用到指定服务器的IIS中

前言 今天要讲的是在Window 2008 R2版本的服务器下如何配置Web Deploy&#xff0c;和Visual Studio使用Web Deploy发布.NET Web应用到指定服务器的IIS中。 因为历史原因项目只能使用这个版本的服务器&#xff0c;当然使用其他服务器版本配置流程也是一样的。 Web Deploy介绍 …

Oracle数据库对SAP的支持

其实有时候&#xff0c;很多信息都已经整理好了&#xff0c;你只需要知道他在哪里就好&#xff0c;无需自己整理。 Oracle数据库对SAP的支持&#xff0c;可以从这个网页快速了解。 看前面的概述&#xff1a; Oracle 数据库是全球 SAP 客户中排名第一的数据库&#xff0c;拥有…

插入算法(C语言)

#include<cstdio> #include<iostream> #define N 9 using namespace std; int main() {int arr[N1] { 1,4,7,13,16,19,22,25,280 }; int in,i,j;//要插入的数字//打印要插入数字的数组所有元素printf("插入前的数组: ");for ( i 0; i <N; i){print…

设计模式——单例模式(创建型)

引言 单例模式是一种创建型设计模式&#xff0c; 让你能够保证一个类只有一个实例&#xff0c; 并提供一个访问该实例的全局节点。 问题 单例模式同时解决了两个问题&#xff0c; 所以违反了单一职责原则&#xff1a; 保证一个类只有一个实例。 为什么会有人想要控制一个类所…

回归预测 | MATLAB实现CHOA-BiLSTM黑猩猩优化算法优化双向长短期记忆网络回归预测 (多指标,多图)

回归预测 | MATLAB实现CHOA-BiLSTM黑猩猩优化算法优化双向长短期记忆网络回归预测 &#xff08;多指标&#xff0c;多图&#xff09; 目录 回归预测 | MATLAB实现CHOA-BiLSTM黑猩猩优化算法优化双向长短期记忆网络回归预测 &#xff08;多指标&#xff0c;多图&#xff09;效果…

YOLOv8改进 | 2023主干篇 | EfficientViT替换Backbone(高效的视觉变换网络)

一、本文介绍 本文给大家带来的改进机制是EfficientViT&#xff08;高效的视觉变换网络&#xff09;&#xff0c;EfficientViT的核心是一种轻量级的多尺度线性注意力模块&#xff0c;能够在只使用硬件高效操作的情况下实现全局感受野和多尺度学习。本文带来是2023年的最新版本…

是谁,在参与数十亿美元的量子市场?

量子技术是最不为人们所了解、但却最有希望在未来几年颠覆商业和产业的进步技术之一。 很少有像量子信息科学市场这样小的市场能引起如此热烈的讨论。上周&#xff0c;根据Hyperion Research在圣克拉拉举行的Q2B硅谷会议上发布的年度量子计算&#xff08;QC&#xff09;市场更新…

【开源软件】最好的开源软件-2023-第23名 Apache Druid

自我介绍 做一个简单介绍&#xff0c;酒架年近48 &#xff0c;有20多年IT工作经历&#xff0c;目前在一家500强做企业架构&#xff0e;因为工作需要&#xff0c;另外也因为兴趣涉猎比较广&#xff0c;为了自己学习建立了三个博客&#xff0c;分别是【全球IT瞭望】&#xff0c;【…

Git使用——IDEA中git branch显示乱码 后面提示standard input 如何解决

问题描述&#xff1a; idea中的terminal中输入git branch显示乱码 解决方案 在idea的file里面&#xff0c;进行设置 选择安装的git下面的bash 参考博客&#xff1a; https://blog.csdn.net/weixin_39925939/article/details/122410453

使用 Timm 库替换 YOLOv8 主干网络 | 1000+ 主干融合YOLOv8

文章目录 前言版本差异说明替换方法parse_moedl( ) 方法_predict_once( ) 方法修改 yaml ,加载主干论文引用timm 是一个包含最先进计算机视觉模型、层、工具、优化器、调度器、数据加载器、数据增强和训练/评估脚本的库。 该库内置了 700 多个预训练模型,并且设计灵活易用。…

算法基础之树的重心

树的重心 无向图: 边没有方向 有向图:边有方向 只能单向询问 无向图建立双向的边 要求输出每种情况连通块个数最大值的最小值**(最小的最大值)** #include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace s…

开发案例:使用canvas实现图表系列之折线图

一、功能结构 实现一个公共组件的时候&#xff0c;首先分析一下大概的实现结构以及开发思路&#xff0c;方便我们少走弯路&#xff0c;也可以使组件更加容易拓展&#xff0c;维护性更强。然后我会把功能逐个拆开来讲&#xff0c;这样大家才能学习到更详细的内容。下面简单阐述…

一个Redis实例最多能存放多少keys

程序员的公众号&#xff1a;源1024&#xff0c;获取更多资料&#xff0c;无加密无套路&#xff01; 最近整理了一份大厂面试资料《史上最全大厂面试题》&#xff0c;Springboot、微服务、算法、数据结构、Zookeeper、Mybatis、Dubbo、linux、Kafka、Elasticsearch、数据库等等 …

【Qt QML入门】Image

Image类型显示一个图像。 使用source属性将图像的源指定为URL。图像可以以Qt支持的任何标准图像格式提供&#xff0c;包括位图格式&#xff0c;如PNG和JPEG&#xff0c;以及矢量图形格式&#xff0c;如SVG。 如果没有指定宽度和高度属性&#xff0c;图像将自动使用加载图像的大…

如果我忽然嗝屁了,家人怎么继承我的财产

前言 笔者很喜欢的电影《寻梦环游记》有这么一句经典台词&#xff1a;“真正的死亡是世界上没有一个人记得你”。 然而&#xff0c;现实中我们所说的“死亡”&#xff0c;其实就是 他再不能与这个世界、与自己在乎的人有新的互动了。 本文&#xff0c;笔者想写一写 关于死亡的…

iOS16.5 以上12小时制/24小时制 HH/hh引起的时间计算错误

iOS16.5以上的版本&#xff0c;如果用yyy-MM-dd HH:mm:ss转换时间&#xff0c;则有肯能发生错误。 先上代码&#xff1a; NSString * timeStr "2023-01-01 11:13:32"; NSDateFormatter * dateFormatter [[NSDateFormatter alloc] init]; [dateFormatter setDateFo…

windows10下jdk安装

文章目录 windows10下jdk安装说明what安装包下载执行安装包验证是否安装成功 windows10下jdk安装 说明 操作系统&#xff1a;windows10 版本&#xff1a;1.8 what JDK(Java Development Kit) 是 Java 语言的软件开发工具包 安装包下载 https://www.oracle.com/java/techn…

Proxmox服务安装

文章目录 系统盘制作 TODO安装系统安装Proxmox系统安装wpa服务配置wifi通过IP访问Proxmox创建服务器配置服务器网络连接虚拟机方式第一种方法&#xff1a;通过建设OpenVPN方式连接虚拟机第二种方法&#xff1a;通过端口转发直连虚拟机设置安装ubuntu服务器允许root用户远程登录…

.net core提示The xx field is required,One or more validation errors occurred

访问接口时缺少model中的参数时&#xff0c;会提示&#xff1a; The xx field is required One or more validation errors occurred原因是.net core webapi默认参数为不可空&#xff0c;因此会验证并报错。 解决方案&#xff1a; 在项目的.csproj中&#xff0c;修改Nullable…

Android--Jetpack--数据库Room详解二

本是青灯不归客&#xff0c;却因浊酒恋红尘 一&#xff0c;基本使用 关于Room数据库的基本使用&#xff0c;请参考文章Android--Jetpack--数据库Room详解一-CSDN博客 二&#xff0c;Room与ViewModle,LiveData的结合使用 LiveData与ViewModle的使用&#xff0c;请参考文章Andr…