EasyExcel 框架使用

官方介绍:JAVA解析Excel工具EasyExcel

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

EasyExcel 版本

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

在EasyExcel 使用之前先要讲一下EasyExcel 的Listener

Listener 里有处理每一条数据的方法

ReadListener源码:

public interface ReadListener<T> extends Listener {
// 当解析抛出异常,会被此方法进行捕获
void onException(Exception exception, AnalysisContext context) throws Exception;
// 解析表数据的表头,headMap 默认表格第一行数据
void invokeHead(Map<Integer, CellData> headMap, AnalysisContext context);
// 讲一条数据解析后的对象 data,可以在这个方法中进行再次处理
void invoke(T data, AnalysisContext context);
// 官方介绍:返回额外信息调用,没使用过
void extra(CellExtra extra, AnalysisContext context);
// 解析完成后,会运行此方法
void doAfterAllAnalysed(AnalysisContext context);
// 校验是否继续解析,默认true
boolean hasNext(AnalysisContext context);
}

这个方法会有一个传入的泛型,就是将表格每一行数据解析成的对象

举个例子:如果我们就想转换成List,重写AnalysisEventListener(ReadListener的一个实现类)就可以将List 传入

我们就可以转换了,当然官方有一个默认List的实现 NoModelDataListener

但是你想获取解析表格的数据最好自己重写AnalysisEventListener,这样你能把我数据的处理流程

EasyExcel 使用

读数据

EasyExcel 读数据有许多不同的方法,我们使用NoModelDataListener来看一下可以怎么解析表格数据

public void test() {

    // file 可以是文件,可以是流,也可以是文件路径 但必须是.xsl或.xslx文件
File file = new File(""); // 读取读取传入excel文件中某一张表的数据
// 第一种:sheet() 默认(不传参数)为第一种表
// sheetNo 也可以指定第几张表,表以0开始计数
// sheetName 也可以指定表名
// 读取成功后文件流会自动关闭
EasyExcel.read(file,new NoModelDataListener()).sheet(0,"").doRead(); // 第一种:sheet() 默认为第一张表,也可以指定第几张表,表以0开始计数
ExcelReader reader = EasyExcel.read(file, new NoModelDataListener()).build();
// 第一种:readSheet() 默认(不传参数)为第一种表
// sheetNo 也可以指定第几张表,表以0开始计数
// sheetName 也可以指定表名
//sheet不能读取多次,多次读取需要重新读取文件
ReadSheet sheet = EasyExcel.readSheet().build();
reader.read(sheet);
// 记得关闭ExcelReader
reader.finish(); // EasyExcel 也可以替换成 EasyExcelFactory
// EasyExcel 继承 EasyExcelFactory,EasyExcel没有对EasyExcelFactory进行任何重写
// 所以EasyExcel与EasyExcelFactory相当于同一个类 // 读取读取传入excel文件,所有的表数据 // 第一种
// 但是如果解析失败抛出异常或者Listener的hasNext方法返回false后就不会继续往下执行
EasyExcel.read(file,new NoModelDataListener()).doReadAll(); // 第二种
// 但是如果解析失败抛出异常,停止解析但是会关闭一些excelReader的数据,需要重新新建excelReader才能继续循环执行
// Listener的hasNext方法返回false后就不会继续往下执行,不会出现上面的问题
ExcelReader excelReader = EasyExcel.read(file, new NoModelDataListener()).build();
List<ReadSheet> readSheets = excelReader.excelExecutor().sheetList();
for (ReadSheet readSheet : readSheets) {
excelReader.read(readSheet);
}
// 记得关闭ExcelReader
excelReader.finish(); }

自定义Listener

上面说了读取方式,下面说一下自定义Listener

其实我们可以封装一个通用的Listener

这是我自己封装的Listener

@Slf4j
public class DefaultExcelListener<T> extends AnalysisEventListener<T> {
// 解析后的数据
private final List<T> rows = new ArrayList();
// 解析表数据的表头,headMap 默认表格第一行数据
@Override
public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {
log.info("======================================================");
log.info("解析第一行数据:{}" + JSON.toJSONString(headMap));
log.info("======================================================"); } // 讲一条数据解析后的对象 data,将解析后的数据保存到 rows中
@Override
public void invoke(T object, AnalysisContext context) {
rows.add(object);
} // 读取完excel数据后的操作
@Override
public void doAfterAllAnalysed(AnalysisContext context) {
log.info("成功读取【" + rows.size() + "】条数据");
} // 在读取excel异常 获取其他异常下会调用本接口。抛出异常则停止读取。如果这里不抛出异常则 继续读取下一行。
@Override
public void onException(Exception exception, AnalysisContext context) {
System.out.println("解析失败,但是继续解析下一行:{}" + exception.getMessage());
} public List<T> getRows() {
return rows;
}
}

