# EasyExcel

# 读数据

  • 读取 Excel 表格数据
package com.excel;
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelReader;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.excel.read.builder.ExcelReaderBuilder;
import com.alibaba.excel.support.ExcelTypeEnum;
@SuppressWarnings({"all"})
public class Easy_Exceltest {
    public static void main(String[]args){
        // 读取 Excel 表的内容
        // 创建 ExcelReaderBuilder 实例
        ExcelReaderBuilder builder = EasyExcel.read();
        // 获取文件对象
        builder.file("C:\\Users\\Administrator\\Desktop\\新建文件夹\\练习时长两年半.xlsx");
        // 指定 Sheet, 默认全部检测
        builder.sheet("Sheet1");
        // 自动关闭输入流
        builder.autoCloseStream(true);
        // 设置 Excel 文件格式
        builder.excelType(ExcelTypeEnum.XLSX);
        // 注册监听器
        builder.registerReadListener(new AnalysisEventListener() {
            @Override
            public void invoke(Object o, AnalysisContext analysisContext) {
                System.out.println(o);
            }
            @Override
            public void doAfterAllAnalysed(AnalysisContext analysisContext) {
                System.out.println("读取完毕!");
            }
        });
        // 构建读取器
        ExcelReader reader = builder.build();
        // 读取数据
        reader.readAll();
        // 读取完毕
        reader.finish();
    }
}

image-20221028150909293

可以通过泛型指定数据类型,但是还是 Map 集合

builder.registerReadListener(new AnalysisEventListener<Map<Integer,String>>() {
   @Override
   public void invoke(Map<Integer, String> integerStringMap, AnalysisContext analysisContext) {
      Set<Map.Entry<Integer,String>> entryset = integerStringMap.entrySet();
      Iterator<Map.Entry<Integer,String>> iterator = entryset.iterator();
      while(iterator.hasNext()){
         Map.Entry<Integer,String> ar = iterator.next();
         String name = ar.getValue();
         Integer id = ar.getKey();
         System.out.print(id+" : "+name+", ");
      }
      System.out.println("");
   }
   @Override
   public void doAfterAllAnalysed(AnalysisContext analysisContext) {
      System.out.println("读取完毕!");
   }
});

对上述代码进行简化

package com.excel;
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import java.util.*;
public class Easy_EasyExcelone {
    public static void main(String[]args){
        List<Map<Integer,String>> list = new ArrayList<>();
        EasyExcel.read("C:\\Users\\Administrator\\Desktop\\新建文件夹\\练习时长两年半.xlsx").sheet("Sheet1").registerReadListener(new AnalysisEventListener<Map<Integer,String>>() {
            @Override
            public void invoke(Map<Integer, String> integerStringMap, AnalysisContext analysisContext) {
                list.add(integerStringMap);
            }
            @Override
            public void doAfterAllAnalysed(AnalysisContext analysisContext) {
                System.out.println("数据读取完毕");
            }
        }).doRead();
        for(Map<Integer,String> i : list){
            Set set = i.keySet();
            Iterator<Integer> iterator = set.iterator();
            while(iterator.hasNext()){
                Integer key = iterator.next();
                System.out.print(key+" : "+i.get(key)+", ");
            }
            System.out.println("");
        }
    }
}

映射成指定对象,需要创建实体类,使用 @ExcelProperty 注解完成实体类成员变量和 Excel 字段的映射

导入 pom.xml

<dependencies>
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>easyexcel</artifactId>
        <version>2.2.6</version>
    </dependency>
   #-----------------导入如下内容到作用域中------------------
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.16</version>
        </dependency>
   #-----------------------------------------------------
    </dependencies>
import com.alibaba.excel.annotation.ExcelProperty;
public class EasyExcel_test {
    @ExcelProperty("name")
    private String name;
    @ExcelProperty("id")
    private Integer id;
    @ExcelProperty("address")
    private String address;
    @ExcelProperty("uid")
    private Integer uid;
}

解析 Excel 文件的时候直接指定实体类即可

实体类

package com.excel;
import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;
@Data
public class EasyExcel_test {
    @ExcelProperty("name")
    private String name;
    @ExcelProperty("id")
    private Integer id;
    @ExcelProperty("address")
    private String address;
    @ExcelProperty("uid")
    private Integer uid;
}

解析 Excel 类

package com.excel;
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import java.util.*;
public class Easy_EasyExcelone {
    public static void main(String[]args){
        List<EasyExcel_test> list = new LinkedList<>();
        EasyExcel.read("C:\\Users\\Administrator\\Desktop\\新建文件夹\\练习时长两年半.xlsx")
                .head(EasyExcel_test.class)
                .sheet("Sheet1")
                .registerReadListener(new AnalysisEventListener<EasyExcel_test>() {
                    @Override
                    public void invoke(EasyExcel_test easyExcel_test, AnalysisContext analysisContext) {
                        list.add(easyExcel_test);
                    }
                    @Override
            public void doAfterAllAnalysed(AnalysisContext analysisContext) {
                System.out.println("数据读取完毕");
            }
        }).doRead();
        for (EasyExcel_test i : list) {
            System.out.println(i);
        }
    }
}

image-20221028162950292

# 写数据

package com.excel;
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.excel.support.ExcelTypeEnum;
import java.util.LinkedList;
import java.util.List;
public class WriteExcel {
    public static void main(String[]args){
       // 创建 List 集合
        List<EasyExcel_test> list = new LinkedList<>();
       // 指定 Excel 写出的位置
        EasyExcel.write("C:\\Users\\Administrator\\Desktop\\新建文件夹\\练习时长两年半(2).xlsx")
           		 // 映射指定的类
                .head(EasyExcel_test.class)
           		 //Excel 表的类型
                .excelType(ExcelTypeEnum.XLSX)
           		 // 指定 Sheet 名称
                .sheet("Sheet1")
           		 // 写出读取到的内容
                .doWrite(read());
    }
    // 静态有返回值类型方法
    public static List<EasyExcel_test> read(){
        // 创建集合
        List<EasyExcel_test> list = new LinkedList<>();
        // 读取指定的 Excel 表的信息
        EasyExcel.read("C:\\Users\\Administrator\\Desktop\\新建文件夹\\练习时长两年半.xlsx")
           		 // 映射指定的类
                .head(EasyExcel_test.class)
           		 // 指定 Sheet, 读取默认全部检测
                .sheet("Sheet1")
           		 // 注册监听器
                .registerReadListener(new AnalysisEventListener<EasyExcel_test>(){
                    // 读取
                    @Override
                    public void invoke(EasyExcel_test easyExcel_test, AnalysisContext analysisContext) {
                        list.add(easyExcel_test);
                    }
                    // 通知
                    @Override
                    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
                        System.out.println("读取完成");
                    }
                }).doRead();
        return list;// 返回值
    }
}