EasyExcel 是阿里巴巴开源的一个excel处理框架,以使用简单、节省内存著称,它采用一行一行的解析模式,并将一行的解析结果以观察者的模式通知处理(AnalysisEventListener)。能大大减少占用内存的主要原因就是在解析Excel时没有将文件数据一次性全部加载到内存中,而是从磁盘上一行行读取数据,逐个解析。在项目中遇到表格导入导出需求时 推荐使用。
1: pom中引入xml相关依赖
<!-- Easy excel 工具 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>2.1.1</version>
</dependency>
案例入门: 1 : 创建实体类 使用注解 @ExcelProperty
@Data
public class DemoData {
@ExcelProperty(value = "编号",index = 0)
private int sno;
@ExcelProperty(value = "姓名",index = 1)
private String sname;
public int getSno() {
return sno;
}
public void setSno(int sno) {
this.sno = sno;
}
}
定义测试类 模拟excel测试数据 :
// 模拟EXCEL 测试数据
private static List<DemoData> data() {
List<DemoData> list = new ArrayList<DemoData>();
for (int i = 0; i < 10; i++) {
DemoData data = new DemoData();
data.setSno(i);
data.setSname("张三"+i);
list.add(data);
}
return list;
}
导出测试:
@Test
public void writeTest(){
//导出位置及文件名
String fileName = "E:\eduOnlinePrject\feige.xlsx";
EasyExcel.write(fileName,DemoData.class).sheet("method1").doWrite(data());
}
导出的测试数据
导入测试: 定义Excel监听类 ExcelListener 继承 AnalysisEventListener。导入后逻辑 在 invoke 方法中处理。
public class ExcelListener extends AnalysisEventListener<DemoData> {
//一行一行去读取excle内容
@Override
public void invoke(DemoData demoData, AnalysisContext analysisContext) {
System.out.println(" 读取excle数据: "+demoData.toString());
}
//读取完成后执行
@Override
public void doAfterAllAnalysed(AnalysisContext analysisContext) {
System.out.println("读取excle内容结束");
}
}
测试方法:
// 导入
@Test
public void readTest(){
String fileName = "E:\eduOnlinePrject\ltf.xlsx";
EasyExcel.read(fileName,DemoData.class,new ExcelListener()).sheet().doRead();
}
读取Excel数据:
项目中使用: 1. 导入Excel数据
定义导入数据对象:
控制层 前端上传Excel 导入文件:
服务层:获取文件输入流 调用EasyExcel read方法:
定义Excel 读取监听器 SubjectExcelListener ,继承AnalysisEventListener 实现 invoke方法:
1. 导出Excel数据 调用EasyExcel write方法即可。
@Override
public void outSubject() {
String file = UUID.randomUUID().toString();
String fileName = "E:\eduOnlinePrject\"+ file +".xlsx";
List<EduSubject> eduSubjects = baseMapper.selectList(null);
EasyExcel.write(fileName,EduSubject.class).sheet().doWrite(eduSubjects);
}