如果我们需要把数据库中的数据导出,那么大家可能会使用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导出,实测七万多条数据用了不到五秒的时间,可见性能很强大了。

文档可查阅 EasyExcel · 语雀 (yuque.com)

如果觉得我的文章对你有用,请随意赞赏