使用EasyExcel读写Excel文件

笔者之前一直使用POI读写Excel文件,最近有个需求需要读取大概80万行数据的Excel,使用POI读取到10.2万行左右就卡死不动了,而且CPU占用直接拉满到100%,内存占用也很高。

查找资料后,发现POI提供了读取大量数据的方法,但是用起来比较复杂。同时看到有人提到用EasyExcel读取Excel的速度快,资源占用少。于是换成EasyExcel去读取那个80万行数据的Excel,发现读取速度确实很快,CPU和内存占用也很少。

然而EasyExcel的官方文档中,最简单的读写代码都是默认与数据库有交互,写了一些分页读写数据库的代码,还是不够简洁。所以个人参考EasyExcel的官方文档,写了一个更加简洁、清晰的,使用EasyExcel读取Excel的样例。


1.在pom.xml中添加POI相关依赖

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

2.实体类

package com.example.study.entity;import com.alibaba.excel.annotation.ExcelProperty;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Getter;
import lombok.Setter;import java.util.Date;@Getter
@Setter
public class StudentEntity {@ExcelProperty(value = "id", order = 1)private Integer id;@ExcelProperty(value = "生日", order = 4)@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")private Date birthday;@ExcelProperty(value = "名字", order = 2)private String name;@ExcelProperty(value = "性别", order = 3)private String sex;
}

3.读取Excel的类

