作者: Memory(星哥) Wechat:/QQ: 574373426
整理不易,感谢支持,欢迎 收藏 转发 分享
专注IT职业教育多年,学编程找星哥
技术栈准备前端页面创建SpringBoot项目导入相关依赖准备数据库数据在Application.yml配置文件中整合数据源创建实体类对象创建Mapper创建Controller创建Service核心: ExportExcel工具类(创建Excel,Sheet,行,表格,样式)启动项目测试Gitee项目路径
技术栈前后端分离
后端采用 SpringBoot框架,整合 web , Mybtais-Plus , Apache POI , lombok
前端采用 Vue, ElementUI 做一个简易的页面发起请求(只有一个按钮)
数据库采用 Mysql
开发工具 IDEA2020.3.4
前端页面采用Vue+ElementUI
为了方便测试,没有构建Vue项目,直接引入对应的js文件
采用cdn在线引入的方式,也可以下载到本地引入
发起请求的方式: 采用 window.open(url)
作用: 发起请求,在新窗口打开,后续我们点击导出后,会在新窗口下载excel文件
也可以使用axios或者其他ajax发起请求,但需要注意要设置返回值类型
这里为了方便 直接使用 window.open(url) 效果是一样的
效果如下: 只有一个按钮
创建SpringBoot项目导出
使用阿里云脚手架创建SpringBoot项目: https://start.aliyun.com
勾选Web依赖
创建项目后手动在pom.xml中添加也行 , 图个方便 , 就顺手勾一下
web,POI,jdbc,Mybatis-Plus,lombok
准备数据库数据org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-test test org.junit.vintage junit-vintage-engine org.apache.poi poi 4.1.2 org.apache.poi poi-excelant 4.1.2 org.apache.poi poi-ooxml 4.1.2 org.apache.poi poi-ooxml-schemas 4.1.2 org.apache.poi poi-scratchpad 4.1.2 mysql mysql-connector-java com.baomidou mybatis-plus-boot-starter 3.4.3 com.baomidou mybatis-plus 3.4.3 org.projectlombok lombok
User表存储 用户ID 用户名 密码 用户状态信息
后期将此数据导出到Excel表格中
数据库文件
#创建数据库 CREATE database poidata DEFAULT CHARACTER SET utf8; #使用数据库 use poidata; #创建表格 create table user( id int primary key auto_increment, name varchar(10), pwd varchar(10), status int ) charset utf8; #插入数据 insert into user(id,name,pwd,status) value (null,'张三','123',1); insert into user(id,name,pwd,status) value (null,'学编程找星哥','574373426',1); insert into user(id,name,pwd,status) value (null,'李四','123',0);在Application.yml配置文件中整合数据源
server:
port: 8080
#管理数据源
spring:
datasource:
#高版本驱动使用
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/poidata?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=true
#设定用户名和密码
username: root
password: root
创建实体类对象
在 com.xg.pojo 中创建实体类User
实体类属性要与数据库字段名保持一致
@Data
public class User {
private Integer id;
private String name;
private String pwd;
private Integer status;
}
创建Mapper
在com.xg.mapper下创建ReportMapper
并继承baseMapper,必须范型User
Mapper 继承该接口后,无需编写 mapper.xml 文件,即可获得CRUD功能
package com.xg.mapper; import com.baomidou.mybatisplus.core.mapper.baseMapper; import com.xg.pojo.User; import org.apache.ibatis.annotations.Mapper; @Mapper public interface ReportMapper extends baseMapper创建Controller{ }
在controller方法中可直接注入HttpServletResponse对象
package com.xg.controller;
import com.xg.service.ReportService;
import org.apache.tools.ant.util.DateUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLEncoder;
import java.util.Date;
@Controller
@CrossOrigin //允许跨域请求
public class RequestController {
@Autowired
ReportService reportService;
@GetMapping("/reportExport/prodTest")
public Object prodTest(HttpServletResponse response, String excelTitle) throws IOException {
// 创建导出文件名称 当前日期+前台传递过来的标题名(excelTitle)
String fileName = DateUtils.format(new Date(),"yyyyMMddHHmmss") +"-"+excelTitle+".xls";
// 设置返回的消息头和返回值类型 并设置编码 不设置编码文件名为中文的话 不会显示
// 当设置成如下返回值时,浏览器才会执行下载文件动作
response.setHeader("Content-disposition", "attachment; filename=" + URLEncoder.encode(fileName, "UTF-8"));
response.setContentType("APPLICATION/OCTET-STREAM;charset=UTF-8");
// 创建输出流,调用service中exportTest方法,参数:输出流 标题名
reportService.exportTest(response.getOutputStream(), excelTitle);
return null;
}
}
创建Service
在com.xg.service包下创建 ReportService 接口
package com.xg.service;
import java.io.IOException;
import java.io.OutputStream;
public interface ReportService {
void exportTest(OutputStream out, String excelTitle) throws IOException;
}
在com.xg.service包下创建 ReportServiceImpl 实现类,重写exportTest方法
exportTest方法接收Controller传递过来的输出流以及标题名
package com.xg.service;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.xg.mapper.ReportMapper;
import com.xg.pojo.User;
import com.xg.util.ExportExcel;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Service
public class ReportServiceImpl implements ReportService{
@Autowired
ReportMapper reportMappe;
@Override
public void exportTest(OutputStream out, String excelTitle) throws IOException {
// 定义列标 就是一个Excel的标题而已 下面有图介绍
String[] rowsName = new String[]{"用户id", "用户名", "密码", "是否禁用"};
// 创建导出数据集合 后续会将dataList中的数据写到Excel
List


