千家信息网

Java中的EasyExcel工具类怎么用

发表于:2024-11-27 作者:千家信息网编辑
千家信息网最后更新 2024年11月27日,这篇文章主要为大家展示了"Java中的EasyExcel工具类怎么用",内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下"Java中的EasyExcel工具类怎么
千家信息网最后更新 2024年11月27日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安全错误 数据库的锁怎样保障安全 漳州市腾搜网络技术有限公司 服务器性能分析报告 关于网络安全的教育 怎么进入知网期刊全文数据库 软件开发包含哪些环节 江西一站式软件开发零售价格 临海本地软件开发生产过程 易速网络安全手抄报 网络安全管理员岗位制度 网络安全小学生文章题目 怎么在服务器上开安全狗 小学生网络安全小诗 数据库创建表性别 浦东新区无线网络技术售后保障 打击网络谣言维护网络安全 王者荣耀转移服务器的英雄 成都软件开发工程学校 网络安全法的监督机构 移动网络安全证书有用吗 全球网络安全行业专利申请数量 网络安全专升本对口专业 初中学计算网络技术可以吗 服务器主机能用什么打印机 如何查看服务器gpu信息 软件开发会查学历吗 微信小程序连接数据库错误 通过云服务器架设本地公网ip compute数据库 三亚网络安全宣传视频创意短片 网络安全设备越多越不安全
0