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篇文章,来介绍一下项目中遇到的问题以及我的解决方 ...
随机推荐
- english note [6.3to6.9]
6.3 http://www.51voa.com/VOA_Special_English/pakistan-town-struggles-with-rise-in-hiv-infections-821 ...
- HTML 网页开发、CSS 基础语法——十.CSS语法
CSS代码书写位置 • CSS 规则由两个主要的部分构成:选择器,以及一条或多条声明 1.内联式 ① 内联式简介 •内联式,也被习惯叫做行内式. •书写位置:在 HTML 标签之上的 style 属性 ...
- DeDeCMS v5.7 漏洞复现
DedeCMS V5.7 漏洞复现 XSS漏洞 首先我们在首页要进行用户的注册以及登录 这里我们已经提前注册过了,登录即可 普通用户账号密码:root/passwd 管理员账号密码:admin/pik ...
- 基于预计算的全局光照(Global Illumination Based On Precomputation)
目录 基于图像的光照(Image Based Lighting,IBL) The Split Sum Approximation 过滤环境贴图 预计算BRDF积分 预计算辐射度传输(Precomput ...
- PyTorch固定参数
In situation of finetuning, parameters in backbone network need to be frozen. To achieve this target ...
- std::sort 的注意事项
Luogu P1177 [模板]快速排序 \(\Large{AC}\) 代码: #include<bits/stdc++.h> using namespace std; int n,a[1 ...
- SpringBoot入门05-全局配置文件
springboot全局配置文件作用是设置或修改默认设置 springboot全局配置文件有下面两种方式 application.xml配置文件 示例 server.port=8088 server. ...
- Visual Studio Debug only user code with Just My Code
Debug only user code with Just My Code By default, the debugger skips over non-user code (if you wan ...
- 【数据结构】c语言实现集合的交并差运算
待改写:存储数据类型int-->char 重复的元素可存储 功能上不完善 #include <stdio.h> #include <stdlib.h> typedef s ...
- TreeSet和TreeMap中“相等”元素可能并不相等
TreeSet和TreeMap元素之间比较大小是借助Comparator对象的compare方法. 但有些时候,即便compare()返回0也不意味着这两个元素直观上相同. 比如元素是二元组[a,b] ...