Spring Boot | 集成 EasyExcel 实现数据导入导出功能[通俗易懂]

Spring Boot | 集成 EasyExcel 实现数据导入导出功能[通俗易懂]引入 Maven 依赖<dependency> <groupId>com.alibaba</groupId&gt

欢迎大家来到IT世界,在知识的湖畔探索吧!

引入 Maven 依赖

<dependency>
  <groupId>com.alibaba</groupId>
  <artifactId>easyexcel</artifactId>
  <version>3.1.1</version>
</dependency>

欢迎大家来到IT世界,在知识的湖畔探索吧!

导出、导入数据模型

Book.java

欢迎大家来到IT世界,在知识的湖畔探索吧!import com.alibaba.excel.annotation.ExcelIgnore;
import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.format.DateTimeFormat;
import com.alibaba.excel.annotation.write.style.ColumnWidth;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;

import java.util.Date;

@Data
@TableName("t_book")
public class Book {
    @TableId
    @ExcelIgnore
    private String id;

    @ExcelProperty(value = "书名")
    @ColumnWidth(50)
    private String name;

    @ExcelProperty("作者")
    private String author;

    /** 封面图片地址 */
    @ExcelIgnore
    private String coverUrl;

    @ExcelProperty("出版社")
    @ColumnWidth(20)
    private String publisher;

    @ExcelProperty("评分")
    private Double score;

    /** 状态 */
    @ExcelIgnore
    private Integer status;

    /** 排序序号 */
    @ExcelIgnore
    private Integer orderNo;

    /** 创建者 */
    @ExcelIgnore
    private String createBy;

    /** 创建时间 */
    @ExcelProperty("创建时间")
    @ColumnWidth(20)
    @DateTimeFormat("yyyy-MM-dd HH:mm:ss")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date createTime;

    /** 更新者 */
    @ExcelIgnore
    private String updateBy;

    /** 更新时间 */
    @ExcelIgnore
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date updateTime;
}

数据导出功能

数据导出功能具体实现代码如下:

@RequestMapping("/export")
public void exportData(HttpServletResponse response) throws Exception {
    // 这里注意 有同学反应使用swagger 会导致各种问题,请直接用浏览器或者用postman
    response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
    response.setCharacterEncoding("utf-8");
    // 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系
    String fileName = URLEncoder.encode("书籍", "UTF-8").replaceAll("\\+", "%20");
    response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");

    List<Book> books = bookService.all();
    EasyExcel.write(response.getOutputStream(), Book.class).sheet("书籍").doWrite(books);
}

数据导出功能实现比较简单,只需要指定输出流、导出模型对象、sheet名称、导出数据就可以了。

测试:在浏览器地址栏输入localhost:8001/book/export会直接弹出保存文件的对话框,文件名为:书籍.xlsx。

数据导入功能

数据导入需要如下3个前提条件:

  • 一个回调监听器:ImportListener,监听数据变化,满足条件时调用数据持久化方法
  • 一个有保存数据方法的接口:ExcelImporter,供其它具体数据持久化类实现
  • 一个 Service 实现 ExcelImporter,实现具体的数据持久化操作

ImportListener.java

欢迎大家来到IT世界,在知识的湖畔探索吧!import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import jenny.learn.springboot.excel.support.ExcelImporter;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.RequiredArgsConstructor;

import java.util.ArrayList;
import java.util.List;

@Data
@RequiredArgsConstructor
@EqualsAndHashCode(callSuper = true)
public class ImportListener<T> extends AnalysisEventListener<T> {

    /**
     * 默认每隔3000条存储数据库
     */
    private int batchCount = 3000;
    /**
     * 缓存的数据列表
     */
    private List<T> list = new ArrayList<>();
    /**
     * 数据导入类
     */
    private final ExcelImporter<T> importer;

    @Override
    public void invoke(T data, AnalysisContext analysisContext) {
        list.add(data);
        // 达到BATCH_COUNT,则调用importer方法入库
        if (list.size() >= batchCount) {
            // 调用importer方法
            importer.save(list);
            // 存储完成清理list
            list.clear();
        }
    }

    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
        // 调用importer方法
        importer.save(list);
        // 存储完成清理list
        list.clear();
    }

}

ExcelImporter.java

import java.util.List;

public interface ExcelImporter<T> {

    /**
     * 导入数据逻辑
     *
     * @param data 数据集合
     */
    void save(List<T> data);

}

数据导入功能具体实现代码如下:

@RequestMapping("/import")
public void importData(MultipartFile file) throws Exception {
    // 回调监听器
    ImportListener<Book> importListener = new ImportListener<>(bookService);
    EasyExcel.read(file.getInputStream(), Book.class, importListener).sheet().doRead();
}

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://itzsg.com/17901.html

(0)

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们YX

mu99908888

在线咨询: 微信交谈

邮件:itzsgw@126.com

工作时间:时刻准备着!

关注微信