读写 Excel - 希望你知道 EasyExcel

本文介绍了EasyExcel,一个简单易用的Java库用于处理Excel,包括读取和写入操作。作者通过实例展示了如何使用EasyExcel创建实体对象、设置监听器以及处理数据。同时提醒读者注意版本更新可能带来的API变化。

0. 前言

曾经我们使用 Apache POI 或 JXL 来处理 excel,使用过的人都知道它们上手有多难,今天就让你见识一个简单的不能再简单的工具 - EasyExcel, 至少我认为它是真的简单。

1. 简介

官方网站:https://easyexcel.opensource.alibaba.com/
github地址:https://github.com/alibaba/easyexcel
gitee地址:https://gitee.com/easyexcel/easyexcel

感觉它的官方介绍,大概率是基于 poi 实现的,还没来得及及看源码,但是不重要,我们先用起来再说。

2. 读的使用

官方示例快速读:快速读

2.1 官方示例最简单读
    /**
     * 最简单的读
     * <p>1. 创建excel对应的实体对象 参照{@link DemoData}
     * <p>2. 由于默认一行行的读取excel,所以需要创建excel一行一行的回调监听器,参照{@link DemoDataListener}
     * <p>3. 直接读即可
     */
    @Test
    public void simpleRead() {
        String fileName = TestFileUtil.getPath() + "demo" + File.separator + "demo.xlsx";
        // 这里 需要指定读用哪个class去读,然后读取第一个sheet 文件流会自动关闭
        EasyExcel.read(fileName, DemoData.class, new DemoDataListener()).sheet().doRead();
    }
2.2 我是怎么使用的
  • 数据准备 SourceData 类, 对应 excel
    在这里插入图片描述
public class SourceData {

    private String id;
    private String url;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }
}
  • 读取操作
/**
 * 从 excel 文件中读取内容, fileName 是一个本地文件的路径
 *  SourceData 是我定义的一个与源 excel 文件表头对应的类,属性对应列名
 */
public List<SourceData> readExcel(String fileName) {
        // 限定下读取所有内容的数量级,根据需求自行设定
        List<SourceData> result = ListUtils.newArrayListWithExpectedSize(2000);
        // 读取 excel 关键步骤,
        EasyExcel.read(fileName, SourceData.class, new ReadListener<SourceData>() {
            // 每次处理的数据级
            private static final int BATCH_COUNT = 200;
            // 每次处理临时存储集合
            private List<SourceData> cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);

			/**
			 * 每行读取完会调用
			 */
            @Override
            public void invoke(SourceData data, AnalysisContext context) {
                cachedDataList.add(data);
                if (cachedDataList.size() >= BATCH_COUNT) {
                    // 根据自行需求业务处理,可以是后续的业务处理,我这里示例下打印输出
                    printData();
                    // 存储完成清理临时存储
                    cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);
                }
            }

			/**
			 * 每个sheet读取完会调用
			 */
            @Override
            public void doAfterAllAnalysed(AnalysisContext context) {
                // 根据需求调用,这里只为演示
                printData();
            }

            /**
             * 打印输出
             */
            private void printData() {
                logger.info("当前记录 {} 条数据 ", cachedDataList.size());
				logger.info("------打印每行结果------------");
		 		for (SourceData sd : cachedDataList) {
            		logger.info("id= {} url= {}", sd.getId(), sd.getUrl());
		        }
                // 这里将每次结果放入 result
                result.addAll(cachedDataList);
            }
        }).sheet().doRead();

        return result;
    }

3. 写的使用

看起官方的示例有点乱,至少你先用起来
官方示例:快速写

3.1 我的使用
  • 数据准备 RblData,
    注解 ExcelProperty是给列重命名,即 excel Sheet 表头,结果显示示例如下
    在这里插入图片描述
public class RblData {
    @ExcelProperty({"结构ID"})
    private String id;

    @ExcelProperty({"序号"})
    private Integer number;

    @ExcelProperty({"信用代码"})
    private String creditCode;

    @ExcelProperty({"名称"})
    private String Name;
  • 写操作
    public static void writeExcel(List<RblData> listData) {
    	// mac 输出文件的地址,根据自行系统修改
        String fileName = "/Users/test/output.xlsx";
        // 指定写用哪个class去写,这里自定义的 RblData;然后写到 Sheet1,文件流会自动关闭
        EasyExcel.write(fileName, RblData.class)
                .sheet("Sheet1")
                .doWrite(() -> {
                    // 分页查询数据
                    return listData;
                });
    }
4. 总结

总的说来,上手快,使用方便,还有更多的操作,可以参考下 API 的介绍,最最重要是要动起手来。如果你有问题欢迎一起交流下。
API: https://easyexcel.opensource.alibaba.com/docs/current/api/
常见问题:https://easyexcel.opensource.alibaba.com/qa/

另外:在我使用过程中,easyexcel 的版本更新后会有些 API 的废弃和更新,大家多注意下就可以了。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值