1、为什么用?
Java解析、生成Excel比较有名的框架有Apache poi、jxl。但他们都存在一个严重的问题就是非常的耗内存,poi有一套SAX模式的API可以一定程度的解决一些内存溢出的问题,但POI还是有一些缺陷,比如07版Excel解压缩以及解压后存储都是在内存中完成的,内存消耗依然很大。easyexcel重写了poi对07版Excel的解析,能够原本一个3M的excel用POI sax依然需要100M左右内存降低到KB级别,并且再大的excel不会出现内存溢出,03版依赖POI的sax模式。在上层做了模型转换的封装,让使用者更加简单方便
2、easyexcel核心功能
*读任意大小的03、07版Excel不会OO]
*读Excel自动通过注解,把结果映射为java模型
*读Excel支持多sheet
*读Excel时候是否对Excel内容做trim()增加容错
*写小量数据的03版Excel(不要超过2000行)
*写任意大07版Excel不会OOM
*写Excel通过注解将表头自动写入Excel
*写Excel可以自定义Excel样式 如:字体,加粗,表头颜色,数据内容颜色
*写Excel到多个不同sheet
*写Excel时一个sheet可以写多个Table
*写Excel时候自定义是否需要写表头
3、版本
稳定版本为1.1.1,测试版到1.1.2,引入版本注意,如果有引入poi jar包的话不要和poi版本冲突,不然会有问题(已踩过坑,建议都用新版本就不会有问题)
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>1.1.1</version>
</dependency>
4、快速开始
1、创建项目,这里已 springboot 为例(目录结构和pom文件)
2、ExcelModel.java
其中 @ExcelProperty(value = “”, index = 0) index 代表该字段与 excel 对应列号做映射,
value 代表字段表头名称,支持层级表头
package com.easyexcel.demo;
import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.metadata.BaseRowModel;
public class ExcelModel extends BaseRowModel {
@ExcelProperty(value = "工号", index = 0)
private String id;
@ExcelProperty(value = "名字", index = 1)
private String name;
@ExcelProperty(value = "地址", index = 2)
private String address;
public void setId(String id) {
this.id = id;
}
public String getId() {
return id;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setAddress(String address) {
this.address = address;
}
public String getAddress() {
return address;
}
}
3、ExcelListerner.java
读取文件时候通过这个文件进行业务处理
package com.easyexcel.demo;
import java.util.ArrayList;
import java.util.List;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
/**
* 解析监听器,
* 每解析一行会回调invoke()方法。
* 整个excel解析结束会执行doAfterAllAnalysed()方法
*/
public class ExcelListerner extends AnalysisEventListener {
private List<Object> datas = new ArrayList<>();
@Override
public void invoke(Object object, AnalysisContext context) {
System.out.println("当前行:" + context.getCurrentRowNum());
System.out.println(object);
//数据存储到list,供批量处理,或后续自己业务逻辑处理。
datas.add(object);
//根据自己业务做处理
doSomething(object);
}
private void doSomething(Object object) {
//1、入库调用接口
}
@Override
public void doAfterAllAnalysed(AnalysisContext analysisContext) {
//解析结束销毁不用的资源
datas.clear();
}
public List<Object> getDatas() {
return datas;
}
public void setDatas(List<Object> datas) {
this.datas = datas;
}
}
4、ExcelModelTest.java
读和写测试
package com.easyexcel.demo;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import com.alibaba.excel.ExcelReader;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.excel.metadata.Sheet;
import com.alibaba.excel.support.ExcelTypeEnum;
@RunWith(SpringJUnit4ClassRunner.class)
public class ExcelModelTest {
@Test
public void write() throws IOException {
OutputStream out = new FileOutputStream("E:\\123.xlsx");
try {
List<ExcelModel> list = new ArrayList<>();
ExcelModel excelModel = new ExcelModel();
excelModel.setId("123456");
excelModel.setName("你好");
excelModel.setAddress("中国");
list.add(excelModel);
ExcelWriter excelWriter = new ExcelWriter(out, ExcelTypeEnum.XLSX);
Sheet sheet = new Sheet(1, 0, ExcelModel.class);
excelWriter.write(list, sheet);
excelWriter.finish();
}
catch (Exception e) {
e.printStackTrace();
}
finally {
out.close();
}
}
@Test
public void read() throws IOException {
InputStream inputStream = new FileInputStream(new File("E:\\123.xlsx"));
try {
AnalysisEventListener listener = new ExcelListerner();
ExcelReader excelReader = new ExcelReader(inputStream, ExcelTypeEnum.XLSX, null, listener);
excelReader.read(new Sheet(1, 1, ExcelModel.class));
}
catch (Exception e) {
e.printStackTrace();
}
finally {
inputStream.close();
}
}
}
以上就是对 excel 读写简单实用,自己再实用过程中还可以进行封装,在项目中更实用,还请各位大佬多多指教。