开发者学堂课程【微服务+全栈在线教育实战项目演练(SpringCloud Alibaba+SpringBoot):技术点-EasyExcel 实现写操作】学习笔记,与课程紧密连接,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/667/detail/11355
技术点-EasyExcel 实现写操作
内容介绍
一、EasyExcel 特点
二、用 EasyExcel 进行写的操作
一、EasyExcel 特点
1.Java 领域解析、 生成 Excel 比较有名的框架有 Apache poi、 jxl 等。
但他们都存在一 个严重的问题就是非常的耗内存。如果你的系统并发量不大的话可能还行,但是一旦并发上来后定会 OOM 或者 JVM 频繁的 Easy excel。
2.EasyExcel 是阿里巴巴开源的一个excel处理框架,以使用简单、节省内存著称。
EasyExcel 能大大减少占用内存的主 要原因是在解析 Excel 时没有将文件数据一一次性全部加载到内存中,而是从磁盘上行行读取数据,逐个解析。
3.EasyExcel 采用一 行行的解析模式,并将一行的解析结果以观察者的模式通知处理 ( AnalysisEventListener).
4.JAVA 解析 Excel 工具 easyexcel
Java 解析、生成 Excel 比较有名的框架有 Apache poi、jxd. 但他们都存在-一个严重的问题就是非常的耗内存,po 有一套 SAX 模式的 API 可以一定程度的解决一些内存溢出的问题,但 POI 还是有一 些缺陷,比如07版 Excel 解压缩以及解压后存储都是在内存中完成的,内存消耗依然很大。
easyexcel 重写 了 poi 对07版 Excel 的解析,能够原本一个3M 的 excel 用 POI sax 依然需要100M 左右内存降低到几 M,并且再大的 excel 不会出现内存溢出,03版依赖 POI 的 sax 模式。在上层做了模型转换的封装,让使用者更加简单方便。
5.Excel 是阿里巴巴提供一个针对Excel一个简单高效的一个框架,用它可以用最简单、最高效的实现对 Excel 的读和写操作。
二、用 EasyExcel 进行写的操作
创建一个普通的 maven 项目
项目名 : excel-easydemo
pom 中引入 xmI 相关依赖
<dependencies >
<dependency>
<groupId>com. alibaba</groupld>
<artifactId>easyexcel</artifactId>
<version>2. 1.1</version>
</dependency>
</dependencles>
第一步引入 EasyExcel 依赖
<
dependencies >
<dependency>
<groupId>com. alibaba</groupld>
<artifactId>easyexcel</artifactId>
<version>2. 1.1</version>
</dependency>
</dependencles>
再需要 poi 依赖
< dependency>
< groupId>org. apache. poi </groupId>
<artifactId>poi</artifactld>
< dependency>
<dependency>
<groupId>org. apache. poi </groupId>
<artifactld>poi-ooxml </artifactId>
</ dependency>
引入时需要 poi.version>3.17</point.version>
第二步做创建一个实体类和easyexcel对应,这一类要和sales里边数据要对应上
比如,一个叫一级分类,一个叫二级分类,
@Data
public class DemoData
{
//
设置
excel
表头名称
@ExcelProperty("
学生编号
")
private Integer sno;
@ExcelProperty("
学生姓名
")
private String sname;
}
第三步使用具体代码部分
package com. atguigu. demo. excel ;
import com alibaba. excel. Easy Excel;
public class TestEasyExcel {
public static void main(String[] args) {
//实现excel写的操作
//1设置导人文件夹地址和exce1文件名称
String filename = "F:\\write. xlsx":
//2调用 easyexcel 里面的方法实现写操作
package com. atguigu. demo. excel ;
import com alibaba. excel. Easy Excel;
public class TestEasyExcel {
public static void main(String[] args) {
//实现 excel 写的操作
//1设置导人文件夹地址和exce1文件名称
String filename = "F:\\write. xlsx":
//2调用 easyexcel 里面的方法实现写操作
//write方法两个参数:第一一个参数文件路径名称, 第二个参数实体类class
EasyExcel. write(filename, DemoData. class)
EasyExcel. urite(filename, DemoData class). sheet( sheetName: "
学生列表
" ).doWrite(getData()):
//创建方法返回list集合
private static List DemoData> getData<>()
List<DemoData> list . new ArrayList<>():
for (int i = 0; I < 10: i++)
DemoData data = new DemoData():
data. setSno(i) ;
data. setSname ("lucy"+i) :
list. add(data) :
}
return list:
这个 Excel 是写的一个操作,也就是说最终能生成一个 Excel 文件,并且里边会有内容。
首先设置一下,写入的文件夹的地址和Excel文件的名称。
比如一个 file name。Name 咱就等于它路径,那路径比如现在就写到这个 ABC1盘,就写到 F 盘,F 盘里面就写着路径,然后加上这个文件,比如就叫这个就叫 right。
第二步就是要用这一个词。XL 里边写错直接调方法就可以。这个方法在 right 中的两个参数,第一个是文件流,或者说文件名称,然后第二个是里面这个 class,也就是写到那个实体类的。
Write 方法中两个参数,第一个参数是以文件的路径名称,然后第二个参数是我们实体类的class,这个方法做完之后并没有写完,因为在一个 Excel 里边来看具体的。
向date中把数据一次放进去,它就两个值,一个是 s no name。都放下,这两只 S内部。
然后里面的值为了区分 ISO,里面就放了一个 APP,然后在 S 里面,比如说一个叫这个 Lucy,加上一个,让他每次都不要都传之后,最后再把它就放到例子里面去。
就这么一个构建,最后把它做一个反馈,这个例子集合里面放十个立项的一个循环,依次放就可以了,最后给他们,这个方法就最终完成了。最后把这效果再来试一下,看一下效果能做到什么事。
把这个服务器现在就给冻掉,直接启动,直接运行,运行之后,它在F盘里面建个文件夹,叫 right 这个名字,然后在文中有咱们刚才放的这些纸,因为我循环十次,最终里边有循环之后的十条数据。
实现最终的添加操作(写法一 )
public static vold main(String[] args) throws Exception {
//写法1
String fileName = "F:\\11.xlsx";
//这里需要指定写用哪个class去写,然后写到第一个sheet名字为模板然后文件流会自动关闭
//如果这里想使用03则传入excelType参数即可
EasyExcel .writer(filenameDemoData.class).sheet("
写入方法 一
")ddwrite(data());
}
实现最终的添加操作(写法二)
public static vold main(String[] args) throws Exception {
//写法2,方法二需要手动关闭流
String fileName = "F:\112. xlsx";
//这里需要指定写用那个class去写Excelwriter excelwriter =EasyE xcel .write (fileName,DemoData.class).buil
()
;
writeSheet writeSheet =EasyExcel .writerSheet("
写入方法二
"). build();
excelwriter .write(data(), writeSheet);
///千万別忘己finish会帮忙关闭流
excelwriter. finish();
第二种写法比第一种更加麻烦点,第一种方式中,写的过程中,最后它会自动关流,但是用第二种方式需要手动关闭,所以一般都用这种方式。