EasyExcel学习

一、EasyExcel简介

一、EasyExcel是什么

EasyExcel是一个基于Java的简单、省内存的读写Excel的阿里开源项目。在尽可能节约内存的情况下支持读写百M的Excel。

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

学习Easyexcel前需要了解导入和导出是什么意思:

导入:一般我们会把数据从excel到数据库的过程称为导入!

导出:一般我们会把数据从数据库到excel的过程称为导出!

1.2、 EasyExcel 能用在哪里

项目中涉及到Excel文件,CVS文件大多数的读写操作,均可以使用!

1.3、为什么要选用EasyExcel解析excel

在这里插入图片描述

二、EasyExcel的使用

2.1、快速入门

首先创建项目,并配置maven。

导入easyexcel的依赖:

<dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.1.2</version>
</dependency>

创建一个实体类Employee,与excel表格对应:

/*** 与excel文件相对应的模型类*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Employee {@ExcelProperty("员工编号")private int id;@ExcelProperty("员工姓名")private String name;@ExcelProperty("入职日期")private Date date;@ExcelProperty("员工工资")private double salary;}

这里需要一个工具类,用户获取到模块这一级的磁盘路径:

/*** 获取代码路径的工具类,可以获取到模块这一级的磁盘路径;*/
public class TestFileUtil {public static String getPath() {return TestFileUtil.class.getResource("/").getPath().replace("classes/","");}
}

简单写excel:

首先需要准备测试数据:

// 准备测试数据的方法
private List<Employee> data(int count) {List<Employee> list = ListUtils.newArrayList();for (int i = 1; i <= count; i++) {list.add(new Employee(i,"测试数据"+i,new Date(),6.6*i));}return list;
}

实现写操作:

@Test
public void write(){//文件的路径和名字String fileName = TestFileUtil.getPath() + "simpleWrite" + System.currentTimeMillis() + ".xlsx";EasyExcel.write(fileName, Employee.class).sheet("模板666").doWrite(data(10)); //sheet:表格名字
}

到对应的路径下打开excel,查看测试结果:

在这里插入图片描述

简单读excel:

读操作需要传入监听器,这里使用EasyExcel提供的PageReadListener:

