• EasyExcel使用总结


    简单总结一下EasyExcel的使用.

    EasyExcel是阿里处理Excel的一款工具,非常好用。与Apache的poi不同,EasyExcel占用内存小。所以是很好的选择。文档中的功能较多,这里只做简单的读写。

    文档链接:写excel · 语雀EasyExcel写Excel的示例https://www.yuque.com/easyexcel/doc/write#06e004ef-17

    使用:

     读取:

    首先我们不管是读取还是写入,都应该用一个字段名和表头相对应的实体类来接收,EasyExcel本身用来接收的是一个linkedHashMap。我们开发过程中,使用实体来接收比较便于后续处理。

    1. @Data
    2. @NoArgsConstructor
    3. @AllArgsConstructor
    4. public class DemoData {
    5. @ExcelProperty("字符串标题")
    6. private String string;
    7. @ExcelProperty("日期标题")
    8. private Date date;
    9. @ExcelProperty("数字标题")
    10. private Double doubleData;
    11. }

     其次就是读取还需要一个监听器,这里可以自己定义,也可以使用easyExcel中的监听器,这里都做一下展示:

    自定义监听器:可以在invoke中进行逻辑编写,这里的监听器有个注意的地方:

    有个很重要的点 DemoDataListener 不能被spring管理,要每次读取excel都要new,然后里面用到spring可以构造方法传进去,这样就可以使用Spring管理的类。

    1. // 有个很重要的点 DemoDataListener 不能被spring管理,要每次读取excel都要new,然后里面用到spring可以构造方法传进去
    2. @Slf4j
    3. public class DemoDataListener implements ReadListener<DemoData> {
    4. /**
    5. * 每隔5条存储数据库,实际使用中可以100条,然后清理list ,方便内存回收
    6. */
    7. private static final int BATCH_COUNT = 100;
    8. /**
    9. * 缓存的数据
    10. */
    11. private List<DemoData> cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);
    12. /**
    13. * 假设这个是一个DAO,当然有业务逻辑这个也可以是一个service。当然如果不用存储这个对象没用。
    14. */
    15. private DemoDAO demoDAO;
    16. public DemoDataListener() {
    17. // 这里是demo,所以随便new一个。实际使用如果到了spring,请使用下面的有参构造函数
    18. demoDAO = new DemoDAO();
    19. }
    20. /**
    21. * 如果使用了spring,请使用这个构造方法。每次创建Listener的时候需要把spring管理的类传进来
    22. *
    23. * @param demoDAO
    24. */
    25. public DemoDataListener(DemoDAO demoDAO) {
    26. this.demoDAO = demoDAO;
    27. }
    28. /**
    29. * 这个每一条数据解析都会来调用
    30. *
    31. * @param data one row value. Is is same as {@link AnalysisContext#readRowHolder()}
    32. * @param context
    33. */
    34. @Override
    35. public void invoke(DemoData data, AnalysisContext context) {
    36. log.info("解析到一条数据:{}", JSON.toJSONString(data));
    37. cachedDataList.add(data);
    38. // 达到BATCH_COUNT了,需要去存储一次数据库,防止数据几万条数据在内存,容易OOM
    39. if (cachedDataList.size() >= BATCH_COUNT) {
    40. saveData();
    41. // 存储完成清理 list
    42. cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);
    43. }
    44. }
    45. /**
    46. * 所有数据解析完成了 都会来调用
    47. *
    48. * @param context
    49. */
    50. @Override
    51. public void doAfterAllAnalysed(AnalysisContext context) {
    52. // 这里也要保存数据,确保最后遗留的数据也存储到数据库
    53. saveData();
    54. log.info("所有数据解析完成!");
    55. }
    56. /**
    57. * 加上存储数据库
    58. */
    59. private void saveData() {
    60. log.info("{}条数据,开始存储数据库!", cachedDataList.size());
    61. demoDAO.save(cachedDataList);
    62. log.info("存储数据库成功!");
    63. }
    64. }

    EasyExcel自带的监听器:这里面的 new PageReadListener就是自带的监听器,可以替换成我们自定义的监听器。

    1. String fileName = "C:\\Users\\XXX\\Desktop\\43-XXX--技术调研&技术应用\\43-汇客--技术调研&技术应用\\资料\\excel读取测试.xlsx";
    2. EasyExcel.read(fileName, DemoData.class, new PageReadListener<DemoData>(dataList -> {
    3. for (DemoData demoData : dataList) {
    4. // log.info("读取到一条数据{}", JSON.toJSONString(demoData));
    5. System.out.println("输出信息:" + demoData);
    6. }
    7. })).sheet().doRead();

    这样就可将我们的表格读取出来。文档中也有相对应的说明。

    写入: 

    写入的操作可以不用监听器

    1. String fileName = "C:\\Users\\XXX\\Desktop\\demo.xlsx";
    2. EasyExcel.write(fileName, DemoData.class)
    3. .sheet("模板")
    4. .doWrite(() -> {
    5. // 分页查询数据
    6. return 你要写入的数据;
    7. });

    最后的doWrite()也可以这样写:

    1. String fileName = "C:\\Users\\XX\\Desktop\\demo.xlsx";
    2. EasyExcel.write(fileName, DemoData.class)
    3. .sheet("模板")
    4. .doWrite(直接写你的数据,不用return);

    这样就可以进行表格的导入导出。 

    sheet代表表格中下面的表格名称

    如果想自己决定03,07的版本,那就可以直接像上面那样链式编程,进行设置.excelType();

    03:表格后缀xls

    07:表格后缀xlsx

  • 相关阅读:
    用Unity重现《空洞骑士》的苦痛之路(2)——地图篇
    字字珠玑!GitHub爆赞的网络协议手册,被华为大佬指定内部必学?
    Mybatis+Servlet+Mysql 整合的一个小项目:对初学者非常友好,有助于初学者很快的上手Java Web
    VuePress实现自动获取文章侧边栏目录功能
    BUUCTF msic 专题(115)[安洵杯 2019]easy misc
    gtest使用简介
    Vue-配置代理(解决跨域问题)
    引擎入门 | Unity UI简介–第1部分(7)
    怎么去除视频上的文字?一篇教你:视频上的文字水印怎么去除
    动手学深度学习(Pytorch版)代码实践 -卷积神经网络-15参数管理
  • 原文地址:https://blog.csdn.net/weixin_65549694/article/details/125447651