我们传入泛型对象(对象属性添加EasyExcel 注解)就可以进行解析,最后获取rows就可以得到解析后的数据

当然也可以根据自己的理解进行修改

使用中的问题

说一下在使用过程中遇到的问题

1.想要停止解析的问题

EasyExcel 想要解析需要抛出ExcelAnalysisStopException才能停止解析

例如你想检验表头,表头不匹配就不进行解析

 @Override
public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {
// 不匹配
throw new ExcelAnalysisStopException();
}

抛出异常后会被onException方法进行捕获

那就在onException中再抛出ExcelAnalysisStopException就可以抛出

@Override
public void onException(Exception exception, AnalysisContext context) {
if (exception instanceof ExcelAnalysisStopException) {
throw new ExcelAnalysisStopException("");
}
System.out.println("解析失败,但是继续解析下一行:{}" + exception.getMessage());
}

但是就一些的版本是不能抛出这个异常,onException会被上层进行捕获,重新抛 出一个异常

所以想要停止解析,通过hasNext是比较保险的

2.将表格中单元格数据进行转换成对象时,不会校验字符串“”

将单元格数据转换成对象使用有专门的转换器Converter

Converter接口

public interface Converter<T> {

    // 转换后对象的类型
Class supportJavaTypeKey(); // 单元格数据类型
CellDataTypeEnum supportExcelTypeKey(); // cellData单元格数据
// T转换后的对象
// 将单元格数据转化成对象:主要是读的时候使用
T convertToJavaData(CellData cellData, ExcelContentProperty contentProperty,
GlobalConfiguration globalConfiguration) throws Exception; // 将对象转化成对象单元格数据:主要是写的时候使用
CellData convertToExcelData(T value, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration)
throws Exception;
}

EasyExcel 有一些基础类型的默认转换器,也是继承Converter接口

如果我们需要自定义转换器也可以继承这个接口对方法进行重写

在EasyExcel 使用转换器的时候会默认使用String转基本对象的方法

但是其中没有进行对字符串""的校验,所以在转换Data等对象时会报错

我是自定义进行解决的,不知道是不是我使用方式不对,还是已经有解决但是我没有使用到,如果大家发现是我没有发现,希望能告诉我一下

EasyExcel 默认转换器都是使用自定义的基础类型utils进行转换

自定义Converter

说一下自定义Converter的使用

当我们自定义Converter后可以通过@ExcelProperty()指定对象中的某个属性使用自定义转换器

也可以在EasyExcel.read()后指定

  EasyExcel.read(fileName, ConverterData.class, new ConverterDataListener())
// 这里注意 我们也可以registerConverter来指定自定义转换器, 但是这个转换变成全局了, 所有java为string,excel为string的都会用这个转换器。
// 如果就想单个字段使用请使用@ExcelProperty 指定converter
.registerConverter(new CustomStringStringConverter())
// 读取sheet
.sheet().doRead();

@ExcelProperty()

用于属性:与表头进行匹配

value表头名称,可以配置多级表头

index表序列号

converter自定义转换器,将单元格数据转换成对象

到这里我们就可以使用EasyExcel 进行读取数据进行处理,目前我就使用到了EasyExcel 读取,后面使用到写数据再更新写出数据

