EasyExcel的基本使用方法
在Java语言领域,说到Excel处理工具,大家首先想到的可能是阿帕奇的poi,poi在处理数据量不大的excel文件上确实非常强大,但是随着后来excel从03(一个excel文件中最多有65536行,256列)版升级到07 版(一个excel文件最多1048576行,16384列),poi在处理大数据量的excel时显得力不从心,03版的excel poi可以应对,但是对于行数几乎增加了15倍,列数增加了接近50倍的07版excel,poi很快达到了瓶颈,这是因为poi在处理excel时会将数据全部导入内存再进行数据的加工处理,当数据量过大内存很容易OOM。但是即便如此,poi在处理excel方面还是无人能及,后来在Alibaba的改造和包装下,EsayExcel应运而生,它首先解决的就是poi的OOM问题,为了解决这个问题,easyExcel对数据载入内存的处理思想相比于poi发生了改变,poi的思路是空间换时间(减少载入内存次数从而节约时间),而easyExcel的思路是时间换空间(运用sax模式一行一行解析,并将一行的解析结果以观察者的模式通知处理),这样就很好的解决了OOM问题,EasyExcel还有很多优点,比如容易上手,相比poi来说easyExcel对里面许多方法进行了封装,运用起来更加快捷方便。
说excel最重要的操作一定属上传和下载了,上传是什么呢?下载又是什么呢?这些名词我们听的很多,但是可能并没有真正理解,用通俗一点的说法来说就是——上传指的是将Excel中的数据读取到数据库表中并存储起来,下载指的是将数据库中的数据导出到Excel文件中,当然,数据仓库不一定是数据库,还可以是其它,像redis这种也是可以的。这样我们就知道数据从哪里出发,终点在哪里了,是不是没有刚才那么迷茫了呢。接下来就上菜吧,菜名就是easyExcel,语言使用java语言,编译器是IDEA 2019。
1.通过easyExcel读取xlsx文件中的信息
有如下excel待读取:
编码大体分为两步,第一步创建文件的属性PoJo类DemoData(还有book类):
package com.zzb.business.card.excel;
import com.alibaba.excel.annotation.ExcelProperty;
import com.zzb.business.edison.excel.metadata.BaseRowModel;
import lombok.Data;
@Data
public class DemoData {
@ExcelProperty("编号")
private int no;
@ExcelProperty("朝代")
private String dynasty;
@ExcelProperty("开朝人")
private String king;
}
第二步创建第一步创建的pojo类的listener(还有book对应的listener):
package com.zzb.business.card.excel;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.fastjson.JSON;import java.util.ArrayList;
import java.util.List;public class DemoDataListener extends AnalysisEventListener<DemoData> {
List<DemoData> list = new ArrayList<DemoData>();
/**
* 如果使用了spring,请使用这个构造方法。每次创建Listener的时候需要把spring管理的类传进来
*/
public DemoDataListener() {}
/**
* 这个每一条数据解析都会来调用
*
* @param data
* @param context
*/
@Override
public void invoke(DemoData data, AnalysisContext context) {
System.out.println( JSON.toJSONString(data));
list.add(data);
} /**
* 所有数据解析完成了 都会来调用
*
* @param context
*/
@Override
public void doAfterAllAnalysed(AnalysisContext context) {
System.out.println(JSON.toJSONString(list));
}
}
这样,大体代码就已经写好了,接下来test
@Test
public void readExcelShouldSuccess(){
String fileName="src/main/resources/templates/dynasty.xlsx";
EasyExcel.read(fileName, DemoData.class,new DemoDataListener()).sheet("朝代表").doRead();
EasyExcel.read(fileName, Book.class,new BookDataListener()).sheet("书籍信息").doRead();
}
}
如果多个sheet的结构是一样的,那么可以用doReadAll()方法读取多个sheet:
EasyExcel.read(fileName, DemoData.class, new DemoDataListener()).doReadAll();
文件内容存储在list中,输出如下:
2.通过esayExcel将数据简单写入同一个Excel中(class类型不变)
此处的数据使用List来模拟:

