EasyExcel是阿里巴巴开源的一个excel处理框架,以使用简单、节省内存著称。
EasyExcel能大大减少占用内存的主要原因是在解析Excel时没有将文件数据一次性全部加载到内存中,而是从磁盘上一行行读取数据,逐个解析。
1、新建一个Maven项目
2、在pom.xml文件导入相关依赖
<dependencies>
<dependency>
<groupId>com.alibabagroupId>
<artifactId>easyexcelartifactId>
<version>2.1.1version>
dependency>
dependencies>
3、在代码中创建写入实体类(与Excel表对应)
import com.alibaba.excel.annotation.ExcelProperty;
//设置表头和添加的数据字段
public class Data {
//设置表头名称
@ExcelProperty("编号")
private int no;
//设置表头名称
@ExcelProperty("姓名")
private String name;
public int getNo() {
return no;
}
public void setNo(int no) {
this.no = no;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Data{" +
"no=" + no +
", name='" + name + '\'' +
'}';
}
}
4、新建一个测试类,生成数据并且写入Excel文件中
//循环设置要添加的数据,最终封装到list集合中
private static List<Data> data() {
List<Data> list = new ArrayList<Data>();
for (int i = 0; i < 10; i++) {
Data data = new Data();
data.setNo(i);
data.setName("张三"+i);
list.add(data);
}
return list;
}
import com.alibaba.excel.EasyExcel;
import java.util.ArrayList;
import java.util.List;
public class Test {
public static void main(String[] args) {
//定义写入的文件路径以及名字
String fileName = "F:\\demo.xlsx";
// 这里 需要指定写用哪个class去写,然后写到第一个sheet,名字为模板 然后文件流会自动关闭
EasyExcel.write(fileName, Data.class).sheet("写入").doWrite(data());
}
//循环设置要添加的数据,最终封装到list集合中
private static List<Data> data() {
List<Data> list = new ArrayList<Data>();
for (int i = 0; i < 10; i++) {
Data data = new Data();
data.setNo(i);
data.setName("张三"+i);
list.add(data);
}
return list;
}
}
我们以上面以及写入的excel表格为例,进行读取操作,并显示到控制台上
1、创建读取的实体类(与excel表对应)
import com.alibaba.excel.annotation.ExcelProperty;
public class ReadData {
//设置列对应的属性
@ExcelProperty(index = 0)
private int id;
//设置列对应的属性
@ExcelProperty(index = 1)
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "ReadData{" +
"id=" + id +
", name='" + name + '\'' +
'}';
}
}
2、新建一个监听器,前面说过,对读操作Easyexcel是逐行读取并返回,使用会设置监听器(观察者模式)
//创建读取excel监听器
public class ExcelListener extends AnalysisEventListener<ReadData> {
//创建list集合封装最终的数据
List<ReadData> list = new ArrayList<ReadData>();
//一行一行去读取excle内容
@Override
public void invoke(ReadData user, AnalysisContext analysisContext) {
//将读取到的数据输出到控制台
System.out.println("====="+user);
list.add(user);
}
//读取excel表头信息
@Override
public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {
System.out.println("表头信息:"+headMap);
}
//读取完成后执行
@Override
public void doAfterAllAnalysed(AnalysisContext analysisContext) {
}
}
3、测试代码
EasyExcel.read(fileName, ReadData.class, new ExcelListener()).sheet().doRead();
总体代码:
public class Test {
public static void main(String[] args) {
//写操作:
//定义写入的文件路径以及名字
String fileName = "F:\\demo.xlsx";
// 这里 需要指定写用哪个class去写,然后写到第一个sheet,名字为模板 然后文件流会自动关闭
EasyExcel.write(fileName, Data.class).sheet("写入").doWrite(data());
//读操作:
// 这里 需要指定读用哪个class去读,然后读取第一个sheet 文件流会自动关闭
EasyExcel.read(fileName, ReadData.class, new ExcelListener()).sheet().doRead();
}
//循环设置要添加的数据,最终封装到list集合中
private static List<Data> data() {
List<Data> list = new ArrayList<Data>();
for (int i = 0; i < 10; i++) {
Data data = new Data();
data.setNo(i);
data.setName("张三"+i);
list.add(data);
}
return list;
}
}