easyexcel 图片_EasyExcel 入门

db8cbe19509c8426158b123f7872c092.gif

因为最近在项目中用到了阿里巴巴的easy excel,然后去b

站学习了一下,看了黑马的公开课教程,然后自己再clone了easy excel的源码,

以下是b站的课堂笔记分享,基本够用...

一、初识 EasyExcel

1. Apache POI

先说 POI,有过报表导入导出经验的同学,应该听过或者使用。

ApachePOI是Apache软件基金会的开源函式库,提供跨平台的 JavaAPI实现 MicrosoftOffice格式档案读写。但是存在如下一些问题:

1.1 学习使用成本较高

对POI有过深入了解的才知道原来POI还有SAX模式(Dom解析模式)。但SAX模式相对比较复杂,excel有03和07两种版本,两个版本数据存储方式截然不同,sax解析方式也各不一样。

想要了解清楚这两种解析方式,才去写代码测试,估计两天时间是需要的。再加上即使解析完,要转换到自己业务模型还要很多繁琐的代码。总体下来感觉至少需要三天,由于代码复杂,后续维护成本巨大。

POI的SAX模式的API可以一定程度的解决一些内存溢出的问题,但是POI还是有一些缺陷,比如07版Excel解压缩以及解压后存储都是在内存中完成的,内存消耗依然很大,一个3M的Excel用POI的SAX解析,依然需要100M左右内存。

1.2 POI的内存消耗较大

大部分使用POI都是使用他的userModel模式。userModel的好处是上手容易使用简单,随便拷贝个代码跑一下,剩下就是写业务转换了,虽然转换也要写上百行代码,相对比较好理解。然而userModel模式最大的问题是在于非常大的内存消耗,一个几兆的文件解析要用掉上百兆的内存。现在很多应用采用这种模式,之所以还正常在跑一定是并发不大,并发上来后一定会OOM或者频繁的full gc。

总体上来说,简单写法重度依赖内存,复杂写法学习成本高。

特点
  1. 功能强大

  2. 代码书写冗余繁杂

  3. 读写大文件耗费内存较大,容易OOM

2. EasyExcel

2.1 重写了POI对07版Excel的解析
  • EasyExcel重写了POI对07版Excel的解析,可以把内存消耗从100M左右降低到10M以内,并且再大的Excel不会出现内存溢出,03版仍依赖POI的SAX模式。

  • 下图为64M内存1分钟内读取75M(46W行25列)的Excel(当然还有急速模式能更快,但是内存占用会在100M多一点)

75fd0f8997effd9f2de9f77a15bd65f4.png

  • 在上层做了模型转换的封装,让使用者更加简单方便

特点
  1. 在数据模型层面进行了封装,使用简单

  2. 重写了07版本的Excel的解析代码,降低内存消耗,能有效避免OOM

  3. 只能操作Excel

  4. 不能读取图片

二、快速入门--QuickStart

0、导入依赖坐标

com.alibaba

easyexcel

2.1.6

org.projectlombok

lombok

1.18.10

junit

junit

4.12

导入 easyexcel-2.1.6坐标的时候,以依赖传递导入 poi-3.17的POI。如果 ·

1、最简单的读

1.1、需求、准备工作

/**

* 需求:单实体导入

* 导入Excel学员信息到系统。

* 包含如下列:姓名、性别、出生日期

* 模板详见:杭州黑马在线202003班学员信息.xls

*/

// 杭州黑马在线202003班学员信息.xls文件

1.2、编写导出数据的实体

// 基于lombok

@Data

@NoArgsConstructor

@AllArgsConstructor

public class Student {

/**

* 学生姓名

*/

private String name;

/**

* 学生性别

*/

private String gender;

/**

* 学生出生日期

*/

private Date birthday;

/**

* id

*/

private String id;

}

1.3、 读取 Excel文件

调用 EasyExcelAPI读取的 Excel文件的测试类 StudentReadDemo

package com.itheima.demo;

import com.alibaba.excel.EasyExcel;

import com.alibaba.excel.read.builder.ExcelReaderSheetBuilder;

import com.itheima.domain.Student;

import com.itheima.listener.StudentReadListener;

import java.io.FileNotFoundException;

/**

* @Author Vsunks.v

* @Date 2020/3/11 23:28

* @Description:

*/

public class StudentReadDemo {

public static void main(String[] args) throws FileNotFoundException {

// 读取文件,读取完之后会自动关闭

/*

pathName 文件路径;"d:\\杭州黑马在线202003班学员信息.xls"

head 每行数据对应的实体;Student.class

readListener 读监听器,每读一样就会调用一次该监听器的invoke方法

sheet方法参数:工作表的顺序号(从0开始)或者工作表的名字,不传默认为0

*/

// 封装工作簿对象

ExcelReaderBuilder workBook = EasyExcel.read

("d:\\杭州黑马在线202003班学员信息.xls", Student.class, new StudentReadListener());

// 封装工作表

ExcelReaderSheetBuilder sheet1 = workBook.sheet();

// 读取

sheet1.doRead();

}

}

读取Excel的监听器,用于处理读取产生的数据

package com.itheima.listener;

import com.alibaba.excel.context.AnalysisContext;

import com.alibaba.excel.event.AnalysisEventListener;

import com.itheima.domain.Student;

/**

* @Author Vsunks.v

* @Date 2020/3/11 23:12

* @Description:

*/

public class StudentReadListener extends AnalysisEventListener<Student> {

// 每读一样,会调用该invoke方法一次

@Override

public void invoke(Student data, AnalysisContext context) {

System.out.println("data = " + data);

log.info(data + "保存成功");

}

// 全部读完之后,会调用该方法

@Override

public void doAfterAllAnalysed(AnalysisContext context) {

// TODO......

}

}

2、最简单的写

2.1 需求、准备工作

/**

* 需求:单实体导出

* 导出多个学生对象到Excel表格

* 包含如下列:姓名、性别、出生日期

* 模板详见:杭州黑马在线202003班学员信息.xlsx

*/

2.2、编写导出数据的实体

// 使用lombok

package com.itheima.domain;

</
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值