EasyExcel入门

目录

一、文章简介

二、概念

1.EasyExcel是什么?

2.EasyExcel 能用在哪里?

3.为什么要选用EasyExcel解析excel?

4.如何使用EasyExcel?

三、EasyExcel快速入门

1.环境搭建

2.简单写excel

代码示例

TestFileUtil

Employee

SimpleWrite

演示效果

3.简单读excel

代码示例

SimpleRead

演示效果

四、EasyExcel进阶操作

1.批量(重复)写数据

代码示例

ManyWrite

效果演示

2.按模版填充单个对象数据

代码示例

效果演示

3.按模版批量填充多个对象数据

代码示例

4.自定义监听器读海量(百万级别)数据并监控内存消耗

代码示例

EmployeeDao

EmployeeListener

MyRead

五、EasyExcel综合应用


阿里EasyExcel 即学即会:海量数据的导入导出

一、文章简介

主要讲解在java应用中如何利用EasyExcel技术完成对excel文件的导入和导出操作。

数据从excel------->数据库: 导入

数据从数据库-------->excel:导出

二、概念

1.EasyExcel是什么?

  • EasyExcel是一个基于Java的简单、省内存的读写Excel的阿里开源项目。

  • 在尽可能节约内存的情况下支持读写百M的Excel。

2.EasyExcel 能用在哪里?

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

3.为什么要选用EasyExcel解析excel?

4.如何使用EasyExcel?

阿里官方文档: EasyExcel官方文档 - 基于Java的Excel处理工具 | Easy Excel 官网

三、EasyExcel快速入门

1.环境搭建

  • 创建maven工程

  • 引入相关坐标

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

  • 参考官方API完成功能

2.简单写excel

  • 编写模型类并加入注解

  • 编写获取测试数据的方法

  • 调用官方API完成写功能

  • 核心代码:

EasyExcel.write(fileName, DemoData.class).sheet("测试").doWrite(data(100000));
代码示例
TestFileUtil

获取代码路径的工具类

package com.ithiema.utils;
/*获取代码路径的工具类,可以获取到模块这一级的磁盘路径;*/
public class TestFileUtil {public static String getPath() {return TestFileUtil.class.getResource("/").getPath().replace("classes/","");}
​public static void main(String[] args) {System.out.println(getPath());}
}
Employee

员工类

package com.ithiema.pojo;
​
import com.alibaba.excel.annotation.ExcelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
​
import java.util.Date;
​
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Employee {@ExcelProperty("员工工号")private int id;@ExcelProperty("员工姓名")private String name;@ExcelProperty("员工工资")private double salary;@ExcelProperty("入职日期")private Date date;
}
​

SimpleWrite

easyexcel的简单写数据

package com.ithiema.write;
​
import com.alibaba.excel.EasyExcel;
import com.ithiema.pojo.Employee;
import com.ithiema.utils.TestFileUtil;
import org.junit.Test;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.List;
​
/*练习easyexcel的简单写数据*/
public class SimpleWrite {
​@Testpublic void testWrite(){String name = TestFileUtil.getPath() + "简单写数据" + System.currentTimeMillis() + ".xlsx";EasyExcel.write(name, Employee.class).sheet("我的快速入门").doWrite(data(12));}
​
​// 准备测试数据的方法private List<Employee> data(int i) {List<Employee> list = new ArrayList<>();for (int j = 1; j <= i; j++) {list.add(new Employee(j,"测试数据"+j,6.6*j,new Date()));}return list;}
}
演示效果

3.简单读excel

  • 编写模型类并加入注解

  • 监听器介绍

  • 调用官方API完成写功能

  • 核心代码:

EasyExcel.read(fileName, DemoData.class, new PageReadListener<DemoData>
(list -> System.out.println(list))).sheet().doRead();
代码示例
SimpleRead

快速入门,简单读

