千家信息网

Java中的EasyExcel工具类怎么用

发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,这篇文章主要为大家展示了"Java中的EasyExcel工具类怎么用",内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下"Java中的EasyExcel工具类怎么
千家信息网最后更新 2026年11月03日Java中的EasyExcel工具类怎么用

这篇文章主要为大家展示了"Java中的EasyExcel工具类怎么用",内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下"Java中的EasyExcel工具类怎么用"这篇文章吧。

一、前言

关于EasyExcel,它对poi做了进一步的封装,使得整个编写流程更加的面向对象。好处嘛,我认为流程上更加清晰即易懂、可读性更好,坏处的话,则是操作上没有原生的方式那么灵活。

二、导入

  • StudentVo为实体类, 注意实体中的各个属性要和excel按顺序一 一对应,建议都用String类型,真正插入时,才去做转换

  • ImportExcelListener 类为真正处理数据的类

  • CommonService 只是一个Spring的service bean,用来执行curd操作

 private CommonService commonService;    public void importExcel(MultipartFile file) throws IOException {    // HEAD_ROW_NUMBER为Excel中的头部行数, 这里的关于ImportExcelListener的构造方法中HEAD_ROW_NUMBER参数可以根据需要决定传或者不传        EasyExcel.read(file.getInputStream(), StudentVo.class, new ImportExcelListener(HEAD_ROW_NUMBER, commonService)).sheet().headRowNumber(HEAD_ROW_NUMBER).doRead();    }

ImportExcelListener 类如下,这里根据实际需要,可以不用泛型。

public class ImportExcelListener extends AnalysisEventListener {        /**         * 每隔BATCH_COUNT条存储数据库 然后清理list ,方便内存回收         */        private static final int BATCH_COUNT = 500;        private int headRowNum;        private CommonService commonService;        private List list = new ArrayList<>();        public ImportExcelListener(int headRowNumber, CommonService commonService) {            this.headRowNum = headRowNumber;            this.commonService = commonService;        }        /**         * 这个每一条数据解析都会来调用         */        @Override        public void invoke(T data, AnalysisContext context) {            // 这里也可以将data转为对应实体, 然后做一些参数校验            Integer rowNum = context.readRowHolder().getRowIndex();           log.info("当前解析的数据为第{}行", rowNum);                      list.add(data);            // 批量保存, 防止一次性数据过多, 内存溢出            if (list.size() >= BATCH_COUNT) {                // 保存                commonService.save(list);                list.clear();            }        }        // 在解析之后, 也要记得再判断是否为空, 不为空要保存一下        @Override        public void doAfterAllAnalysed(AnalysisContext context) {            if (CollectionUtils.isEmpty(list)) {                return;            }            commonService.save(list);            list.clear();        }    }

如果对导入的数据没啥特别处要求且数据量也不多,也可以直接采用如下这种方式:

List data = null;        try {            data = EasyExcelFactory.read(file.getInputStream()).sheet().doReadSync();        } catch (IOException e) {            log.error("读取失败", e);            throw new BusinessException("读取失败");        }        // 保存操作        // ...

三、导出

  • 无需映射实体对象, 实际运用中查出来数据后, 需要自己去遍历组装成List>的二维类型,表示第几行第几列。

public void test() throws FileNotFoundException {        File file = new File("E:\work-grandview\测试.xlsx");        // 创建writerBuilder对象,自动调整列宽        ExcelWriter excelWriter = EasyExcel.write(new FileOutputStream(file))                .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy())                .autoCloseStream(Boolean.TRUE)                .build();        //  List>类型, 二维数据, 表示第几行第几列, 设置表头内容        List> titleList = new ArrayList<>();        titleList.add(Arrays.asList("名称", "key", "value"));        int sheetNum = 0;        WriteSheet writeSheet = EasyExcel.writerSheet(sheetNum,"导出数据").build();        excelWriter.write(titleList, writeSheet);        // 生成导出内容;        List> content = new ArrayList<>();        // 10行3列        for (int i = 0; i < 10; i++) {            List dataList = new ArrayList<>();            for (int j = 0; j < 3; j++) {                dataList.add(j);            }            content.add(dataList);        }        // 写入文件        excelWriter.write(content, writeSheet);        // 关闭文件流        excelWriter.finish();    }

  • 通过EasyExcel提供的注解,将实体映射到对应列中:

@Data public class VO {        @ExcelProperty(value = "姓名", index = 0)        int name;        @ExcelProperty(value = "key", index = 1)        int key;        @ExcelProperty(value = "value", index = 2)        int value;    }@Test    public void test() throws FileNotFoundException {        File file = new File("E:\work-grandview\测试.xlsx");        // 创建writerBuilder对象,自动调整列宽        ExcelWriter excelWriter = EasyExcel.write(new FileOutputStream(file))                .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy())                .autoCloseStream(Boolean.TRUE)                .build();        // 生成导出内容;        List content = new ArrayList<>();        // 10行3列        for (int i = 0; i < 10; i++) {            VO vo = new VO();            vo.setKey(i);            vo.setName(i);            vo.setValue(i);           content.add(vo);        }                // 创建sheet, 设置0号表, 实际运用中可能得创建多张, 可以遍历数据, 每满足n条就创建i号sheet表        WriteSheet writeSheet = EasyExcel.writerSheet(0,"导出数据").build();        // 设置表头        writeSheet.setClazz(content.get(0).getClass());        // 写入文件        excelWriter.write(content, writeSheet);        excelWriter.finish();    }

一开始创建后,莫名奇妙多了个this0 列 , 后 来 想 了 想 , 原 来 我 的 实 体 类 是 T e s t 类 的 内 部 类 来 着 , 而 ' c o n t e n t . g e t ( 0 ) . g e t C l a s s ( ) ' 拿 到 的 是 一 个 代 理 类 T e s t 0列,在设置表头时,同时被处理为属性值了。在将VO类写到外部后解决。

以上是"Java中的EasyExcel工具类怎么用"这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!

数据 内容 实体 对象 工具 实际 文件 篇文章 类型 表头 内存 参数 属性 方式 易懂 流程 二维 处理 学习 帮助 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 广州紫鲸互联网科技有限公司 为想互联网科技怎么样 广州百单互联网科技有限公司 互联网科技金融 远信互联网科技 唐信互联网科技 互联网 视角下的科技创新 顺玮阁互联网科技 青海省互联网新科技 成都互联网科技公司100强 世界互联网科技公司市值排名 岳阳华臻互联网科技有限公司 中国航天科技大学国际工业互联网 崇明区互联网教育科技售后服务 互联网科技大赛获奖感言 锡山区互联网智能科技产品供应 互联网科技股为什么大涨 半导体是互联网高科技吗 广州互联网高科技取餐柜 青岛易易互联网科技 广州万易互联网科技有限公司 中国互联网科技工作委员会毛军 鸠鸠互联网科技 互联网为科技 网络科技有限互联网 有木互联网科技 无锡溥仪互联网科技有限公司 本届互联网博览会上的黑科技 互联网科技和法律行业 江苏苏星互联网科技有限公司
0