如果我们需要把数据库中的数据导出,那么大家可能会使用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依赖删除或注释掉,然后填入以下依赖:
<!--office工具-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>2.2.10</version>
</dependency>
然后Reload maven等待引入EasyExcel。
创建实体类
/*
* 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(数据库和数据记得配置好)
List<Task> taskList = taskRepository.findAllByCreatetimeGreaterThanEqualAndCreatetimeLessThanEqual(startTimeData,endTimeData);
创建导出数据的路径为项目同级根目录
String PATH = new ApplicationHome(this.getClass()).getSource().getParentFile().getPath() + "/export/";
File file=new File(PATH);
if(!file.exists()){//如果文件夹不存在
file.mkdir();//创建文件夹
}
写入数据
// 将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导出,实测七万多条数据用了不到五秒的时间,可见性能很强大了。