package com.ithiema.read;
​
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.read.listener.PageReadListener;
import com.ithiema.pojo.Employee;
import com.ithiema.utils.TestFileUtil;
import org.junit.Test;
​
import java.io.File;
​
/*快速入门,简单读*/
public class SimpleRead {/*** 使用EasyExcel框架读取Excel文件** 指定文件路径,数据模型类(Employee.class),以及一个读取监听器,用于处理读取到的每条数据。* 文件名通过TestFileUtil.getPath()获取相对路径,并拼接上特定的文件名。* 使用EasyExcel的read方法指定文件名、数据模型类和监听器,然后调用sheet().doRead()开始读取第一个工作表的数据。*/@Testpublic void testRead(){// 构建文件路径String fileName  = "D:\\develop\\dev\\easyexcel-course\\easyExcel-heima\\QuickStart\\target\\test-简单写数据1722256409955.xlsx";// 这里 需要指定读用哪个class去读,然后读取第一个sheet 文件流会自动关闭// 这里每次会读取100条数据 然后返回过来 直接调用使用数据就行EasyExcel.read(fileName, Employee.class, new PageReadListener<Employee>(dataList -> {// 遍历并打印读取到的每个员工对象for (Employee employee : dataList) {System.out.println(employee);}})).sheet(0).doRead();}}
​
演示效果

四、EasyExcel进阶操作

1.批量(重复)写数据

  • 编写模型类并加入注解

  • 调用官方API完成写功能

try (ExcelWriter writer = EasyExcel.write(fileName, DemoData.class).build()) {WriteSheet writeSheet = EasyExcel.writerSheet("测试表1").build();for (int i = 0; i < 3; i++) {ExcelWriter write = writer.write(data(100000), writeSheet);}}
代码示例
ManyWrite

进阶写数据

package com.ithiema.write;
​
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.write.metadata.WriteSheet;
import com.ithiema.pojo.Employee;
import com.ithiema.utils.TestFileUtil;
import org.junit.Test;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
​
/*进阶写数据*/
public class ManyWrite {
​/*** 批量写入Excel数据* * 该方法创建一个Excel文件,然后分三次写入100条员工数据。* 使用EasyExcel框架简化了Excel文件的写入操作。*/@Testpublic void testWrite(){// 构建文件名,包含批量写数据字样和当前时间戳,确保文件名的唯一性String name = TestFileUtil.getPath() + "批量写数据" + System.currentTimeMillis() + ".xlsx";// 与文件想关联的写对象 使用try-with-resources语句确保ExcelWriter资源在使用后能被正确关闭try (ExcelWriter writer = EasyExcel.write(name, Employee.class).build()) {// 准备一个表对象 设置写入的Sheet信息WriteSheet sheet = EasyExcel.writerSheet("批量写练习").build();// 循环三次,每次写入10000条员工数据// 利用writer向sheet表写数据for (int i = 1; i <= 3; i++) {writer.write(data(100), sheet);}}}// 准备测试数据的方法private List<Employee> data(int i) {List<Employee> list = new ArrayList<>();for (int j = 1; j <= i; j++) {list.add(new Employee(j,"测试数据"+j,6.6*j,new Date()));}return list;}
}
效果演示

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

  • 利用阿里提供的模版写数据

  • 模版设置的样式新添加的数据会自动包含样式

2.按模版填充单个对象数据

  • 编写模型类并加入注解

  • 按要求编写模版文件

  • 调用官方API完成写功能

EasyExcel.write(fileName).withTemplate(templateFileName).sheet().doFill(fillData);
代码示例
效果演示

3.按模版批量填充多个对象数据

  • 编写模型类并加入注解

  • 按要求编写模版文件

  • 调用官方API完成写功能

try (ExcelWriter excelWriter = EasyExcel.write(fileName).withTemplate(templateFileName).build()) {WriteSheet writeSheet = EasyExcel.writerSheet(0).build();WriteSheet writeSheet2 = EasyExcel.writerSheet("数据2").build();excelWriter.fill(data(300000), writeSheet);excelWriter.fill(data(300000), writeSheet2);}
代码示例
package com.ithiema.write;
​
import com.alibaba.excel.EasyExcel;
import com.ithiema.pojo.Employee;
import com.ithiema.utils.TestFileUtil;
import org.junit.Test;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
​
/*根据模版写数据*/
public class FillWriter {/*** 使用EasyExcel框架通过模板填充数据至新Excel文件** 此方法将从指定的模板文件读取样式和结构,然后填充20条数据(由data(20)方法提供)到名为"1025"的工作表中,* 并保存到新的Excel文件中,文件名中包含系统当前时间戳以确保唯一性。*/@Testpublic void testFill(){// 模板文件的绝对路径String templateFileName = "D:\\develop\\dev\\easyexcel-course\\easyExcel-heima\\QuickStart\\target\\模板.xlsx";// 目标文件的绝对路径,包含时间戳确保文件名唯一String fileName = "D:\\develop\\dev\\easyexcel-course\\easyExcel-heima\\QuickStart\\target\\"+System.currentTimeMillis()+ "按照模版写数据.xlsx";// 使用EasyExcel框架,指定目标文件、模板文件和工作表名称进行数据填充EasyExcel.write(fileName).withTemplate(templateFileName).sheet("1025").doFill(data(20));}// 准备测试数据的方法private List<Employee> data(int i) {List<Employee> list = new ArrayList<>();for (int j = 1; j <= i; j++) {list.add(new Employee(j,"测试数据"+j,6.6*j,new Date()));}return list;}
}
 

4.自定义监听器读海量(百万级别)数据并监控内存消耗