@Test
public void read(){String fileName = TestFileUtil.getPath() + "simpleWrite1750300831958.xlsx";EasyExcel.read(fileName, Employee.class, new PageReadListener<Employee>(dataList -> {//读取数据后对数据执行的操作,这里直接输出for (Employee demoData : dataList) {System.out.println(demoData);}})).sheet().doRead();
}

在控制台查看测试结果:

在这里插入图片描述

2.2、EasyExcel进阶操作

批量写数据:

这里写100万数据,每次写1万,执行100次:

// 批量写数据  100万
@Test
public void write(){String fileName = TestFileUtil.getPath() + "repeatedWrite" + System.currentTimeMillis() + ".xlsx";try (ExcelWriter excelWriter = EasyExcel.write(fileName, Employee.class).build()) {WriteSheet writeSheet = EasyExcel.writerSheet("测试数据").build();long t1 = System.currentTimeMillis();for (int i = 0; i < 100; i++) {List<Employee> data = data(10000);excelWriter.write(data, writeSheet);}long t2 = System.currentTimeMillis();//测试执行效率:共耗时10秒System.out.println("共耗时" + (t2-t1)/1000 + "秒"); }
}

测试结果显示写100万数据共耗时10秒。

按模版填充单个对象数据:

如果上面写的数据格式不好看怎么办?

可以利用阿里提供的模版写数据,模版设置的样式新添加的数据会自动包含样式。

可以使用{}来填充数据:

在这里插入图片描述

如果传入的不是单个对象,而是一个集合可以在字段前面加一个点就可以:

在这里插入图片描述

首先,需要准备一个execl模版:

在这里插入图片描述

// 批量写数据  100万
@Test
public void write(){//分多次填充,会使用文件缓存(省内存)String fileName = TestFileUtil.getPath() + "listFill" + System.currentTimeMillis() + ".xlsx";String templateFileName = TestFileUtil.getPath() + "模版.xlsx";try (ExcelWriter excelWriter = EasyExcel.write(fileName).withTemplate(templateFileName).build()) {WriteSheet writeSheet = EasyExcel.writerSheet().build();long t1 = System.currentTimeMillis();for (int i = 0; i < 100; i++) {excelWriter.fill(data(10000), writeSheet);}long t2 = System.currentTimeMillis();System.out.println(t2-t1); //测试执行效率}
}

测试结果:

在这里插入图片描述

自定义监听器读海量数据:

自定义监听器读数据:

/*** 自定义监听器读数据*/
public class EmployeeListener implements ReadListener<Employee> {private int count = 100; //缓存量private ArrayList<Employee> list = new ArrayList<>(count);private EmployeeDao dao;public EmployeeListener(EmployeeDao dao) {this.dao = dao;}/*** 每读一行数据,都会调用这个方法*/@Overridepublic void invoke(Employee employee, AnalysisContext analysisContext) {// 将读取到的一行数据添加到集合list.add(employee);// 判断是不是到达缓存量了if(list.size()>=100){// 操作数据库dao.save(list);// 清空缓存list= new ArrayList<>(count);}}/*** 读完整个excel之后,会调用这个方法* 最后list中还会存在元素,执行这个方法处理剩余的元素*/@Overridepublic void doAfterAllAnalysed(AnalysisContext analysisContext) {if(list.size()>0){// 操作数据库dao.save(list);list= new ArrayList<>(count);}}}

这里只是模拟了一下操作数据库的操作:

/*** 模拟操作数据库*/
public class EmployeeDao {public void save(List<Employee> list){System.out.println(list.size()+"模拟操作数据库......");}
}

读取海量数据:

/*** 自定义监听器,读海量数据*/
public class ManyRead {@Testpublic void read(){String fileName = TestFileUtil.getPath()+"repeatedWrite1750302016738.xlsx";ExcelReader reader = EasyExcel.read(fileName, Employee.class, new EmployeeListener(new EmployeeDao())).build();ReadSheet sheet = EasyExcel.readSheet().build();reader.read(sheet);}}

测试,在控制台查看输出结果!

2.3、EasyExcel综合应用

需求:

  • 实现文件导入功能。

  • 实现文件导出功能。

功能实现:

  1. 配置持久层配置,并引入相关依赖:
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql:///easyexcel?useSSL=false&useUnicode=true&characterEncoding=utf-8
jdbc.username=root
jdbc.password=newpass
  1. 创建实体类Employee:
/*** 员工实体类*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Employee {@ExcelProperty("员工工号")private int id;@ExcelProperty("员工姓名")private String name;@ExcelProperty("员工工资")private double salary;@ExcelProperty("入职日期")private Date date;}
  1. 创建工具类TestFileUtil来获取文件路径:
/*** 获取代码路径的工具类,可以获取到模块这一级的磁盘路径;*/
public class TestFileUtil {public static String getPath() {return TestFileUtil.class.getResource("/").getPath().replace("classes/","");}public static void main(String[] args) {System.out.println(getPath());}}
  1. 创建持久层EmployeeMapper:
/*** 持久层*/
public interface EmployeeMapper {/*** 批量插入数据*/void beathInsert(@Param("list") List<Employee> list);/*** 查询数据*/@Select("select * from employee")@ResultType(Employee.class)List<Employee> getData();}
  1. 创建EmployeeMapper.xml:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.itheima.mapper.EmployeeMapper"><!--批量插入数据--><insert id="beathInsert">insert into employee (id,name,salary,date) values<foreach collection="list" item="demoData" separator=",">(null,#{demoData.name},#{demoData.salary},#{demoData.date})</foreach></insert></mapper>
  1. 创建接口层EmployeeService:
/*** Service接口层*/
public interface EmployeeService {public List<Employee> getData();public void addData(List<Employee> list);}
  1. 创建业务实现类EmployeeServiceImpl:
/*** 业务层*/
@Service
public class EmployeeServiceImpl implements EmployeeService {@Autowiredprivate EmployeeMapper dao;@Overridepublic List<Employee> getData() {return dao.getData();}@Overridepublic void addData(List<Employee> list) {dao.beathInsert(list);}}
  1. 创建监听器EmployeeListener:
public class EmployeeListener implements ReadListener<Employee> {private int count = 10000;private EmployeeService dao ;private List<Employee> list = new ArrayList<>(count);public EmployeeListener(EmployeeService dao) {this.dao = dao;}@Overridepublic void invoke(Employee employee, AnalysisContext analysisContext) {list.add(employee);if(list.size()>=count){dao.addData(list);list = new ArrayList<>(count);}}@Overridepublic void doAfterAllAnalysed(AnalysisContext analysisContext) {if(list.size()>0){dao.addData(list);}}}
  1. 创建控制层MyController:
@Controller
@RequestMapping("/")
public class MyController {@Autowiredprivate EmployeeService service;/*** Excel读操作*/@RequestMapping("/upload")@ResponseBodypublic void upload(MultipartFile file, HttpServletResponse response) throws IOException {long t1 = System.currentTimeMillis();//Excel读操作EasyExcel.read(file.getInputStream(), Employee.class, new EmployeeListener(service)).sheet().doRead();long t2 = System.currentTimeMillis();response.setContentType("text/html;charset=utf-8");response.getWriter().print("导入数据成功,共用时:"+(t2-t1));}/*** Excel写操作*/@RequestMapping("/download")public void download(HttpServletResponse response) throws IOException {//设置Excel文件下载的类型response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");response.setCharacterEncoding("utf-8");// 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系String fileName = URLEncoder.encode("测试666", "UTF-8").replaceAll("\\+", "%20");//Content-disposition:可以控制文件是直接在浏览器中显示还是作为附件下载,这里是直接作为附件下载,文件名字是fileName.xlsxresponse.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");//Excel写操作EasyExcel.write(response.getOutputStream(), Employee.class).sheet("模板").doWrite(service.getData());}}
  1. 测试:

前端页面:

在这里插入图片描述

导入100万条数据的excel,查看数据库:

在这里插入图片描述

可以看到,导入100万数据仅仅耗时26s:

在这里插入图片描述

并且内存占用为20多兆:

在这里插入图片描述

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

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

相关文章

day4课程

1整体认识和路由配置 2二级分类面包屑导航实现 3基础商品列表渲染 4列表筛选功能实现 5列表无限加载功能实现 6定制路由滚动行为 7详情页整体认识和路由配置 8详情页基础数据渲染 9详情页基础组件封装和数据渲染 10适配不同title和数据列表 11小图切换大图 12滑块跟随鼠标移动 …

kubeadm worker节点加入master失败

文章目录 1、操作2、问题现象3、问题原因4、问题解决4.1、重新生成token4.2、重新生成hash值 5、验证 1、操作 执行以下命令&#xff0c;让worker节点加入到master节点 kubeadm join 103.123.222.241:6443 --token vxe3v1.wzpnks8v1vbbtsu0 --discovery-token-ca-cert-hash s…

二十二、【用户管理与权限 - 篇四】后端权限定义:模型与 API 实现

【用户管理与权限 - 篇四】后端权限定义:模型与 API 实现 前言准备工作第一部分:设计并创建 `Permission` 模型第二部分:更新 `Role` 模型以关联 `Permission`第三部分:生成并应用数据库迁移第四部分:创建 Serializers第五部分:创建 ViewSets第六部分:注册 API 路由第七…

猜数字小游戏微信流量主小程序开源

这个智力小游戏采用了数字华容道的玩法&#xff0c;玩家需要通过移动数字方块&#xff0c;将数字按顺序排列完成游戏。代码严格遵循微信小程序的目录结构&#xff0c;包含以下部分&#xff1a; 完整的小程序配置文件&#xff08;app.js、app.json、app.wxss&#xff09; 游戏页…

探秘阿里云EBS存储:云计算的存储基石

一、引言 在云计算时代&#xff0c;数据如同企业的生命线&#xff0c;数据存储的重要性不言而喻。随着企业数字化转型的加速&#xff0c;海量数据的存储与高效管理成为亟待解决的问题。云存储以其卓越的灵活性、可扩展性和成本效益&#xff0c;逐渐成为众多企业的首选方案。在…

音视频之H.264的可伸缩编码SVC

系列文章&#xff1a; 1、音视频之视频压缩技术及数字视频综述 2、音视频之视频压缩编码的基本原理 3、音视频之H.264/AVC编码器原理 4、音视频之H.264的句法和语义 5、音视频之H.264/AVC解码器的原理和实现 6、音视频之H.264视频编码传输及其在移动通信中的应用 7、音视…

Anaconda安装env,yml一直卡在Solving environment:不动

如果在使用conda env creat -f env.yml时候&#xff0c;anaconda一直卡住&#xff0c;如下 可以尝试下面操作。 conda config --set solver libmamba # 使用libmamba引擎&#xff08;Conda≥22.11&#xff09; conda env create -f env.yaml # 重新尝试

榕壹云婚恋相亲系统:ThinkPHP+UniApp打造高效婚配平台

引言 在数字化浪潮下,婚恋相亲行业正加速向线上迁移。榕壹云公司基于市场需求与技术积累,开发一款功能完备、技术开源的婚恋相亲小程序系统,为单身人士提供高效、安全的婚恋平台。本文将围绕系统背景、客户定位、核心技术、功能模块及优势场景展开详细解析,助力开发者与技…

查询docker-compose 部署的milvus 请求日志

在 Docker Compose 部署的 Milvus 中,日志默认存储在各个服务的容器内。以下是定位和查询日志的方法: 1. 查看实时日志 使用 docker-compose logs 命令查看实时日志: bash # 查看所有服务的日志 docker-compose logs -f# 仅查看 Milvus 服务日志(服务名以 docker-compos…

Rsync实操

Rsync实操 一.rsync命令 #类似于cp[rootuser2 ~]# rsync info.sh root192.168.168.130:/rootroot192.168.168.130s password: [rootuser1 ~]# lsanaconda-ks.cfg ceph-release-1-1.el7.noarch.rpm info.sh 二、使用rsync备份push方式 服务器&#xff1a;server 192.168.168…

Java常见八股-(6.算法+实施篇)

Java常见八股-&#xff08;1.Java基础篇&#xff09; Java常见八股-&#xff08;2.Java高级篇&#xff09; Java常见八股-&#xff08;3.MySQL篇&#xff09; Java常见八股-&#xff08;4.前端篇&#xff09; Java常见八股-&#xff08;5.框架篇&#xff09; 目录 一、算…

阿里云部署的SMTP服务器安全攻防实录:深度解析攻击、防护与加固

阿里云部署的SMTP服务器安全攻防实录&#xff1a;深度解析攻击、防护与加固 一次针对云上SMTP服务的持续攻击事件&#xff0c;揭示了邮件中继服务面临的多重安全挑战。本文将深入剖析攻击手法、防护策略与系统性加固方案。 某企业在阿里云上部署的Postfix SMTP服务器近期遭遇…

HTTP与HTTPS深度解析:从明文传输到安全通信的演进之路

引言 在互联网的早期&#xff0c;HTTP&#xff08;超文本传输协议&#xff09;作为Web通信的基石&#xff0c;凭借简单高效的特性推动了万维网的爆发式增长。但随着互联网从“信息共享”向“价值交互”演进&#xff0c;HTTP的明文传输特性逐渐暴露致命缺陷——用户的每一次点击…

渗透实战:绕过沙箱机制的反射型XSS

Lab 24&#xff1a;利用 xss 绕过 csrf 防御 依然是留言板的问题可以执行<h1>标签 进入修改邮箱的界面&#xff0c;修改抓包 这里构造修改邮箱的代码 <script> var req new XMLHttpRequest(); req.onload handleResponse; req.open(get,/my-account,true); req…

K8S篇之利用deployment实现滚动平滑升级

一、更新策略 在 Kubernetes (K8s) 中,滚动平滑升级(Rolling Update)是一种无缝更新部署的方式,允许你在不中断服务的情况下逐步更新应用程序。这是 Kubernetes 默认的 Deployment 更新策略,它会按照指定的步幅逐步替换 Pods,确保在新版本的应用程序没有完全替换旧版本的…

【Dify 案例】【MCP实战】【一】【前置配置】

MCP(Model Context Protocol,模型上下文协议) ,2024年11月底,由Anthropic 推出的一种开放标准。旨在为大语言模型(LLM)提供统一的、标准化方式与外部数据源和工具之间进行通信。 MCP 作为一种标准化协议,极大地简化了大语言模型与外部世界的交互方式,使开发者能够以统…

2025高考志愿填报张雪峰资料合集

2025高考志愿填报课程&#xff0c;张雪峰专业指导&#xff01;包含61节课&#xff0c;93个专业详解&#xff0c;总计1500分钟视频。 独家各省资料包&#xff01;新旧高考政策全覆盖&#xff0c;适合高三家长和考生。内容整理自互联网&#xff0c;无偿分享&#xff0c;如有侵权&…

Nginx+Tomcat负载均衡群集

一.案例:部署Tomcat 1.案例分析 1.1案例概述 京北点指科技有限公司发布V3版移联建站管理系统&#xff0c;该项目为Java 语言开发的Web 站点。目前&#xff0c;IBM 的 WebSphere 及 0racle 的 WebLogic 占据了市面上 Java 语言 Web 站点的大部分份额。这两种软件以其无与伦比…

华为云Flexus+DeepSeek征文|基于华为云一键部署dify平台构建合同审核助手应用实践

目录 前言 1 华为云一键部署Dify平台 1.1 华为云Dify平台介绍 1.2 部署过程介绍 1.3 登录Dify平台 2 接入华为云 ModelArts Studio 的 DeepSeek 大模型 2.1 获取调用模型服务信息 2.2 在 Dify 中配置模型 3 构建合同审核助手应用 3.1 简要介绍合同审核助手 3.2 开始…

三种经典算法无人机三维路径规划对比(SMA、HHO、GWO三种算法),Matlab代码实现

代码功能 该MATLAB代码用于对比三种元启发式优化算法&#xff08;SMA、HHO、GWO三种算法&#xff0c; SMA黏菌算法、HHO哈里斯鹰优化算法、GWO灰狼优化算法&#xff09; 在特定优化问题上的性能&#xff0c;运行环境MATLABR2020b或更高 &#xff1a; 初始化问题模型&#xff…