Springboot+vue前后端分离项目,poi导出excel提供用户下载的解决方案
因为我们做的是前后端分离项目 无法采用response.write直接将文件流写出
我们采用阿里云oss 进行保存 再返回的结果对象里面保存我们的文件地址
废话不多说,上代码
Springboot
第一步导入poi相关依赖
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>4.1.2</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>4.1.2</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml-schemas</artifactId>
<version>4.1.2</version>
</dependency>
第二步编写批量导出api
student对象
@Data
public class StudentDto {
@JsonDeserialize(using = LongJsonDeserializer.class)
@JsonSerialize(using = LongJsonSerializer.class)
private Long id;
private String name;
private String studentId;
private String collegename;
private int collegeId;
private int classId;
private String classname;
private Integer role;
private String email;
private String phone;
}
阿里云oss文件上传的service(不会使用阿里云oss的可以查看 https://www.cnblogs.com/jydm/p/14745418.html)
@Override
public String uploadFileXlsx(InputStream inputStream, String own,String fileName) throws Exception {
OSS ossClient = OssUtil.getossClient();
//这里最好对文件路径或名字做一下处理,防止文件名或路径重复导致文件丢失或者被覆盖
String url ="pm/"+own+"/"+fileName+".xlsx";
//上传
ossClient.putObject(OssProperies.BUCKET_NAME, url, inputStream);
// 关闭OSSClient。
ossClient.shutdown();
return "https://"+OssProperies.BUCKET_NAME+"."+OssProperies.END_POINT+"/"+url;
}
Controller
@ApiOperation("导出学生信息")
@PostMapping("/exportStudents")
@RequiresRoles("admin")
public Result exportStudents(@RequestBody String students){
//将前端传递的json数据转换为对象数组
JSONObject jsonObject = JSONObject.parseObject(students);
List<StudentDto> studentDtos = JSONObject.parseArray(jsonObject.getJSONArray("students").toJSONString(), StudentDto.class);
//创建excel工作表
Workbook workbook =new XSSFWorkbook();
Sheet studentsheet = workbook.createSheet("学生信息表");
Row row = studentsheet.createRow(0);
String[] title= {"学号","姓名","学院","班级","电话","邮箱"};
for (int i = 0; i < 6; i++) {
Cell cell = row.createCell(i);
cell.setCellValue(title[i]);
}
for (int i = 1; i < studentDtos.size()+1; i++) {
StudentDto studentDto = studentDtos.get(i - 1);
Row row1 = studentsheet.createRow(i);
Cell cell0 = row1.createCell(0);
cell0.setCellValue(studentDto.getStudentId());
Cell cell1 = row1.createCell(1);
cell1.setCellValue(studentDto.getName());
Cell cell2 = row1.createCell(2);
cell2.setCellValue(studentDto.getCollegename());
Cell cell3 = row1.createCell(3);
cell3.setCellValue(studentDto.getClassname());
Cell cell4 = row1.createCell(4);
cell4.setCellValue(studentDto.getPhone());
Cell cell5 = row1.createCell(5);
cell5.setCellValue(studentDto.getEmail());
}
InputStream excelStream = null;
String path=null;
try {
//这里就是io流的转换 WorkBook需要写入一个输出流 阿里云oss保存文件需要一个输入流
ByteArrayOutputStream out = new ByteArrayOutputStream();
workbook.write(out);
out.close();
excelStream= new ByteArrayInputStream(out.toByteArray());
workbook.close();
path = fileService.uploadFileXlsx(excelStream, "admin", "学生信息表");
} catch (Exception e) {
e.printStackTrace();
}
HashMap<Object, Object> map = new HashMap<>();
map.put("url",path);
return Result.succ(map);
}
这样我们就返回给前端我们的一个文件地址
vue前端处理
我们请求完成之后可以设置一个弹出框 询问用户是否需要下载 然后将 window.location.href 指向我们的文件地址
或者请求结果返回为请求成功,直接将window.location.href 指向我们的文件地址
async exportExcel(){
const{data:res}=await this.$axios.post("/student/exportStudents",{students:this.multipleSelection})
console.log(res)
if(res.code==200){
this.$confirm('导出成功,是否下载到电脑', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'success'
}).then(() => {
window.location.href=res.data.url
}).catch(() => {
this.$message({
type: 'info',
message: '已取消'
});
});
}
}
这样我们就实现了 springboot+vue前后端分离项目 批量导出功能
Springboot+vue前后端分离项目,poi导出excel提供用户下载的解决方案的更多相关文章
- SpringBoot+Vue前后端分离项目,maven package自动打包整合
起因:看过Dubbo管控台的都知道,人家是个前后端分离的项目,可是一条打包命令能让两个项目整合在一起,我早想这样玩玩了. 1. 建立个maven父项目 next 这个作为父工程,next Finish ...
- SpringBoot+Vue前后端分离,使用SpringSecurity完美处理权限问题
原文链接:https://segmentfault.com/a/1190000012879279 当前后端分离时,权限问题的处理也和我们传统的处理方式有一点差异.笔者前几天刚好在负责一个项目的权限管理 ...
- 喜大普奔,两个开源的 Spring Boot + Vue 前后端分离项目可以在线体验了
折腾了一周的域名备案昨天终于搞定了. 松哥第一时间想到赶紧把微人事和 V 部落部署上去,我知道很多小伙伴已经等不及了. 1. 也曾经上过线 其实这两个项目当时刚做好的时候,我就把它们部署到服务器上了, ...
- 两个开源的 Spring Boot + Vue 前后端分离项目
折腾了一周的域名备案昨天终于搞定了. 松哥第一时间想到赶紧把微人事和 V 部落部署上去,我知道很多小伙伴已经等不及了. 1. 也曾经上过线 其实这两个项目当时刚做好的时候,我就把它们部署到服务器上了, ...
- springboot + mybatis 前后端分离项目的搭建 适合在学习中的大学生
人生如戏,戏子多半掉泪! 我是一名大四学生,刚进入一家软件件公司实习,虽说在大学中做过好多个实训项目,都是自己完成,没有组员的配合.但是在这一个月的实习中,我从以前别人教走到了现在的自学,成长很多. ...
- Jeecg-Boot 2.0 版本发布,基于Springboot+Vue 前后端分离快速开发平台
目录 Jeecg-Boot项目简介 源码下载 升级日志 Issues解决 v1.1升级到v2.0不兼容地方 系统截图 Jeecg-Boot项目简介 Jeecg-boot 是一款基于代码生成器的智能开发 ...
- SpringBoot,Vue前后端分离开发首秀
需求:读取数据库的数据展现到前端页面 技术栈:后端有主要有SpringBoot,lombok,SpringData JPA,Swagger,跨域,前端有Vue和axios 不了解这些技术的可以去入门一 ...
- SpringBoot +Vue 前后端分离实例
今天下了Vue,想试一试前后端分离的实现,没想到坑还不少,这里就记录一下我遇到的坑和我的代码: 一.Vue的下载安装:从网上找就好了,没什么问题,除了下载以后,要把镜像库改成淘宝的,要不然太慢了. 二 ...
- SpringBoot+Vue前后端分离,使用SpringSecurity完美处理权限问题(一)
当前后端分离时,权限问题的处理也和我们传统的处理方式有一点差异. 笔者前几天刚好在负责一个项目的权限管理模块,现在权限管理模块已经做完了,我想通过5-6篇文章,来介绍一下项目中遇到的问题以及我的解决方 ...
随机推荐
- jmeter简单的压测案例——访问百度并发5,持续请求15
好记性不如烂笔头,还是记记吧. jmeter压测的指标有很多,先从简单的入手,下一章节再讲解jmeter组件的作用. 需求是:访问百度的压测指标是:10s内并发5,持续15次请求.那么需要设置以下几点 ...
- sqlalchemy 查询结果转json个人解决方案
参考了网上很多资料,自己搞了一个适合的 在model 内增加一个函数: class User(db.Model): __tablename__ = 'user' userid = db.Column( ...
- 四、mybatis动态sql
# 前言前面mysql都是通过静态sql进行查询的,但是如果业务复杂的时候,我们会遇到引号问题,或者多一个空格,这就使得sql代码编写错误了,所以为了解决这个问题,我们有了动态sql. Mybatis ...
- C语言数组的创建和使用
C语言数组的创建和使用 数组是一组相同类型元素的集合. 一维数组的创建及初始化 //创建int类型的数组 //直接创建:不对数组进行初始化 int arr1[10]; //最常用.好用的创建方式 in ...
- 实时获取股票数据,免费!——Python爬虫Sina Stock实战
更多精彩内容,欢迎关注公众号:数量技术宅,也可添加技术宅个人微信号:sljsz01,与我交流. 实时股票数据的重要性 对于四大可交易资产:股票.期货.期权.数字货币来说,期货.期权.数字货币,可以从交 ...
- THUSC & 中考 & NOI 拉跨记
THUSC 的拉胯记 时代比较久远了,可能有些事情记不清楚了. Day -\(\infty\) 本来说只有我.llsw.wxk过了审核,后来wy.lyc也搞了个体验营名额,于是和高二的一起集训. Da ...
- Kotlin/Native KMM项目架构
一.什么是KMM? Kotlin Multiplatform Mobile ( KMM ) 是一个 SDK,旨在简化跨平台移动应用程序的创建.在 KMM 的帮助下,您可以在 iOS 和 Android ...
- Ubuntu安装 配置GCC和Vim
VMware14.0和Ubuntu镜像安装 https://mp.weixin.qq.com/s/045wrbdv92PkUQn2abddvA 适应屏幕设置 按照下列流程检查虚拟机设置 查看 -> ...
- 图解Redis6中的9种数据结构,墙裂建议准备去面试的人先看(干货,建议收藏)
如图所示,Redis中提供了9种不同的数据操作类型,他们分别代表了不同的数据存储结构. 图2-17 数据类型 String类型 String类型是Redis用的较多的一个基本类型,也是最简单的一种类型 ...
- JavaScript05
显示和隐藏 元素的显示和隐藏 元素display属性可控制元素的显示和隐藏,先获取元素对象,再通过点语法调用style对象中的display属性 语法格式: 元素.style.display='non ...