  • 编写模型类并加入注解

  • 自定义监听器

  • 调用官方API完成写功能

EasyExcel.read(fileName, IndexOrNameData.class, new IndexOrNameDataListener()).sheet().doRead();
代码示例
EmployeeDao
package com.ithiema.dao;
​
import com.ithiema.pojo.Employee;
​
import java.util.List;
​
public class EmployeeDao {public void saveData(List<Employee> list){System.out.println("模拟保存数据..."+list.size());}
}
​
EmployeeListener
/*** EmployeeListener 类实现了 ReadListener 接口,用于处理 Excel 文件读取过程中的数据事件。* 主要功能是在读取每行数据时将其添加到一个列表中,当列表达到预设大小时批量保存数据到数据库,* 并在读取完成后处理剩余未达批次的数据。*/
public class EmployeeListener implements ReadListener<Employee> {
​/*** 批量保存数据的阈值,默认为 100 条记录。*/private int count = 100;
​/*** 数据访问对象,用于与数据库交互,执行数据保存操作。*/private EmployeeDao dao;
​/*** 临时存储读取数据的列表,达到预设大小后清空并批量保存。*/private List<Employee> list = new ArrayList<>(count);
​/*** 构造函数,初始化数据访问对象。** @param dao 数据访问对象,用于数据的持久化操作。*/public EmployeeListener(EmployeeDao dao) {this.dao = dao;}
​/*** 计数器,用于监控批量保存次数,每 100 批次调用一次垃圾回收。*/int c = 0;
​/*** 当解析一行数据时调用此方法。* 将读取到的 Employee 对象添加到 list 中,当 list 达到预设大小时,调用 dao 的 saveData 方法批量保存数据,* 并重新初始化 list。** @param employee       解析得到的 Employee 对象。* @param analysisContext 分析上下文,包含解析过程中的相关信息。*/@Overridepublic void invoke(Employee employee, AnalysisContext analysisContext) {list.add(employee);if(list.size() >= count){dao.saveData(list);list = new ArrayList<>(count);c++;if(c % 100 == 0){System.gc(); // 每 100 批次调用一次垃圾回收,优化内存使用。}}}
​/*** 在所有数据解析完成后调用此方法。* 处理剩余未达批次的数据,即当读取完成时 list 中可能还存在未保存的数据,此时将它们全部保存到数据库。** @param analysisContext 分析上下文,包含解析过程中的相关信息。*/@Overridepublic void doAfterAllAnalysed(AnalysisContext analysisContext) {if(list.size() > 0){dao.saveData(list); // 保存剩余数据。}}
}
MyRead
package com.ithiema.read;
​
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelReader;
import com.alibaba.excel.read.metadata.ReadSheet;
import com.ithiema.EmployeeListener.EmployeeListener;
import com.ithiema.dao.EmployeeDao;
import com.ithiema.pojo.Employee;
import com.ithiema.utils.TestFileUtil;
import org.junit.Test;
​
/*使用自定义监听器读数据*/
public class MyRead {
​// 读单表@Testpublic void testRead(){String filename = TestFileUtil.getPath() + "3万.xlsx";ExcelReader reader = EasyExcel.read(filename, Employee.class,new EmployeeListener(new EmployeeDao())).build();ReadSheet sheet = EasyExcel.readSheet().build();reader.read(sheet);}
​@Testpublic void testRead3(){String filename = TestFileUtil.getPath() + "批量写数据1669108667435.xlsx";EasyExcel.read(filename, Employee.class, new EmployeeListener(new EmployeeDao())).sheet().doRead();}
}
​

五、EasyExcel综合应用

  1. 环境搭建

  2. 实现文件导入功能(采用异步上传并使用遮罩层)

  3. 实现文件导出功能(采用同步下载并解决文件名中文乱码)

代码gitee地址:

EasyExcel: 阿里EasyExcel学习记录

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

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

相关文章

心灵调整:音乐之美

音乐每天都在不同的空间和复杂的形式影响着人们。从电梯音乐削减尴尬的沉默,到家庭交通堵塞。音乐增强了人们所爱的人与人之间的瞬间,并帮助他们度过艰难时期。音乐被用于世界各地几代人的各种形式的治疗。本文进一步阐述了它如何在几种类型的心理健康状况中得到应用。 什么是音…

【SOC 芯片设计 DFT 学习专栏 -- DFT DRC规则检查】

请阅读【嵌入式及芯片开发学必备专栏】 请阅读【芯片设计 DFT 学习系列 】 如有侵权&#xff0c;请联系删除 转自&#xff1a; 芯爵ChipLord 2024年07月10日 12:00 浙江 文章目录 概述DRC的概念Tessent DRC检查的概述时钟相关检查扫描相关检查BIST规则检查预DFT时钟规则检查 …

SQL优化(一)基础概念

基数&#xff08;cardinality&#xff09; 表中某个列的唯一键的数量叫做基数&#xff0c;主键列的基数就是表中数据的总行数。 可以用select count(distinct 列名) from 表名来计算基数。 基数的高低影像列的数据分布。 例如&#xff1a;先用Scott账户创建一个测试表test …

设计模式15-门面模式

设计模式15-门面模式 "接口隔离"模式典型模式1. 适配器模式&#xff08;Adapter Pattern&#xff09;2. 装饰模式&#xff08;Decorator Pattern&#xff09;3. 桥接模式&#xff08;Bridge Pattern&#xff09;4. 代理模式&#xff08;Proxy Pattern&#xff09;5. …

Git基本原理介绍及常用指令

文章目录 前言一、Git是什么&#xff1f;集中化的版本控制系统分布式版本控制系统 二、Git基本概念三、git命令操作配置用户信息常用指令 总结 前言 如果你用Microsoft Word写过论文&#xff0c;那你一定有这样的经历&#xff1a;想删除一个段落&#xff0c;又怕将来想恢复找不…

linux:用户管理,增删改

1.查看当前登录的用户信息 [root@bgx ~]# id #查看当前所登陆的用户信息 # uid:用户id,系统只能识别uid,不能识别名字,人看名字 # gid:组id uid=0(root) gid=0(root) groups=0(root) [root@bgx ~]# id oldboy #查看其它用户的信息 uid=1000(oldboy) gid=1000(oldboy) g…

【Linux】2.Linux 指令大揭秘:常见八个指令的妙用(上)

欢迎来到 CILMY23 的博客 &#x1f3c6;本篇主题为&#xff1a;Linux 指令大揭秘&#xff1a;常见八个指令的妙用&#xff08;上&#xff09; &#x1f3c6;个人主页&#xff1a;CILMY23-CSDN博客 &#x1f3c6;系列专栏&#xff1a;Python | C | C语言 | 数据结构与算法 | …

千万别从系统中创建线程, 看看从线程池中调用的线程的效率(1)

本篇会加入个人的所谓鱼式疯言 ❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言 而是理解过并总结出来通俗易懂的大白话, 小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的. &#x1f92d;&#x1f92d;&#x1f92d;可能说的不是那么严谨.但小编初心是能让更多人…

Web3.js 4.x版本事件监听详解:从HTTP到WebSocket的迁移

项目场景 在一个使用以太坊区块链技术的项目中&#xff0c;需要监听智能合约的事件&#xff0c;以便在事件触发时能够及时响应。项目中使用了web3.js库的4.x版本&#xff0c;节点使用Geth启动&#xff0c;并通过HTTP与节点进行通信。 问题描述 合约DataStorage.sol文件已经定…

学习c语言第16天(数据的存储)

一、数据类型的介绍 c语言基本的内置类型 类型的意义&#xff1a; 1.使用这个类型开辟内存空间的大小(大小决定了使用范围) 2.如何看待内存空间的视角 1.类型的基本归类 整形家族 字符的本质是ASCII码值&#xff0c;是整形 int a等于 signed int a char稍微特殊一些…

新书速览|动手学PyTorch建模与应用:从深度学习到大模型

《动手学PyTorch建模与应用&#xff1a;从深度学习到大模型》 本书内容 《动手学PyTorch建模与应用:从深度学习到大模型》是一本从零基础上手深度学习和大模型的PyTorch实战指南。《动手学PyTorch建模与应用:从深度学习到大模型》共11章&#xff0c;第1章主要介绍深度学习的概念…

Python --Pandas库基础方法(2)

文章目录 Pandas 变量类型的转换查看各列数据类型改变数据类型 重置索引删除行索引和切片seriesDataFrame取列按行列索引选择loc与iloc获取 isin()选择query()的使用排序用索引排序使用变量值排序 修改替换变量值对应数值的替换 数据分组基于拆分进行筛选 分组汇总引用自定义函…

优思学院|抽样检验的概念和21种抽样方式

抽样检验的概念 根据事先制定的抽样方案&#xff0c;从一批产品中随机抽取一部分作为样品&#xff0c;以这部分样品的检验结果&#xff0c;对整批产品质量合格与否作出判定的活动过程&#xff0c;称为抽样检验。除了用于质量控制之外&#xff0c;抽样检验同样适用于在六西格玛…

AI工作流程设计的自动化优化:微软与斯坦福的新成果 - Trace

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

学习网络安全 为什么Linux首择Kali Linux? 以及如何正确的使用Kali Linux

1.什么是kali linux&#xff1f; Kali Linux是一款基于Debian的Linux发行版&#xff0c;主要用于网络安全测试和渗透测试。它由全球顶尖的安全专家和黑客社区维护开发&#xff0c;提供了丰富的工具和资源&#xff0c;用于测试安全性、漏洞利用和渗透测试。此外&#xff0c;Kal…

修复msvcp120.dll丢失的问题的几种简单方法,msvcp120.dll是什么

在使用电脑时&#xff0c;你可能会遭遇一个提示称“msvcp120.dll丢失”的错误信息。这个问题比较普遍&#xff0c;主要是因为你的系统中缺失了某个特定的动态链接库&#xff08;DLL&#xff09;文件。msvcp120.dll是由 Microsoft Visual C 可再发行包提供的关键文件&#xff0c…

一键切换阿里yum源(包括其他系统repo镜像查找方法)

一键切换阿里yum源 示例命令其他系统repo镜像GitHub文档 示例命令 # 备份旧源 mv CentOS-Base.repo CentOS-Base.repo.bak # 添加新源(阿里镜像源) wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo其他系统repo镜像 这里的示例是用…

链表篇-02.从尾到头打印链表(反转链表)

解题思路&#xff1a; 链表从尾到头打印链表, 我的思路是 用三个指针,第一个指针(pre)指向指向头节点的前一个位置&#xff0c;第二个指针(cur)指向头节点&#xff0c; 然后依次往后执行&#xff0c;第三个指针用于临时记录第二个指针的下一个位置。 代码详情: import java.…

2024年中职云计算实验室建设及云计算实训平台整体解决方案

随着信息技术的飞速发展&#xff0c;云计算作为新一代信息技术的核心&#xff0c;正逐步渗透到各行各业&#xff0c;成为推动数字化转型的重要力量。为了适应这一趋势&#xff0c;中职教育作为技能型人才培养的重要阵地&#xff0c;亟需加强云计算实验室建设与云计算实训平台的…

【Linux】CentOS更换国内阿里云yum源(超详细)

目录 1. 前言2. 打开终端3. 确保虚拟机已经联网4. 备份现有yum配置文件5. 下载阿里云yum源6. 清理缓存7. 重新生成缓存8. 测试安装gcc 1. 前言 有些同学在安装完CentOS操作系统后&#xff0c;在系统内安装比如&#xff1a;gcc等软件的时候出现这种情况&#xff1a;&#xff08…