官网:EasyExcel官方文档 - 基于Java的Excel处理工具 | Easy Excel (alibaba.com)
因为暂时项目没有用到,所以不急,知道了这个技术。就想着学着用一下!
最简单的读
先看官方文档给的用法和解释!!!
导入依赖
<dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.3.2</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.70</version></dependency>
创建实体类
自己准备一个Excel表格。
@Data
public class DemoData {private String name;private String sex;private String age;
}
测试
官方提供了4种写法
写法一:
final String fileName = "C:\\Users\\gong'chao\\Desktop\\58_com_resumes_bj.xls";/*** 最简单的读 - 01*/@Testvoid readExcel01(){AtomicInteger i = new AtomicInteger();EasyExcel.read(fileName, DemoData.class, new PageReadListener<DemoData>(dataList -> {for (DemoData demoData : dataList) {System.out.println("读取到一条数据" + JSON.toJSONString(demoData));i.getAndIncrement();}// 输出集合长度System.err.println(dataList.size());})).sheet().doRead();// 输出总行数System.out.println(i);}
点击PageReadListener查看源码:
默认是一行一行读取。然后可以再点进ListUtils中查看,可以知道,一行一行的将数据存进集合中,当长度到100时重新new一个集合,则原来的集合对象不被引用交给垃圾回收。这就是 Easy Excel 处理大文件内存溢出的一种方式吧。
--- 个人理解
然后可以看出实体类映射的三个字段输出的值不匹配。按照官网给出的注解:
@Data
public class DemoData {@ExcelProperty(value = "姓名")private String name;@ExcelProperty(value = "性别")private String sex;@ExcelProperty(index = 5)private String age;
}
可以指定列名,也可以指定下标。这样就正确映射了
写法二:内部类
/*** 最简单的读 - 02*/@Testvoid readExcel02(){EasyExcel.read(fileName, DemoData.class, new ReadListener<DemoData>(){// 单次缓存的数量public static int BATCH_COUNT = 200;// 临时存储private List<DemoData> cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);@Overridepublic void invoke(DemoData data, AnalysisContext context) {cachedDataList.add(data);if(cachedDataList.size() >= BATCH_COUNT) {System.err.println(cachedDataList.size());System.err.println("已保存至数据库\n已完成清理 list");cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);}}@Overridepublic void doAfterAllAnalysed(AnalysisContext context) {System.err.println("已将剩余数据保存至数据库");}}).sheet().doRead();}
写法三:外部类
定义一个类
public class read03 implements ReadListener<DemoData> {// 单次缓存的数量public static int BATCH_COUNT = 200;// 临时存储private List<DemoData> cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);public void invoke(DemoData data, AnalysisContext context) {cachedDataList.add(data);if(cachedDataList.size() >= BATCH_COUNT) {System.err.println(cachedDataList.size());System.err.println("已保存至数据库\n已完成清理 list");cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);}}public void doAfterAllAnalysed(AnalysisContext context) {System.err.println("已将剩余数据保存至数据库");}
}
/*** 最简单的读 - 03*/@Testvoid readExcel03(){EasyExcel.read(fileName, DemoData.class, new read03()).sheet().doRead();}
写法四:
/*** 最简单的读 - 04*/@Testvoid readExcel04(){try (ExcelReader excelReader = EasyExcel.read(fileName, DemoData.class, new read03()).build()) {// 构建一个sheet 这里可以指定名字或者noReadSheet readSheet1 = EasyExcel.readSheet(0).sheetName("员工表").build();ReadSheet readSheet2 = EasyExcel.readSheet(1).sheetName("请假表").build();System.out.println(readSheet1.toString());System.out.println(readSheet2.toString());// 读取一个sheetexcelReader.read(readSheet1);excelReader.read(readSheet2);}}
写法四中可以通过下标指定工作表和相应的名称。
总结
之后真正要用EasyExcel技术时再研究其他用法,之后再更新!