EasyExcel 框架使用-读
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 框架使用-读的更多相关文章
- appium 自动化测试框架详读(一)
		appium框架使用的过程记录,开始使用markdown来语法来编写,不知道博客园是否会支持markdown语法 ***1. appium原理* appium启动时,创建一个http://127.0. ... 
- C# 读App.config配置文件[2]: .Net Core框架
		C# 读App.config配置文件[1]:.Net Framework框架 C# 读App.config配置文件[2]: .Net Core框架 网上都是.net framework读取配置文件的方 ... 
- C# 读App.config配置文件[1]:.Net Framework框架
		C# 读App.config配置文件[1]:.Net Framework框架 C# 读App.config配置文件[2]: .Net Core框架 参考:https://www.cnblogs.com ... 
- 阿里巴巴excel工具easyexcel 助你快速简单避免OOM
		Java解析.生成Excel比较有名的框架有Apache poi.jxl.但他们都存在一个严重的问题就是非常的耗内存,poi有一套SAX模式的API可以一定程度的解决一些内存溢出的问题,但POI还是有 ... 
- POI和EasyExcel的使用
		1.POI使用 1.1 什么是POI POI简介(Apache POI),Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office ... 
- python 做接口自动化测试框架设计
		1,明确什么叫自动化测试,什么叫接口自动化测试,如何设计接口测试用例,已登录为例 自动化测试:解放人力来自动完成规定的测试. 自动化测试分层模型:UI层,不论WEB端还是移动端,都是基于页面元素的识别 ... 
- MapReduce实例&YARN框架
		MapReduce实例&YARN框架 一个wordcount程序 统计一个相当大的数据文件中,每个单词出现的个数. 一.分析map和reduce的工作 map: 切分单词 遍历单词数据输出 r ... 
- EasyExcel引入
		好久没更了,都在有道云上面记录,没时间搬过来. easyexcel是最近项目做优化涉及的一个改善点吧. 简介 导出是后台管理系统的常用功能,当数据量特别大的时候会内存溢出和卡顿页面,曾经自己封装过一个 ... 
- selenium+python自动化框架
		流程: 环境准备 eclipse :需安装pydev.testng插件 python :安装python完成后,需 pip下安装selenium:命令: pip install selenium 我现 ... 
随机推荐
- POJ2536 二分图匹配
			题意: 有n只老鼠,m个洞,每个洞最多可以藏一只老鼠,每个老鼠的移动速度都是v,给你他们的当前坐标,和洞的坐标,突然老鹰来了,他们必须在s秒内跑到一个洞藏起来,问你最少有多少只老鼠被抓走了. ... 
- [转载] 关于Win7 x64下过TP保护的一些思路,内核层过保护,驱动过保护
			首先特别感谢梦老大,本人一直没搞懂异常处理机制,看了他的教程之后终于明白了.在他的教程里我学到了不少东西.第一次在论坛发帖,就说说Win7 x64位下怎么过TP保护.如果有讲错的地方,还望指出.说不定 ... 
- (CV学习笔记)看图说话(Image Captioning)-1
			Background 分别使用CNN和LSTM对图像和文字进行处理: 将两个神经网络结合: 应用领域 图像搜索 安全 鉴黄 涉猎知识 数字图像处理 图像读取 图像缩放 图像数据纬度变换 自然语言处理 ... 
- 一个或多个listeners启动失败,更多详细信息查看对应的容器日志文件
			碰到这个问题很多次,每次碰到都是去百度找.但是,不尽人意,好在最后还是解决了,所以写下总结. 报错内容: org.apache.catalina.core.StandardContext.startI ... 
- 【maven和jdk】报错:系统找不到指定的文件
			创建一个maven项目出错 问题描述 在idea.log出现如下错误(系统找不到指定的文件,但是不知道指定文件是什么) com.intellij.execution.process.ProcessNo ... 
- idea设置js为ES6
- flex布局的使用
			一.Flex布局是什么? Flex是Flexible Box的缩写,意为"弹性布局",用来为盒状模型提供最大的灵活性. 任何一个容器都可以指定为Flex布局. .box{ disp ... 
- vue中的nextTick
			 今天在浏览elementUI官网时,又一次看到了nextTick,其实nextTIck我已经不是第一次看到了,但之前都没怎么弄懂,这次决定好好研究一番-- 异步说明 vue是异步执行DOM更新的. ... 
- 三分钟了解B2B CRM系统的特点
			最近很多朋友想了解什么是B2B CRM系统,说到这里小Z先来给大家说说什么是B2B--B2B原本写作B to B,是Business-to-Business的缩写.正常来说就是企业与企业之间的生意往来 ... 
- linux查看文件的编码格式的方法 set fileencoding PYTHON
			linux查看文件的编码格式的方法 set fileencoding 乱码原因:因为你的文件声明为utf-8,并且也应该是用utf-8的编码保存的源文件.但是windows的本地默认编码是cp93 ... 
