官网:EasyExcel官方文档 - 基于Java的Excel处理工具 | Easy Excel (alibaba.com)
因为暂时项目没有用到,所以不急,知道了这个技术。就想着学着用一下!
先看官方文档给的用法和解释!!!
- <dependency>
- <groupId>com.alibabagroupId>
- <artifactId>easyexcelartifactId>
- <version>3.3.2version>
- dependency>
- <dependency>
- <groupId>org.projectlombokgroupId>
- <artifactId>lombokartifactId>
- dependency>
- <dependency>
- <groupId>com.alibabagroupId>
- <artifactId>fastjsonartifactId>
- <version>1.2.70version>
- 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
- */
- @Test
- void readExcel01(){
- AtomicInteger i = new AtomicInteger();
- EasyExcel.read(fileName, DemoData.class, new PageReadListener
(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
- */
- @Test
- void readExcel02(){
- EasyExcel.read(fileName, DemoData.class, new ReadListener
(){ - // 单次缓存的数量
- public static int BATCH_COUNT = 200;
- // 临时存储
- private List
cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT); -
- @Override
- 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);
- }
- }
-
- @Override
- public void doAfterAllAnalysed(AnalysisContext context) {
- System.err.println("已将剩余数据保存至数据库");
- }
- }).sheet().doRead();
- }
定义一个类
- public class read03 implements ReadListener
{ - // 单次缓存的数量
- public static int BATCH_COUNT = 200;
- // 临时存储
- private List
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
- */
- @Test
- void readExcel03(){
- EasyExcel.read(fileName, DemoData.class, new read03()).sheet().doRead();
- }
- /**
- * 最简单的读 - 04
- */
- @Test
- void readExcel04(){
- try (ExcelReader excelReader = EasyExcel.read(fileName, DemoData.class, new read03()).build()) {
- // 构建一个sheet 这里可以指定名字或者no
- ReadSheet readSheet1 = EasyExcel.readSheet(0).sheetName("员工表").build();
- ReadSheet readSheet2 = EasyExcel.readSheet(1).sheetName("请假表").build();
- System.out.println(readSheet1.toString());
- System.out.println(readSheet2.toString());
- // 读取一个sheet
- excelReader.read(readSheet1);
- excelReader.read(readSheet2);
- }
- }
写法四中可以通过下标指定工作表和相应的名称。
之后真正要用EasyExcel技术时再研究其他用法,之后再更新!