因为我们做的是前后端分离项目 无法采用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提供用户下载的解决方案的更多相关文章

  1. SpringBoot+Vue前后端分离项目,maven package自动打包整合

    起因:看过Dubbo管控台的都知道,人家是个前后端分离的项目,可是一条打包命令能让两个项目整合在一起,我早想这样玩玩了. 1. 建立个maven父项目 next 这个作为父工程,next Finish ...

  2. SpringBoot+Vue前后端分离,使用SpringSecurity完美处理权限问题

    原文链接:https://segmentfault.com/a/1190000012879279 当前后端分离时,权限问题的处理也和我们传统的处理方式有一点差异.笔者前几天刚好在负责一个项目的权限管理 ...

  3. 喜大普奔,两个开源的 Spring Boot + Vue 前后端分离项目可以在线体验了

    折腾了一周的域名备案昨天终于搞定了. 松哥第一时间想到赶紧把微人事和 V 部落部署上去,我知道很多小伙伴已经等不及了. 1. 也曾经上过线 其实这两个项目当时刚做好的时候,我就把它们部署到服务器上了, ...

  4. 两个开源的 Spring Boot + Vue 前后端分离项目

    折腾了一周的域名备案昨天终于搞定了. 松哥第一时间想到赶紧把微人事和 V 部落部署上去,我知道很多小伙伴已经等不及了. 1. 也曾经上过线 其实这两个项目当时刚做好的时候,我就把它们部署到服务器上了, ...

  5. springboot + mybatis 前后端分离项目的搭建 适合在学习中的大学生

    人生如戏,戏子多半掉泪! 我是一名大四学生,刚进入一家软件件公司实习,虽说在大学中做过好多个实训项目,都是自己完成,没有组员的配合.但是在这一个月的实习中,我从以前别人教走到了现在的自学,成长很多. ...

  6. Jeecg-Boot 2.0 版本发布,基于Springboot+Vue 前后端分离快速开发平台

    目录 Jeecg-Boot项目简介 源码下载 升级日志 Issues解决 v1.1升级到v2.0不兼容地方 系统截图 Jeecg-Boot项目简介 Jeecg-boot 是一款基于代码生成器的智能开发 ...

  7. SpringBoot,Vue前后端分离开发首秀

    需求:读取数据库的数据展现到前端页面 技术栈:后端有主要有SpringBoot,lombok,SpringData JPA,Swagger,跨域,前端有Vue和axios 不了解这些技术的可以去入门一 ...

  8. SpringBoot +Vue 前后端分离实例

    今天下了Vue,想试一试前后端分离的实现,没想到坑还不少,这里就记录一下我遇到的坑和我的代码: 一.Vue的下载安装:从网上找就好了,没什么问题,除了下载以后,要把镜像库改成淘宝的,要不然太慢了. 二 ...

  9. SpringBoot+Vue前后端分离,使用SpringSecurity完美处理权限问题(一)

    当前后端分离时,权限问题的处理也和我们传统的处理方式有一点差异. 笔者前几天刚好在负责一个项目的权限管理模块,现在权限管理模块已经做完了,我想通过5-6篇文章,来介绍一下项目中遇到的问题以及我的解决方 ...

随机推荐

  1. [转载20131024]Nginx服务器漏洞的利用和修复方法

    本文主要分为两大部分,第一部分介绍了Nginx的一些常见安全漏洞的形成原因.利用方法,并给出了相应的解决办法;第二部分介绍了Nginx安全加固时需要关注的主要内容. Nginx(发音同engine x ...

  2. 数据库管理软件navicate12的激活和安装

    前言   太多做测试或开发的小伙伴需要写sql语句,激活版navicat版本它来了 准备软件 navicat12安装包 navicat注册机 百度网盘下载链接(永久有效): 链接:https://pa ...

  3. Stream聚合函数

    Stream班介绍 幼稚园开学的第一天,各们家长把小朋友送到了园里,各位小朋友都你看看我,我看看你.有的嚎啕大哭,有的呆若木鸡....这里时候园长安排我拿来小本本记录入园的小朋友.... 记录小朋友 ...

  4. 基于 Ubuntu 21.04 BPF 开发环境全攻略

    本文地址:https://www.ebpf.top/post/ubuntu_2104_bpf_env 1. 系统安装 1.1 Vagrant Vagrant 是一款用于构建及配置虚拟开发环境的软件,基 ...

  5. 实验2:Open vSwitch虚拟交换机实践

    作业链接:实验2:Open vSwitch虚拟交换机实践 一.实验目的 能够对Open vSwitch进行基本操作: 能够通过命令行终端使用OVS命令操作Open vSwitch交换机,管理流表: 能 ...

  6. LuoguP1557 Kruscal的加法 题解

    题目Link 就是这道题,做了我整整一天! 看到题目,首先想到的就是:就这?就这一道大水题也能是绿?然后十分钟写完代码,提交-- 果不其然,绿题不是白绿的,看了一眼数据和讨论,又得写高精了-- 先附上 ...

  7. 洛谷P7078 [CSP-S2020] 贪吃蛇 题解

    比赛里能做出这题的人真的非常厉害,至少他的智商和蛇一样足够聪明. 首先有一个结论: 当前最强的蛇吃了最弱的蛇之后,如果没有变成最弱的蛇,他一定会选择吃! 证明: 假设当前最强的蛇叫石老板. 如果下一条 ...

  8. vue3 element-plus 配置json快速生成table列表组件,提升生产力近500%(已在公司使用,持续优化中)

    ️本文为博客园首发文章,未获授权禁止转载 大家好,我是aehyok,一个住在深圳城市的佛系码农‍♀️,如果你喜欢我的文章,可以通过点赞帮我聚集灵力️. 个人github仓库地址: https:gith ...

  9. MySQL8 根据某属性查询字段排名由自定义变量到rank()的变动

    在mysql8 之前的版本,因为没有rank()方法的存在,所以在对字段进行排名时,使用的是自定义自变量的方法,比如: select id,name,@rank=@rank+1 as ranks fr ...

  10. spring boot log4j2 最佳实践

    为什么选择 log4j2 Log4j2 使用了 LMAX Disruptor 库.在多线程场景中,异步 Logger 的吞吐量比 Log4j 1.x 和 Logback 高 18 倍,延迟低几个数量级 ...