Alibaba easyexcel读取excel

本文详细介绍了如何使用阿里巴巴的EasyExcel库进行Excel的读写操作。从添加maven依赖开始,讲解了如何处理填充与写入、字段读写为空的问题,并提供了多种读取Excel数据的示例,包括最简单的读、指定列下标或列名读、不创建对象的读以及其他复杂方式读。此外,还提醒读者参考官方文档以解决更多问题。
摘要由CSDN通过智能技术生成

一、引入maven依赖:

<dependency>
  <groupId>com.alibaba</groupId>
  <artifactId>easyexcel</artifactId>
  <version>2.1.6</version>
</dependency>

二、常见问题

  1. 填充和写的选择

    填充其实也不会占用大量内存,用的也是文件缓存,最后统一书写,如果导出的内容各种格式复杂,建议直接用模板然后填充(填充的数据会自动有格式)。如果格式相对简单,建议直接用写,相对来说,直接导出性能还是高一丢丢。

  2. 部分字段读取或者写入为空

    读写反射对象用到了Cglib,所以成员变量必须符合驼峰规范,而且使用@Data不能使用@Accessors(chain = true)。后续会考虑支持非驼峰。

  3. 其他问题参考官方文档

三、读Excel

1. 最简单的读

 对象:

@Data
public class Student {
    private String name;
    private Integer age;
    private String address;
    private Float money;
}

表格(Excel)

姓名年龄地址余额
张三22广东省深圳市6543
李四18湖北省武汉市4900
王五36云南省昆明市5200

  • 监听器

  • 监听器采用匿名内部类的形式提供。

  • 代码

@Test
public void testRead() {

  // 被读取的文件绝对路径
  String fileName = "C:/location/myFiles/temp/students.xlsx";

  // 接收解析出的目标对象(Student)
  List<Student> studentList = new ArrayList<>();
  
  // 这里需要指定读用哪个class去读,然后读取第一个sheet 文件流会自动关闭
  // excel中表的列要与对象的字段相对应
  EasyExcel.read(fileName, Student.class, new AnalysisEventListener<Student>() {
    
    // 每解析一条数据都会调用该方法
    @Override
    public void invoke(Student student, AnalysisContext analysisContext) {
      System.out.println("解析一条Student对象:" + JSON.toJSONString(student));
      studentList.add(student);
    }

    // 解析完毕的回调方法
    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
      System.out.println("excel文件读取完毕!");
    }
  }).sheet().doRead();
  
}

2. 指定列的下标或列名

读的方法都一样(包括监听器),只不过要给目标对象的类上加如下注解(demo来自官方文档)。

@Data
public class IndexOrNameData {
  /**
   * 强制读取第三个 这里不建议 index 和 name 同时用,要么一个对象只用index,要么一个对象只用name	 * 去匹配
   */
  @ExcelProperty(index = 2)
  private Double doubleData;
  
  /**
   * 用名字去匹配,这里需要注意,如果名字重复,会导致只有一个字段读取到数据
   */
  @ExcelProperty("字符串标题")
  private String string;
  
  @ExcelProperty("日期标题")
  private Date date;
}

3. 不创建对象的读

不创建对象读取的话,直接用Map接收数据。

@Test
public void readWithoutObj() {
  
  // 被读取的文件绝对路径
  String fileName = "C:/location/myFiles/temp/students.xlsx";
  
  // 接收结果集,为一个List列表,每个元素为一个map对象,key-value对为excel中每个列对应的值
  List<Map<Integer,String>> resultList = new ArrayList<>();
  
  EasyExcel.read(fileName, new AnalysisEventListener<Map<Integer,String>>() {

    @Override
    public void invoke(Map<Integer, String> map, AnalysisContext analysisContext) {
      System.out.println("解析到一条数据:" + JSON.toJSONString(map));
      resultList.add(map);
    }
    
    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
      System.out.println("excel文件解析完毕!" + JSON.toJSONString(resultList));
    }
  }).sheet().doRead();
}

4. 其他复杂方式读

读取多个sheet、日期/数字和自定义格式转换、多行头、同步返回、读取表头、web中的读等读法参考官方文档

easyExcel:官网excel · 语雀 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值