Loading... 如果我们需要把数据库中的数据导出,那么大家可能会使用POI,POI是非常强大的,但是却有它的缺点,比如比较消耗内存,所以阿里巴巴团队便开源了JAVA解析Excel工具EasyExcel。easyexcel重写了poi对07版Excel的解析,能够原本一个3M的excel用POI sax依然需要100M左右内存降低到几M,并且再大的excel不会出现内存溢出,03版依赖POI的sax模式。在上层做了模型转换的封装,让使用者更加简单方便。 ## 什么是EasyExcel? EasyExcel是一个基于Java的简单、省内存的读写Excel的开源项目。在尽可能节约内存的情况下支持读写百M的Excel。 Github地址:https://github.com/alibaba/easyexcel ## 使用 ### 引入POM依赖 由于是对POI进行的优化,所以我们可以在引入EasyExcel的时候先将之前的POI依赖删除或注释掉,然后填入以下依赖: ```xml <!--office工具--> <dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>2.2.10</version> </dependency> ``` 然后Reload maven等待引入EasyExcel。 ## 创建实体类 ```java /* * Copyright (c) 2021. Kaygb * All rights reserved. * Site: https://www.vwmwv.cn/ * Github: https://github.com/kaygb/ */ package cn.vwmwv.hgnuman.entity; import com.alibaba.excel.annotation.ExcelIgnore; import com.alibaba.excel.annotation.ExcelProperty; import com.alibaba.excel.annotation.write.style.ColumnWidth; import com.fasterxml.jackson.annotation.JsonFormat; import lombok.Data; import org.springframework.data.annotation.CreatedDate; import javax.persistence.*; import java.util.Date; // 报修任务 @Data @Entity @Table(name = "mana_task") @ColumnWidth(30) public class Task { @ExcelIgnore @Id @GeneratedValue(strategy = GenerationType.IDENTITY) Long id; @ExcelProperty(value = "创建时间", index = 0) @CreatedDate @JsonFormat(pattern="yyyy-MM-dd hh:mm:ss") @Column Date createtime;// 创建时间 @ExcelIgnore @Column Date updatetime;// 接单时间 @ExcelIgnore @Column Date verfytime;// 审核时间 @ExcelProperty(value = "报修内容描述", index = 1) @Column String description;// 报修内容描述 @ExcelProperty(value = "图片链接", index = 2) @Column String imgsrc; // 图片地址 @ExcelIgnore @Column Integer categoryid; // 所属分类id @ExcelProperty(value = "分类", index = 3) @Column String categoryname; // 此处省略部分代码 } ``` 在实体类上使用注解,表示该字段是否是需要导出的字段,并通过index设设置列顺序 - @ExcelProperty(value = "表头字段" index = 1) - @ExcelIgnore // 忽略此字段,即导出的时候不输出 - @ColumnWidth(30) // 指定列宽为30 ### 取出数据写入Excel 项目中使用的Spring-data-jpa,所以我们通过方法对数据库进行时间区间查询并返回一个List(数据库和数据记得配置好) ```java List<Task> taskList = taskRepository.findAllByCreatetimeGreaterThanEqualAndCreatetimeLessThanEqual(startTimeData,endTimeData); ``` 创建导出数据的路径为项目同级根目录 ```java String PATH = new ApplicationHome(this.getClass()).getSource().getParentFile().getPath() + "/export/"; File file=new File(PATH); if(!file.exists()){//如果文件夹不存在 file.mkdir();//创建文件夹 } ``` 写入数据 ```java // 将List数据写入Excel表格 try{ String fileName = System.currentTimeMillis() + ".xlsx"; String writeNamePath = PATH + fileName; // 创建Excel表单名称 log.info("writeNamePath: " + writeNamePath); if (taskList.size()!=0){ EasyExcel.write(writeNamePath, Task.class).sheet("分类报修任务单").doWrite(taskList); // 保存生成的数据日期、路径、到数据库中 }else{ return 2;// 无数据 } log.info(PATH); }catch(Exception e){ e.printStackTrace(); } ``` ## 性能测试 博主是先从云数据库中取出数据之后,处理一遍再使用Excel导出,实测七万多条数据用了不到五秒的时间,可见性能很强大了。 文档可查阅 [EasyExcel · 语雀 (yuque.com)](https://www.yuque.com/easyexcel/doc/easyexcel) © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 如果觉得我的文章对你有用,请随意赞赏