EasyExcel 框架使用-读的更多相关文章

  1. appium 自动化测试框架详读(一)

    appium框架使用的过程记录,开始使用markdown来语法来编写,不知道博客园是否会支持markdown语法 ***1. appium原理* appium启动时,创建一个http://127.0. ...

  2. C# 读App.config配置文件[2]: .Net Core框架

    C# 读App.config配置文件[1]:.Net Framework框架 C# 读App.config配置文件[2]: .Net Core框架 网上都是.net framework读取配置文件的方 ...

  3. C# 读App.config配置文件[1]:.Net Framework框架

    C# 读App.config配置文件[1]:.Net Framework框架 C# 读App.config配置文件[2]: .Net Core框架 参考:https://www.cnblogs.com ...

  4. 阿里巴巴excel工具easyexcel 助你快速简单避免OOM

    Java解析.生成Excel比较有名的框架有Apache poi.jxl.但他们都存在一个严重的问题就是非常的耗内存,poi有一套SAX模式的API可以一定程度的解决一些内存溢出的问题,但POI还是有 ...

  5. POI和EasyExcel的使用

    1.POI使用 1.1 什么是POI POI简介(Apache POI),Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office ...

  6. python 做接口自动化测试框架设计

    1,明确什么叫自动化测试,什么叫接口自动化测试,如何设计接口测试用例,已登录为例 自动化测试:解放人力来自动完成规定的测试. 自动化测试分层模型:UI层,不论WEB端还是移动端,都是基于页面元素的识别 ...

  7. MapReduce实例&YARN框架

    MapReduce实例&YARN框架 一个wordcount程序 统计一个相当大的数据文件中,每个单词出现的个数. 一.分析map和reduce的工作 map: 切分单词 遍历单词数据输出 r ...

  8. EasyExcel引入

    好久没更了,都在有道云上面记录,没时间搬过来. easyexcel是最近项目做优化涉及的一个改善点吧. 简介 导出是后台管理系统的常用功能,当数据量特别大的时候会内存溢出和卡顿页面,曾经自己封装过一个 ...

  9. selenium+python自动化框架

    流程: 环境准备 eclipse :需安装pydev.testng插件 python :安装python完成后,需 pip下安装selenium:命令: pip install selenium 我现 ...

随机推荐

  1. IDEA 这样设置,好看到爆炸!!!

    Hello,大家好,我是楼下小黑哥. 今天这篇文章是次条视频的文案,这里推荐大家直接看视频学习. IDEA 这样设置,好看到爆炸!!!#01 今天这期我们来分享几个美化 IDEA 设置技巧,让你的 I ...

  2. Dubbo原理剖析 之 @DubboReference.version设置为*

    原文链接 Dubbo原理剖析 之 @DubboReference.version设置为* 1 背景 Dubbo在消费端提供了一个功能,即将消费者的版本号指定为*,那么不管服务端的接口版本是啥,都可以调 ...

  3. 『动善时』JMeter基础 — 12、JMeter取样器详解:sampler

    目录 1.取样器介绍 2.JMeter自带的取样器 3."HTTP请求"为例介绍一下取样器 (1)HTTP Request: (2)Web服务器: (3)HTTP请求: (4)同请 ...

  4. CAS指令

    原文链接:https://www.jianshu.com/p/00edb3d74a33   CAS是CPU的一条指令,其具有原子性,原子性是由CPU硬件层面保证的.   CAS原语有三个操作数--内存 ...

  5. SparkSQL电商用户画像(三)之环境准备

    五. 电商用户画像环境搭建 众所周知,Hive的执行任务是将hql语句转化为MapReduce来计算的,Hive的整体解决方案很不错,但是从查询提交到结果返回需要相当长的时间,查询耗时太长.这个主要原 ...

  6. Sping AOP

    Sping AOP 1.什么是AOP 面向切面编程(AOP) 是 面向对象编程的补充(OOP) 传统的业务处理代码中,通常会惊醒事务处理.日志处理等操作.虽然可以使用OOP的组合或继承来实现代码重用, ...

  7. 【BUAA软工】Beta阶段设计与计划

    一.需求再分析 根据用户反馈,是否发现之前的需求分析有偏差?为什么会出现这种偏差?beta阶段你们是否能真的分析清楚用户需求?如何做到? 根据alpha阶段同学们以及课程组老师和助教的使用反馈,总结起 ...

  8. memcache 和 redis 的区别

    1)Redis中,并不是所有的数据都一直存储在内存中的,这是和Memcache相比一个最大的区别.2)Redis在很多方面具备数据库的特征,或者说就是一个数据库系统,而Memcache只是简单的K/V ...

  9. 屌炸天的3D引擎OpenCASCADE的用法及案例(转载之处:)

    What CASCADE? Open CASCADE(简称OCC)平台是由法国Matra Datavision公司开发的CAD/CAE/CAM软件平台,可以说是世界上最重要的几何造型基础软件平台之一. ...

  10. ELK 在 MacOS( Big Sur) 上安装与配置步骤

    ELK学习笔记 - 安装篇 目录 ELK学习笔记 - 安装篇 1. ElasticSearch 1.1 发展历史及现状 1.2 ElasticSearch 的安装 2. Logstash 2.1 Lo ...