//以list模拟数据库中导出的数据,因为list是excel操作时的桥梁
List<Book> sheetOne=new ArrayList<>();
Book book1=new Book();
book1.setNo();
book1.setAuthor("老舍");
book1.setBookName("三味书屋");
Book book2=new Book();
book2.setNo();
book2.setBookName("钢铁是怎样炼成的");
book2.setAuthor("奥斯特洛夫斯基");
sheetOne.add(book1);
sheetOne.add(book2);
接下来写入一个sheet数据,这种写法只能写入一个sheet中的数据,如果再在同一个文件中写入其它sheet,前边的所有sheet都会被覆盖,只保留最后一个sheet的数据:
EasyExcel.write(fileName,Book.class).sheet(1,"书籍列表").doWrite(sheetOne);
结果如下:
3.easyExcel写入多个sheet到同一个文件(sheet类型变动)
@Test
public void writeComflixbelExcelShouldSuccess(){
//以list模拟数据库中导出的数据,因为list是excel操作时的桥梁
List<Book> books=new ArrayList<>();
List<DemoData> dynastys=new ArrayList<>();
Book book1=new Book(); book1.setNo();
book1.setAuthor("老舍");
book1.setBookName("三味书屋");
Book book2=new Book();
book2.setNo();
book2.setBookName("钢铁是怎样炼成的");
book2.setAuthor("奥斯特洛夫斯基");
books.add(book1);
books.add(book2);
DemoData dynasty=new DemoData();
dynasty.setNo();
dynasty.setDynasty("宋朝");
dynasty.setKing("赵匡胤");
dynastys.add(dynasty);
String fileName="src/main/resources/templates/book.xlsx";
ExcelWriter excelWriter=null;
excelWriter = EasyExcel.write(fileName).build();
//写入多格式sheet只需要指定文件名,不用指定class类型
for (int i = ; i < ; i++) {
if((i&)==){
// 每次都要创建writeSheet 这里注意必须指定sheetNo 而且sheetName必须不一样。这里注意DemoData.class 可以每次都变,我这里为了方便 所以用的同一个class 实际上可以一直变
WriteSheet writeSheet = EasyExcel.writerSheet(i, "朝代" + i).head(DemoData.class).build();
// 分页去数据库查询数据 这里可以去数据库查询每一页的数据
excelWriter.write(dynastys, writeSheet);
}else{
WriteSheet writeSheet = EasyExcel.writerSheet(i, "书籍" + i).head(Book.class).build();
// 分页去数据库查询数据 这里可以去数据库查询每一页的数据
excelWriter.write(books, writeSheet);
}
}
excelWriter.finish();
}
结果如下:
EasyExcel的基本使用方法的更多相关文章
- EasyExcel 轻松灵活读取Excel内容
写在前面 Java 后端程序员应该会遇到读取 Excel 信息到 DB 等相关需求,脑海中可能突然间想起 Apache POI 这个技术解决方案,但是当 Excel 的数据量非常大的时候,你也许发现, ...
- EasyExcel随笔
EasyExcel 注意点 不支持的功能 单个文件的并发写入.读取 读取图片 宏 csv读取 出现 NoSuchMethodException, ClassNotFoundException, NoC ...
- javaSE27天复习总结
JAVA学习总结 2 第一天 2 1:计算机概述(了解) 2 (1)计算机 2 (2)计算机硬件 2 (3)计算机软件 2 (4)软件开发(理解) 2 (5) ...
- 【Easyexcel】java导入导出超大数据量的xlsx文件 解决方法
解决方法: 使用easyexcel解决超大数据量的导入导出xlsx文件 easyexcel最大支持行数 1048576. 官网地址: https://alibaba-easyexcel.github. ...
- 阿里巴巴excel工具easyexcel 助你快速简单避免OOM
Java解析.生成Excel比较有名的框架有Apache poi.jxl.但他们都存在一个严重的问题就是非常的耗内存,poi有一套SAX模式的API可以一定程度的解决一些内存溢出的问题,但POI还是有 ...
- 阿里 EasyExcel 使用及避坑
github地址:https://github.com/alibaba/easyexcel 原本在项目中使用EasyPoi读取excel,后来为了统一技术方案,改用阿里的EasyExcel.EasyE ...
- EasyExcel导入工具(SpringMVC下使用)
easyExcel:由阿里巴巴公司开发,由github托管 github上有详细使用文档 github地址:https://github.com/alibaba/easyexcel/blob/mast ...
- 阿里 EasyExcel 7 行代码优雅地实现 Excel 文件生成&下载功能
欢迎关注个人微信公众号: 小哈学Java, 文末分享阿里 P8 资深架构师吐血总结的 <Java 核心知识整理&面试.pdf>资源链接!! 个人网站: https://www.ex ...
- Excel解析easyexcel工具类
Excel解析easyexcel工具类 easyexcel解决POI解析Excel出现OOM <!-- https://mvnrepository.com/artifact/com.alibab ...
随机推荐
- 数据可视化之powerBI技巧(十六)采悟:PowerBI作图技巧:动态显示可视化标题
默认情况下,PowerBI图表的标题是静态的,为了增强图表的可读性,通过设置动态标题,可快速展示关键信息.提升沟通效率.本文通过两个简单的例子来看看PowerBI中如何创建动态标题. /01/ 拿之前 ...
- 04-Python函数
一.简介 函数是可重用的程序代码块.函数的作用,不仅可以实现代码的复用,更能实现代码的一致性.一致性指的是,只要修改函数的代码,则所有调用该函数的地方都能得到体现. 函数用关键字def来定义,def关 ...
- 基于ConcurrentHashMap的本地缓存
基于ConcurrentHashMap的本地缓存 在系统中,有些数据,数据量小,但是访问十分频繁(例如国家标准行政区域数据),针对这种场景,需要将数据搞到应用的本地缓存中,以提升系统的访问效率,减少无 ...
- 关于Java8的精心总结
前言 最近公司里比较新的项目里面,看到了很多关于java8新特性的用法,由于之前自己对java8的新特性不是很了解也没有去做深入研究,所以最近就系统的去学习了一下,然后总结了一篇文章第一时间和大家 ...
- LESS实战::not与:hover混合使用
举个例子,有个HTML是这样的. <div class="item light">A</div> <div class="item" ...
- 记一次公司JVM堆溢出抽丝剥茧定位的过程
背景 公司线上有个tomcat服务,里面合并部署了大概8个微服务,之所以没有像其他微服务那样单独部署,其目的是为了节约服务器资源,况且这8个服务是属于边缘服务,并发不高,就算宕机也不会影响核心业务. ...
- 解决win10安装flask-mysqldb报错 Python2.7
win10上安装的pycharm,在pycharm创建的py2.7虚拟环境中安装flask-sqlalchemy 执行pip install flask-mysqldb报错 error: Micros ...
- [翻译]ASP.NET Core在 .NET 5 Preview 7的更新
.NET 5 Preview 7现在可以用了,可以进行评估了.这是此版本中的新增功能: Blazor WebAssembly应用程序现在针对.NET 5 更新了Blazor WebAssembly的调 ...
- 目前解决移动端1px边框最好的方法
在移动端开发时,经常会遇到在视网膜屏幕中元素边框变粗的问题.本文将带你探讨边框变粗问题的产生原因及介绍目前市面上最好的解决方法. 1px 边框问题的由来 苹果 iPhone4 首次提出了 Retina ...
- linux命令笔记记录(自用)
1.解除yum锁定: sudo rm -rf /var/run/yum.pid 2.删除文件夹: rm -rf /var/log/httpd/access 3.更新pip: python -m pip ...