千家信息网

Java中的EasyExcel工具类怎么用

发表于:2025-02-01 作者:千家信息网编辑
千家信息网最后更新 2025年02月01日,这篇文章主要为大家展示了"Java中的EasyExcel工具类怎么用",内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下"Java中的EasyExcel工具类怎么
千家信息网最后更新 2025年02月01日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工具类怎么用"这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!

0