使用EasyExcel将MySQL中查询出来的数据下载到Excel文件中

Posted 外包小何

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用EasyExcel将MySQL中查询出来的数据下载到Excel文件中相关的知识,希望对你有一定的参考价值。

使用EasyExcel将mysql中查询出来的数据下载到Excel文件中

文章目录

一,目标描述

我用ptt论坛的数据来做demo演示和说明。数据使用爬虫爬下来,ptt爬虫链接。爬下来的数据是JSON格式,我已经保存到MySQL数据库pttdb的表格Article中。数据库中的数据如下图所示:

目标是做接口把从Tue Apr 20 19:40:38 2021到Tue Apr 20 19:45:32 2021这五分钟的数据(总共18条)查询出来,并下载到Excel文件中。
下载的结果如下图所示:

使用springboot做好的接口为get请求,使用范例如下:
http://localhost:8080/download?startTime=Tue%20Apr%2020%2019:40:38%202021&endTime=Tue%20Apr%2020%2019:45:32%202021

二,代码实现

(一)代码目录图

(二)文件代码及说明

首先是pom.xml,引入需要的mysql驱动依赖、hibernate依赖、阿里巴巴的easyexcel依赖,如下所示:

		<dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.11</version>
        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-hikaricp</artifactId>
            <version>5.4.17.Final</version>
        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-ehcache</artifactId>
            <version>5.4.17.Final</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>easyexcel</artifactId>
            <version>2.2.7</version>
        </dependency>

接着是配置文件application.yml,配置好要连接的MySQL数据库,以及JPA的配置:

spring:
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/pttdb?useUnicode=true&characterEncoding=utf-8&useSSL=false&useFastDateParsing=false&serverTimezone=GMT%2B8
    username: ******
    password: ******
    driverClassName: com.mysql.cj.jdbc.Driver

  jpa:
    database-platform: org.hibernate.dialect.MySQL5InnoDBDialect
    show-sql: true
    hibernate:
      ddl-auto: update
      naming:
        physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
    properties:
      hibernate:
        enable_lazy_load_no_trans: true

再看MySQL数据库pttdb中的表格Article,表格的实体类Article.java如下:

package com.example.csdnblog001.demo.model;

import lombok.Data;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import java.util.UUID;

@Data
@Entity
public class Article 
    @Id
    private String articleId = UUID.randomUUID().toString().replace("-", "");

    private String articleTitle;

    private String author;

    private String board;

    @Column(columnDefinition = "longtext")
    private String content;

    private String date;

    private String ip;

    private String messageCount;

    @Column(columnDefinition = "longtext")
    private String messages;

    private String url;



对表格进行增删改查的dao层文件ArticleDao.java如下,其中只有一个函数,根据日期范围进行查询,查询出date和date2之间的文章列表:

package com.example.csdnblog001.demo.dao;

import com.example.csdnblog001.demo.model.Article;
import org.springframework.data.jpa.repository.JpaRepository;

import java.util.List;

public interface ArticleDao extends JpaRepository<Article, String> 
    List<Article> findAllByDateBetween(String date, String date2);


本次笔记的重头戏要来了,怎么把查询出来的文章数据下载到Excel文件中。这里感谢easyexcel开发者提供的工具,非常方便。参考官方文档web中的写以及GitHub链接
首先是要保存的Excel表格的实体类,见DownloadData.java:

package com.example.csdnblog001.demo.model;
import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;

@Data
public class DownloadData 

    @ExcelProperty("布告编号")
    private String articleId;

    @ExcelProperty("标题")
    private String articleTitle;

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

    @ExcelProperty("板块")
    private String board;

    @ExcelProperty("内容")
    private String content;

    @ExcelProperty("布告日期")
    private String date;

    @ExcelProperty("发布者IP")
    private String ip;

    @ExcelProperty("回复统计信息")
    private String messageCount;

    @ExcelProperty("回复")
    private String messages;

    @ExcelProperty("布告链接")
    private String url;

    public DownloadData() 

    

    public DownloadData(String articleId,
                   String articleTitle,
                   String author,
                   String board,
                   String content,
                   String date,
                   String ip,
                   String messageCount,
                   String messages,
                   String url) 
        this.articleId = articleId;
        this.articleTitle = articleTitle;
        this.author = author;
        this.board = board;
        this.content = content;
        this.date = date;
        this.ip = ip;
        this.messageCount = messageCount;
        this.messages = messages;
        this.url = url;
    


将查询出来的数据保存在DownloadData的列表中,每个DownloadData对象是一篇文章,也是Excel表格中的一行,代码在ArticleServiceImpl.java中:

package com.example.csdnblog001.demo.service;

import com.example.csdnblog001.demo.dao.ArticleDao;
import com.example.csdnblog001.demo.model.Article;
import com.example.csdnblog001.demo.model.DownloadData;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

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

@Service
public class ArticleServiceImpl 
    @Autowired
    ArticleDao articleDao;

    public List<DownloadData> data(String date1, String date2)
        List<DownloadData> list = new ArrayList<DownloadData>();
        List<Article> result = articleDao.findAllByDateBetween(date1,date2);
        for(Article article:result)
            DownloadData data = new DownloadData(article.getArticleId(),
                    article.getArticleTitle(),
                    article.getAuthor(),
                    article.getBoard(),
                    article.getContent(),
                    article.getDate(),
                    article.getIp(),
                    article.getMessageCount(),
                    article.getMessages(),
                    article.getUrl());

            list.add(data);
        
        return list;
    


最后是下载的restAPI,使用get请求,下载的文件名默认为“下载.xlsx”,代码在DownloadService.java中

package com.example.csdnblog001.demo.rest;

import com.alibaba.excel.EasyExcel;
import com.example.csdnblog001.demo.model.DownloadData;
import com.example.csdnblog001.demo.service.ArticleServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLEncoder;

@RestController
public class DownloadService 

    @Autowired
    private ArticleServiceImpl articleServiceImpl;

    @GetMapping("/download")
    public void download(HttpServletResponse response,
                         @RequestParam(required = false, defaultValue = "下载") String name,
                         @RequestParam String startTime,
                         @RequestParam String endTime
    ) throws IOException 
        // 这里注意 有同学反应使用swagger 会导致各种问题,请直接用浏览器或者用postman
        response.setContentType("application/vnd.ms-excel");
        response.setCharacterEncoding("utf-8");
        // 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系
        String fileName = URLEncoder.encode(name, "UTF-8").replaceAll("\\\\+", "%20");
        response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");
        EasyExcel.write(response.getOutputStream(), DownloadData.class).sheet("模板").doWrite(articleServiceImpl.data(startTime, endTime));
    



做好的接口http://localhost:8080/download?startTime=Tue%20Apr%2020%2019:40:38%202021&endTime=Tue%20Apr%2020%2019:45:32%202021复制到浏览器中,按enter键即可直接下载。

三,补充说明

本次略去JPA、springboot、MySQL等知识的说明

以上是关于使用EasyExcel将MySQL中查询出来的数据下载到Excel文件中的主要内容,如果未能解决你的问题,请参考以下文章

EasyExcel封装一个分页写数据的通用方法(保姆级),继上一篇easyExcel导出上线后的优化

poi和easyExcel基于Java操作Excel学习笔记

EasyExcel专题 Excel 读取写入上传和下载

EasyExcel专题 Excel 读取写入上传和下载

EasyExcel专题 Excel 读取写入上传和下载

如何将navicat for mysql 中查询出来的内容导出到xls文件中