EasyExcel使用

一给  金牌会员 | 2023-7-29 23:01:14 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 542|帖子 542|积分 1626

Java解析、生成Excel比较有名的框架有Apache poi、jxl。但他们都存在一个严重的问题就是非常的耗内存,poi有一套SAX模式的API可以一定程度的解决一些内存溢出的问题,但POI还是有一些缺陷,比如07版Excel解压缩以及解压后存储都是在内存中完成的,内存消耗依然很大。easyexcel重写了poi对07版Excel的解析,能够原本一个3M的excel用POI sax依然需要100M左右内存降低到几M,并且再大的excel不会出现内存溢出,03版依赖POI的sax模式。在上层做了模型转换的封装,让使用者更加简单方便。
EasyExcel是一个基于Java的简单、省内存的读写Excel的开源项目。在尽可能节约内存的情况下支持读写百M的Excel。
文档地址:https://alibaba-easyexcel.github.io/index.html
大家也可以根据文档参考开发
下面这个导入导出示例是在真实的项目环境下参考的
导入示例:

也就是读Excel中的数据,这里需要定义监听器
1、导入依赖
  1. <dependencies>
  2.     <dependency>
  3.         <groupId>com.alibaba</groupId>
  4.         <artifactId>easyexcel</artifactId>
  5.         <version>2.1.1</version>
  6.     </dependency>
  7. </dependencies>
复制代码
2、定义监听器
  1. public class DictListener extends AnalysisEventListener<DictEeVo> {
  2.     private DictMapper dictMapper;
  3.     public DictListener(DictMapper dictMapper) {
  4.         this.dictMapper = dictMapper;
  5.     }
  6.     //一行一行的读取
  7.     @Override
  8.     public void invoke(DictEeVo dictEeVo, AnalysisContext analysisContext) {
  9.         //调用方法把读取到的数据添加到数据库中去
  10.         Dict dict = new Dict();
  11.         BeanUtils.copyProperties(dictEeVo,dict);
  12.         dictMapper.insert(dict);
  13.     }
  14.     @Override
  15.     public void doAfterAllAnalysed(AnalysisContext analysisContext) {
  16.     }
  17. }
复制代码
3、定义数据接口
  1. //数据列表的导入功能
  2. void importData(MultipartFile file);
复制代码
4、实现接口
  1.     //数据列表的导入功能
  2.     @Override
  3.     @CacheEvict(value = "dict", allEntries=true)
  4.     public void importData(MultipartFile file) {
  5.         try {
  6.             EasyExcel.read(file.getInputStream(),DictEeVo.class,new DictListener(dictMapper)).sheet().doRead();
  7.         } catch (IOException e) {
  8.             e.printStackTrace();
  9.         }
  10.     }
复制代码
5、controller层调用接口
  1.     //导入数据功能
  2.     @ApiOperation("导入数据")
  3.     @PostMapping("/importData")
  4.     public Result<?> importData(MultipartFile file){
  5.         dictService.importData(file);
  6.         return Result.ok();
  7.     }
复制代码
注:上面监听器的实现是继承了AnalysisEventListener,它是EasyExcel框架中用于读取Excel文件的监听器类。通过继承AnalysisEventListener并实现其中的方法,可以自定义处理Excel文件中的每一行数据,实现灵活的数据读取和处理逻辑。
数据处理,通过重写invoke方法,可以对每一行读取的数据进行处理。大家也可以点进去看一下这部分的源码。
导出示例:

从数据库或者其他地方导出数据到Excel中,本质上是从数据库中把全部数据查出来,然后再写进Excel
1、依赖同上
2、定义数据接口
  1. //数据列表的导出功能
  2.     void exportData(HttpServletResponse response);
复制代码
3、接口实现(这只是项目中的实际需求,大家可以根据实际修改)
  1. @Override
  2.     public void exportData(HttpServletResponse response) {
  3.         try {
  4.             //指定响应数据的格式
  5.             response.setContentType("application/vnd.ms-excel");
  6.             //防止乱码
  7.             response.setCharacterEncoding("utf-8");
  8.             //文件名
  9.             String fileName = URLEncoder.encode( "数据字典","utf-8");
  10.             //告诉浏览器以附件的方式打开(下载)
  11.             response.setHeader("Content-disposition", "attachment;filename="+ fileName + ".xlsx");
  12.             List<Dict> dictList = baseMapper.selectList(null);
  13.             //需要接收的是DictEvo类型  但是原来查的是Dict类型  需要进行一个转换
  14.             //转成vo对象  然后再转入dictEeVoList中
  15.             List<DictEeVo> voList = new ArrayList<>();
  16.             for (Dict dict : dictList) {
  17.                 DictEeVo vo = new DictEeVo();
  18.                 //两者的属性名是相同的  使用工具类直接转
  19.                 BeanUtils.copyProperties(dict,vo);
  20.                 voList.add(vo);
  21.             }
  22.             EasyExcel.write(response.getOutputStream(), DictEeVo.class).sheet("数据字典").doWrite(voList);
  23.         } catch (IOException e) {
  24.             e.printStackTrace();
  25.         }
  26.     }
复制代码
4、controller调用
  1.    @ApiOperation("导出数据")
  2.     @GetMapping(value = "/exportData")
  3.     public void exportData(HttpServletResponse response) {
  4.         dictService.exportData(response);
  5.     }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

一给

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表