Excel处理还是用POI?快来试一试这款工具


大家好,我是开源大叔。

今天给大家分享一个非常好用的Excel解析开源项目:EasyExcel

概述

大家常用的读写Excel的可能是POI,但是POI有一些缺点:比较耗内存。
EasyExcel则针对POI的缺点进行了优化,减少内存的占用,并且做了更多的封装,使用起来很方便。接下来跟着大叔来看看怎么使用吧。

快速入门

加入依赖

1
2
3
4
5
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>3.0.5</version>
</dependency>

读Excel

1
2
3
4
5
6
7
8
9
10
11
12
13
14
private static void read(){
InputStream is = Client.class.getClassLoader().getResourceAsStream("user.xlsx");
List<Object> list = EasyExcel.read(is).sheet().headRowNumber(0).doReadSync();
if(null != list && list.size() > 0){
list.forEach(e -> {
System.out.println(e.toString());
});
}
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}

运行结果如下:
{0=张三, 1=18, 2=北京}
{0=扬四, 1=19, 2=上海}
{0=王五, 1=20, 2=广州}
{0=刘六, 1=21, 2=深圳}

写Excel

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
private static void wirte(){
String fileName = "/Users/erpang/excel-simple/src/main/resources/userV2.xlsx";

List<User> list = new ArrayList<>();
list.add(new User("刘备",48,"蜀国"));
list.add(new User("关羽",48,"蜀国"));
list.add(new User("张飞",48,"蜀国"));
list.add(new User("阿斗",18,"蜀国"));

EasyExcel.write(fileName, User.class)
.sheet("用户信息")
.doWrite(() -> {
return list;
});
}

运行效果如下:

上面减少的都是最简单的读写操作,不一定能满足日常需要,接下来我们来看看它是否还有其他高级的设置呢?

高级使用

  1. 读取 excel 的时候是否可以直接把表格中的数据读取成自己的实体对象呢?
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    @NoArgsConstructor
    @AllArgsConstructor
    @ToString
    @Data
    public class User {
    private String username;
    private Integer age;
    private String address;
    }

    private static void readV2(){
    String fileName = "/Users/erpang/excel-simple/src/main/resources/user.xlsx";
    List<User> list = EasyExcel.read(fileName,User.class, new ReadListener<User>() {
    @Override
    public void invoke(User o, AnalysisContext analysisContext) {
    log.info("读取到的数据:{}", JSON.toJSONString(o));
    }
    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
    System.out.println("读取完成");
    }
    }).sheet().headRowNumber(0).doReadSync();
    }
  2. 如果导出的时候头信息要怎么操作呢?
    在类属性上加上注解 @ExcelProperty就可以了
    1
    2
    3
    4
    5
    6
    @ExcelProperty("姓名")
    private String username;
    @ExcelProperty("年龄")
    private Integer age;
    @ExcelProperty("地址")
    private String address;
    EasyExcel还有其他强大功能,这里就不一一介绍了,接下来大叔来说一下常用的api,后续大家可以自己去尝试
  • EasyExcel 入口类,用于构建开始各种操作
  • ReadListener 在每一行读取完毕后都会调用ReadListener来处理数据
  • ExcelProperty 指定当前字段对应excel中的那一列。可以根据名字或者Index去匹配。当然也可以不写,默认第一个字段就是index=0,以此类推。千万注意,要么全部不写,要么全部用index,要么全部用名
  • ExcelIgnore 默认所有字段都会和excel去匹配,加了这个注解会忽略该字段
  • NumberFormat 数字转换
  • DateTimeFormat 日期转换

大叔总结

今天就介绍到这里了,处理Excel在日常开发中很常见,选择一个简单易用的工具可以提高自己的工作效率,EasyExcel 正好符合这个要求,不近使用方便,并且性能强大 节省内存空间,是一个不错的选择。


  目录