EasyExcel的基本使用

  • 官方网址:https://www.yuque.com/easyexcel/doc/easyexcel
  • 应用场景
    • 数据导入:减少录入工作量
    • 数据导出:统计信息归档
    • 数据传输:异构系统之间数据传输
  • EasyExcel特点
    • 它是阿里巴巴开源的一个excel处理框架,以使用简单、节省内存著称。EasyExcel能大量减少占用内存的主要原因是在解析Excel时没有将文件数据一次性全部加载到内存中,而是从磁盘中一行行读取数据,逐个解析。
    • EasyExcel采用一行一行的解析模式,并将一行的解析结果以观察者的模式通知处理(AnalysisEventListener)
  • EasyExcel写操作
    • 导入依赖的版本对应关系(版本慎重选择,否则发生冲突)
      <dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>2.1.1</version> </dependency> <!--xls--> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>3.17</version> </dependency> <!--xlsx--> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>3.17</version> </dependency>
    • 创建一个与excel表格字段相对应的实体类(字段==属性)
      package com.xsha.demo.excel; import com.alibaba.excel.annotation.ExcelProperty; import lombok.Data; @Data public class MyData { // 设置excel表表头 @ExcelProperty(value = "学生编号") private String sno; @ExcelProperty(value = "学生姓名") private String sname; }
    • 代码测试
      // 实现EasyExcel写操作 @Test public void writeExcel() { // 1.设置写入文件夹地址和excel文件名称 String filename = "存放文件的绝对路径\\write.xlsx"; // 2.准备数据集 List<MyData> list = new ArrayList<>(); for (int i = 0; i < 5; i++) { MyData data = new MyData(); data.setSno(i); data.setSname("xiansen"+i); list.add(data); } // 3.调用EasyExcel里面的方法实现写的操作,第一个参数是文件路径,第二个参数是实体类名称 EasyExcel.write(filename, MyData.class).sheet("学生列表").doWrite(list); }
  • 示例:文件导出(文件下载)
  • 控制层代码,其中的response参数可以传递给业务层
@RestController @RequestMapping("/file") @CrossOrigin public class LocalFileController { @Autowired private LocalFileService localFileService; /** 文件导出(下载) */ @GetMapping("/download") public Result download(HttpServletResponse response) { return Result.bingo(localFileService.download(response)); } }
  • 业务层(只显示实现类),通过给response设置一些参数,提供用户选择下载路径的功能
@Service public class LocalFileServiceImpl extends ServiceImpl<LocalFileMapper, LocalFile> implements LocalFileService { /** * 文件导出(下载) * @param response 响应 * @return int */ @Override public int download(HttpServletResponse response) { response.setContentType("application/vnd.ms-excel"); response.setCharacterEncoding("utf-8"); String filename = "dict"; response.setHeader("Content-disposition", "attachment:filename="+filename+".xlsx"); // 查询数据库 List<LocalFile> fileList = baseMapper.selectList(null); List<LocalFileEeVo> list = BeanUtil.copyToList(fileList, LocalFileEeVo.class); try { EasyExcel.write(response.getOutputStream(), LocalFileEeVo.class).sheet("dict").doWrite(list); return 1; } catch (Exception e) { throw new MyException("文件读取失败!"); } } }
  • 提供的LocalFileEeVo类,供导出Excel表的格式数据
@Data public class LocalFileEeVo { @ExcelProperty(value = "id", index = 0) private Long id; @ExcelProperty(value = "名称", index = 1) private String name; @ExcelProperty(value = "年龄", index = 2) private Integer age; @ExcelProperty(value = "性别", index = 3) private String gender; @ExcelProperty(value = "班级", index = 4) private Long classId; }
  • 最后允许询问即可

  • EasyExcel读操作

    • 导入的依赖及版本控制是一样的
    • 创建的实体类也是excel表格字段一致,只不过在注解中增加一个属性,指定表格的第几个字段(从0开始)
      package com.xsha.demo.excel; import com.alibaba.excel.annotation.ExcelProperty; import lombok.Data; @Data public class MyData { // 设置excel表表头 @ExcelProperty(value = "学生编号", index = 0) private Integer sno; @ExcelProperty(value = "学生姓名", index = 1) private String sname; }
    • 创建一个“监听器”进行excel表的读取(结构较为固定,内容根据需求变动)
      package com.xsha.demo.excel; import com.alibaba.excel.context.AnalysisContext; import com.alibaba.excel.event.AnalysisEventListener; import java.util.Map; public class ExcelListener extends AnalysisEventListener<MyData> { // 逐行读取excel表格的内容 @Override public void invoke(MyData data, AnalysisContext analysisContext) { System.out.println(data.getSno()+"-----"+data.getSname()); } // 读取表头的内容 @Override public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) { System.out.println("表头:"+headMap); } // 读取完成之后 @Override public void doAfterAllAnalysed(AnalysisContext analysisContext) { } }
    • 代码测试
      // 实现EasyExcel读操作 @Test public void readExcel() { // 1.设置读取文件夹地址和excel文件名称 String filename = "D:\\xusha\\SpringProjects\\guli_parent\\service\\service_education\\src\\test\\java\\com\\xsha\\demo\\excel\\files\\write.xlsx"; // 3.调用EasyExcel里面的方法实现读的操作,第一个参数是文件路径,第二个参数是实体类名称,第三个参数是监听器 EasyExcel.read(filename, MyData.class, new ExcelListener()).sheet("学生列表").doRead(); }
  • 示例:文件导入(文件上传)

  • 控制层代码,其中的file参数是前端上传的文件(可理解为模板)

@RestController @RequestMapping("/file") @CrossOrigin public class LocalFileController { @Autowired private LocalFileService localFileService; /** 文件导入(上传) */ @PostMapping("/upload") public Result upload(MultipartFile file) { return Result.bingo(dictService.upload(file)); } }
  • 业务层(只显示实现类)
@Service public class LocalFileServiceImpl extends ServiceImpl<LocalFileMapper, LocalFile> implements LocalFileService { @Autowired private LocalFileMapper localFileMapper; /** * 文件导入(上传) * @param file 文件 * @return int */ @Override public int importData(MultipartFile file) { try { EasyExcel.read(file.getInputStream(), LocalFileEeVo.class, new LocalFileListener(LocalFileMapper)).sheet("dict").doRead(); return 1; } catch (IOException e) { e.printStackTrace(); return 0; } } }
  • 编写LocalFileListener类,Excel文件监听器(作用:逐行读取)
public class LocalFileListener extends AnalysisEventListener<LocalFileEeVo> { private LocalFileMapper localFileMapper; public LocalFileListener(LocalFileMapper localFileMapper) { this.localFileMapper = localFileMapper; } @Override public void invoke(LocalFileEeVo localFileEeVo, AnalysisContext analysisContext) { LocalFile localFile = new LocalFile(); // 逐行读取 BeanUtils.copyProperties(localFileEeVo, localFile); // 逐行保存(当然这里可以使用批量保存,这里就留给亲们优化了) dictMapper.insert(dict); } @Override public void doAfterAllAnalysed(AnalysisContext analysisContext) { } }

__EOF__

本文作者xsha_h
本文链接https://www.cnblogs.com/aitiknowledge/p/15937517.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   xsha_h  阅读(991)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示