package com.example.study.common;import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.read.listener.ReadListener;
import com.alibaba.fastjson.JSON;
import com.example.study.entity.StudentEntity;
import lombok.extern.slf4j.Slf4j;import java.util.ArrayList;
import java.util.List;@Slf4j
public class EasyExcelDemo {public static void main(String[] args) {String readExcel = "F:\\tmp\\students.xlsx";String writeExcel = "F:\\tmp\\students-write.xlsx";List<StudentEntity> list = read(readExcel);write(writeExcel, list);}private static void write(String fileName, List<StudentEntity> list) {EasyExcel.write(fileName).head(StudentEntity.class).sheet("EasyExcel Writed 1").doWrite(list);}private static List<StudentEntity> read(String excel) {List<StudentEntity> list = new ArrayList<>();EasyExcel.read(excel).head(StudentEntity.class).sheet(1).registerReadListener(new ReadListener<StudentEntity>() {@Overridepublic void invoke(StudentEntity entity, AnalysisContext analysisContext) {list.add(entity);System.out.println("每读取到一行数据就会执行该方法:" + JSON.toJSONString(entity));}@Overridepublic void doAfterAllAnalysed(AnalysisContext analysisContext) {System.out.println("所有数据读取完成后执行该方法");}}).doRead();return list;}
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

手写对象浅比较(React中pureComponent和Component区别)

PureComponent和Component的区别 PureComponent会给类组件默认加一个shouldComponentUpdate这样的周期函数 //PureComponent类似自动加了这段shouldComponentUpdate(nextProps,nextState){let { props, state } this;// props/state:修改之前的属性状态// nextProps/nextState…

047、TiDB特性_TopSQL

TopSQL 之前 之前没有办法找单个TiKV Server的语句。只能查找整个集群的慢语句。 TopSQL之后 指定TiDB及TiKV实例正在执行的SQL语句CPU开销最多的Top 5 SQL每秒请求数、平均延迟等信息 TopSQL 使用 选择需要观察负载的具体TiDB Server或TiKV实例 观察Top 5 类SQL 查看某…

用IDEA写第一个Spring程序 HelloWorld

用IDEA写第一个Spring程序 HelloWorld 环境 Orcal JDK&#xff1a;1.8.0_341 maven&#xff1a;3.9.3 Spring&#xff1a;5.3.10 IDEA&#xff1a;2023.1.2 1. 安装JDK和IDEA 2. 安装maven并配置环境变量、换源 3. IDEA中maven属性配置&#xff0c;主要是版本和settings文件及…

python+selenium进行cnblog的自动化登录测试

Web登录测试是很常见的测试&#xff0c;手动测试大家再熟悉不过了&#xff0c;那如何进行自动化登录测试呢&#xff01;本文就基于pythonselenium结合unittest单元测试框架来进行一次简单但比较完整的cnblog自动化登录测试&#xff0c;可提供点参考&#xff01;下面就包括测试代…

python 调用百度文心一言接口开发聊天机器人

要使用Python调用百度文心一言接口开发聊天机器人&#xff0c;可以按照以下步骤进行&#xff1a; 注册百度智能云账号并创建一个API密钥。安装Python的requests库和BeautifulSoup库。可以使用以下命令进行安装&#xff1a; shellpip install requests beautifulsoup4 使用Pyt…

centos7 docker 安装sql server 2019

contos7安装sql server docker最低1.8或更高 卸载旧的docker sudo yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine 装docker依赖包 #安装所需资源包 sudo yum install -…

【iOS】 各iPhone手机屏幕尺寸分辨率

机型物理像素逻辑像素规格对角线iPhone 14 Pro Max1290*2796px430*932pt3x6.7英寸iPhone 14 Pro1179*2556px393*852pt3x6.1英寸iPhone 14 Plus1284*2778px428*926pt3x6.7英寸iPhone 141170*2532px390*844pt3x6.1英寸iPhone 13 Pro Max1284*2778px428*926pt3x6.7英寸iPhone 13 P…

什么是暂时性死区?

1.定义&#xff1a; 暂时性死区&#xff08;Temporal Dead Zone&#xff0c;简称TDZ&#xff09;是指在 JavaScript 中使用 let 或 const 声明变量时&#xff0c;变量在其声明之前不能被访问或使用的特性。 在 JavaScript 中&#xff0c;变量声明提升是指在执行代码之前&…

rust学习-闭包

背景 模拟健康推荐算法&#xff0c;为前端提供高强度/低强度的训练app use std::thread; use std::time::Duration;fn simulated_expensive_calculation(intensity: u32) -> u32 {println!("calculating slowly...");thread::sleep(Duration::from_secs(2));int…

uniapp实现微信小程序自带的分享功能

定义 share.js 文件 export default {data() {return {// 默认的全局分享内容share: {title: 标题,path: /pages/index/index, // 全局分享的路径imageUrl: , // 全局分享的图片(可本地可网络)}}},// 定义全局分享// 1.发送给朋友onShareAppMessage(res) {return {title: this…

数据结构与算法——希尔排序(引例、希尔增量序列、原始希尔排序、代码、时间复杂度、Hibbard增量序列、Sedgewick增量序列)

目录 引例 希尔增量序列 原始希尔排序 代码&#xff08;C语言&#xff09; 时间复杂度 更多增量序列 Hibbard增量序列 Sedgewick增量序列 希尔排序&#xff08;by Donald Shell&#xff09; 引例 给以下序列进行排序&#xff1a; 先以5的间隔进行插入排序&#xff1a…

设计模式之桥接模式

写在前面 本文看下桥接设计模式。 1&#xff1a;介绍 1.1&#xff1a;什么时候桥接设计模式 当一个业务场景由多个变化维度组成&#xff0c;并且这多个变化的维度到底有多少种情况是不确定&#xff0c;比如现在我们要为瑞幸咖啡写一个系统&#xff0c;很自然的&#xff0c;…

2023.7.16 第五十九次周报

目录 前言 文献阅读:跨多个时空尺度进行预测的时空 LSTM 模型 背景 本文思路 本文解决的问题 方法论 SPATIAL 自动机器学习模型 数据处理 模型性能 代码 用Python编写的LSTM多变量预测模型 总结 前言 This week, I studied an article that uses LSTM to solve p…

【前端知识】React 基础巩固(二十三)——React 性能优化 SCU相关

React 基础巩固(二十三)——React 性能优化 SCU React 更新机制 React 的渲染流程 JSX -> 虚拟 DOM -> 真实 DOM React 的更新流程 props/state 改变 -> render函数重新执行 -> 产生新的DOM树 -> 新旧DOM树进行diff -> 计算出差异进行更新 -> 更新到真实…

Element分页组件自定义样式

样式效果 页面代码 <el-paginationsize-change"handleSizeChange"current-change"handleCurrentChange":current-page"page.page":page-sizes"[10, 20, 30, 40]":page-size"page.size"layout"total, sizes, prev, …

如何用https协议支持小程序

步骤一&#xff1a;下载SSL证书 登录数字证书管理服务控制台。在左侧导航栏&#xff0c;单击SSL 证书。在SSL证书页面&#xff0c;定位到目标证书&#xff0c;在操作列&#xff0c;单击下载。 在服务器类型为Nginx的操作列&#xff0c;单击下载。 解压缩已下载的SSL证书压缩…

Python中Threading对于TCP的使用

什么是多线程&#xff1f; 多线程类似于同时执行多个不同程序&#xff0c;多线程运行有如下优点&#xff1a; 使用线程可以把占据长时间的程序中的任务放到后台去处理。 用户界面可以更加吸引人&#xff0c;这样比如用户点击了一个按钮去触发某些事件的处理&#xff0c;可以弹…

springboot经典面试题2

问题&#xff1a;什么是Spring Boot的起步依赖&#xff08;Starter Dependencies&#xff09;&#xff1f;如何使用起步依赖&#xff1f; 答案&#xff1a;Spring Boot的起步依赖是一组预定义的依赖项&#xff0c;可以简化项目的配置和构建过程。可以通过在项目的构建配置文件…

[个人笔记] WinSrv批量添加DNS记录和条件转发器记录

Windows Server - 运维篇 第三章 WinSrv批量添加DNS记录和条件转发器记录 Windows Server - 运维篇系列文章回顾WinSrv批量添加DNS记录和条件转发器记录单条记录添加DNS条件转发器记录批量新增DNS条件转发器记录批量导出DNS条件转发器 参考来源 系列文章回顾 第一章 域控使用C…

使用 jmeter 进行审批类接口并发测试

目录 前言&#xff1a; 背景&#xff1a; 难点&#xff1a; 场景 a&#xff1a; 场景 b&#xff1a; 前言&#xff1a; 使用JMeter进行审批类接口的并发测试是一种有效的方法&#xff0c;可以模拟多个用户同时对接口进行审批操作&#xff0c;以评估系统在高负载情况下的性…