我去,还在这样读写 excel 这也太低效了吧!(一)

前言

最近读者小 H 在知识星球中给阿粉发来私信:

阿粉,最近我在负责公司报表平台开发,需要导出报表到 Excel 中。每次使用 POI 开发,都要写长长的一坨代码,好几次因为没加入判空判断,导致生成失败。想跟你请教下有没有更加高效一点读写 Excel 方法?

ps:知识星球汇集一片大神,感兴趣的同学可以加入知识星球,有任何问题都会有大神及时解答。

使用过 poi 的开发同学可能都有此体会,每次都要写一坨代码,最后的代码如下面一样:我去,还在这样读写 excel 这也太低效了吧!(一)这样的代码是不是又臭又长?当字段数量多的时候,一不小心还容易写错。阿粉还记得当初使用 poi 导出一个二十多字段的 excel,不断复制粘贴,行号一不小心就写错了,那叫个一个心酸。

今天阿粉就来推荐一个阿里开源的项目『EasyExcel』,带大家彻底告别上面又长又臭的代码,彻底解决这个问题。

我去,还在这样读写 excel 这也太低效了吧!(一)

EasyExcel

EasyExcel 是一个阿里出品的开源项目 ,看名字就能看出这个项目是为了让你更加简单的操作 Excel。另外 EasyExcel 还解决了poi 内存溢出问题,修复了一些并发情况下一些 bug。

github 地址:https://github.com/alibaba/easyexcel

我去,还在这样读写 excel 这也太低效了吧!(一)

截止阿粉写文章时,已有 13.6k star 数据,可见这个项目还是深受大家欢迎。

废话不多说,我们直接进入源码实战环节。

首先我们需要引入 EasyExcel pom 依赖:

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

这里建议大家使用 2.0 以上的正式版本,不要再使用 1.0 的老版本,两者使用 API 差别很大。另外 beta 版本可能会存在某些 bug,大家谨慎使用。

我去,还在这样读写 excel 这也太低效了吧!(一)

普通方式

一行代码生成 Excel

// 写法1
String fileName = "temp/" + "test" + System.currentTimeMillis() + ".xlsx";
EasyExcel.write(fileName)
        .head(head())// 设置表头
        .sheet("模板")// 设置 sheet 的名字
        // 自适应列宽
        .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy())
        .doWrite(dataList());// 写入数据

生成 excel 代码特别简单,这里使用链式语句,一行代码直接搞定生成代码。代码中再也不用我们指定行号,列号了。

上面代码中使用自适应列宽的策略。

下面我们来看下表头与标题如何生成。

创建表头

/**
 * 创建表头,可以创建复杂的表头
 *
 * @return
 */
private static List<List<String>> head() {
    List<List<String>> list = new ArrayList<List<String>>();
    // 第一列表头
    List<String> head0 = new ArrayList<String>();
    head0.add("第一列");
    head0.add("第一列第二行");
    // 第二列表头
    List<String> head1 = new ArrayList<String>();
    head1.add("第一列");
    head1.add("第二列第二行");
    // 第三列
    List<String> head2 = new ArrayList<String>();
    head2.add("第一列");
    head2.add("第三列第二行");
    list.add(head0);
    list.add(head1);
    list.add(head2);
    return list;
}

上面每个 List<String> 代表一列的数据,集合内每个数据将会顺序写入这列每一行。如果每一列的相同行数的内容相同,将会自动合并单元格。通过这个规则,我们创建复杂的表头。

最终创建表头如下:

我去,还在这样读写 excel 这也太低效了吧!(一)

写入表体数据

private static List dataList() {
    List<List<Object>> list = new ArrayList<List<Object>>();
    for (int i = 0; i < 10; i++) {
        List<Object> data = new ArrayList<Object>();
        data.add("点赞+" + i);
        // date 将会安装 yyyy-MM-dd HH:mm:ss 格式化
        data.add(new Date());
        data.add(0.56);
        list.add(data);
    }
    return list;
}

表体数据然后也是使用 List<List<Object>>,但是与表头规则不一样。

每个 List<Object> 代表一行的数据,数据将会按照顺序写入每一列中。

集合中数据 EasyExcel 将会按照默认的格式化转换输出,比如 date 类型数据就将会按照  yyyy-MM-dd HH:mm:ss 格式化。

如果需要转化成其他格式,建议直接将数据格式化成字符串加入 List,不要通过 EasyExcel 转换。

最终效果如下:

我去,还在这样读写 excel 这也太低效了吧!(一)

看完这个是不是想立刻体验一下?等等,上面使用方式还是有点繁琐,使用 EasyExcel 还可以更快。我们可以使用注解方式,无需手动设置表头与表体。

我去,还在这样读写 excel 这也太低效了吧!(一)

上一篇:解决Exchange 2007 无法在虚拟机发送邮件的问题


下一篇:Windows Phone 模拟器(Emulator) 加载程序一闪而过就自动退出的解决办法