【EasyExcel】在SpringBoot+VUE项目中引入EasyExcel实现对数据的导出(封装工具类)

在SpringBoot+VUE项目中引入EasyExcel实现导入导出

一、引入EasyExcel

通过maven引入,坐标如下:

        <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel-core</artifactId><version>3.3.2</version></dependency>

二、后端代码演示

下面以权限系统中的角色列表为案例,演示如何导出数据

实体类

import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.format.DateTimeFormat;
import com.alibaba.excel.annotation.write.style.*;
import com.alibaba.excel.enums.poi.HorizontalAlignmentEnum;
import com.alibaba.excel.enums.poi.VerticalAlignmentEnum;
import lombok.Data;import java.time.LocalDateTime;/*** 角色excel** @author ez4sterben* @date 2023/07/17*/
@ContentRowHeight(30)
@HeadRowHeight(20)
@ColumnWidth(25)
@ContentStyle(horizontalAlignment = HorizontalAlignmentEnum.CENTER, verticalAlignment =  VerticalAlignmentEnum.CENTER)
@Data
public class RoleExcelVO {/*** 角色名称*/@ExcelProperty(value = "角色名称")private String roleName;/*** 权限字符*/@ExcelProperty(value = "权限字符")private String permission;/*** 角色状态(0停用,1正常)*/@ExcelProperty(value = "角色状态")private String status;/*** 备注*/@ExcelProperty(value = "备注")private String remark;/*** 创建时间*/@DateTimeFormat("yyyy年MM月dd日HH时mm分ss秒")@ExcelProperty(value = "创建时间")private LocalDateTime createTime;}

工具类

通过@Component把工具类交给spring管理,在需要使用的地方使用@Resource注入即可

将泛型设置为 " ? ",来表示任意类型,可以通过这一个方法完成所有类的相似导出操作,如果要投入使用的话可以对arrayList和excelVO的类型是否相同进行判断,这里没有进行判断。

EasyExcel工具类

import com.alibaba.excel.EasyExcel;
import org.springframework.stereotype.Component;import java.util.ArrayList;/*** 简单excel工具类** @author ez4sterben* @date 2023/07/17*/
@Component
public class EasyExcelUtil {public static final String XLSX = ".xlsx";public String export(ArrayList<?> arrayList, Class<?> excelVO, String sheetName) {String fileName = System.currentTimeMillis() + XLSX;EasyExcel.write(fileName, excelVO).sheet(sheetName).doWrite(arrayList);return fileName;}
}

Excel输出工具类

如果你使用的是微服务架构建议考虑该工具类的位置不要和基本模块放在一起,而是和Controller放在同一个模块,下面的常量定义大可不必这么做,但个人认为代码规范还是很重要的。另外输出流的部分代码还可以改进,欢迎提出建议。

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;/*** 基础excel输出工具** @author ez4sterben* @date 2023/07/18*/
public class BaseExcelOutPutUtil {public static FileInputStream FILE_INPUT_STREAM;public static ServletOutputStream SERVLET_OUTPUT_STREAM;public static final String EXCEL = "application/vnd.ms-excel";public static final String CONTENT_DISPOSITION = "Content-Disposition";public static final String ATTACHMENT = "attachment;";public static final Integer SUCCESS_CODE = 200;public static void exportExcel(HttpServletResponse response, String filePath) throws IOException {try {FILE_INPUT_STREAM = new FileInputStream(filePath);SERVLET_OUTPUT_STREAM = response.getOutputStream();response.setContentType(EXCEL);response.setHeader(CONTENT_DISPOSITION, ATTACHMENT);response.setStatus(SUCCESS_CODE);int len = 0;byte[] bytes = new byte[1024];while ((len = FILE_INPUT_STREAM.read(bytes)) > 0) {SERVLET_OUTPUT_STREAM.write(bytes, 0, len);}SERVLET_OUTPUT_STREAM.flush();} catch (Exception e) {e.printStackTrace();}finally {// 关闭流SERVLET_OUTPUT_STREAM.close();FILE_INPUT_STREAM.close();new File(filePath).delete();}}}

业务层

	@Resourceprivate EasyExcelUtil easyExcelUtil;public static final String SHEET_NAME = "角色表";/*** 导出** @param ids id* @return {@link String}* @throws IOException ioexception*/@Overridepublic String export(List<Long> ids) throws IOException {// 前端传参ids,查询数据List<RolePO> rolePOS = this.listByIds(ids);ArrayList<RoleExcelVO> roleExcelVOS = new ArrayList<>();rolePOS.forEach(rolePO -> {// 通过hutool的BeanUtils把内容抄送给roleExcelVORoleExcelVO roleExcelVO = new RoleExcelVO();BeanUtils.copyProperties(rolePO,roleExcelVO);roleExcelVOS.add(roleExcelVO);});return easyExcelUtil.export(roleExcelVOS,RoleExcelVO.class,SHEET_NAME);}

由于我们刚才已经封装过工具类,那么这里不限于角色表的导出,还可以是其他的任何表,比如我要导出用户表,那么我只需要扒这部分代码写入用户的业务层就可以

Controller层

	/*** 导出** @return {@link Result}<{@link List}<{@link BusinessVO}>>*/@PostMapping("/export")public void export(@RequestBody List<Long> ids, HttpServletResponse response) {String filePath;try {filePath = roleService.export(response,ids);BaseExcelOutPutUtil.exportExcel(response,filePath);} catch (IOException e) {throw new RuntimeException(e);}}

到此为止后端的代码就展示完毕,其实还可以把导出统一封装在一起,但是目前对于我这个小项目完全是够用了,已经可以省去我很多内容了,读者有兴趣可以自行封装。下面会给各位展示前端代码。

前端VUE调用

	// 导出handleExport() {axios({method: "post",data: this.selectedRoles, // 这里写ids []url: this.urls.export, // 这里写你自己的后端urlresponseType: "blob"}).then((res) => {const blob = new Blob([res.data]);const a = document.createElement("a");const href = window.URL.createObjectURL(blob);a.href = href;a.download = '角色表权限.xlsx';document.body.appendChild(a);a.click();document.body.removeChild(a);window.URL.revokeObjectURL(href);}).catch((error) => {});},

下载通过blob实现,博主前端写的不规范,请自行更改。
data和url和你自己的后端对应上即可。

结果展示

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/4236.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PHP客服系统-PhpWorkmanChat客服系统修改管理员密码

作为一款流行的开源PHP客服系统&#xff0c;基于thinkphp和workman&#xff0c;跨平台轻量级客服系统源码 管理员表是v2_admin 账户是admin&#xff0c;如果密码忘记了怎么办。可以直接修改数据库表v2_admin &#xff0c;密码规则是md5(密码 加密盐) &#xff0c; 加密盐可以在…

开发工具篇第二十六讲:使用IDEA进行本地调试和远程调试

开发工具篇第二十六讲&#xff1a;使用IDEA进行本地调试和远程调试 Debug用来追踪代码的运行流程&#xff0c;通常在程序运行过程中出现异常&#xff0c;启用Debug模式可以分析定位异常发生的位置&#xff0c;以及在运行过程中参数的变化&#xff1b;并且在实际的排错过程中&am…

移动App安全检测的重要性,好用的App安全测试工具分享

一、移动App安全检测的重要性 在移动互联网时代&#xff0c;移动App成为人们生活不可或缺的一部分&#xff0c;人们使用App处理各种个人和敏感信息&#xff0c;因此保护用户的隐私和数据安全至关重要。而移动App安全检测是保障用户隐私和数据安全的重要环节。通过安全检测&…

【AT89C52单片机项目】数字密码锁设计

实验目的 使用单片机设计数字密码锁。 实验仪器 一套STC89C52RC开发板套件&#xff0c;包括STC89C52RC开发板&#xff0c;以及USB烧录线。 设计要求 1、有设置密码、开锁工作模式&#xff1b; 2、可以每次都设置密码&#xff0c;也可以设置一次密码多次使用。 实验原理 …

java电子病历系统源码

电子病历系统采取结构化与自由式录入的新模式&#xff0c;自由书写&#xff0c;轻松录入。化实现病人医疗记录&#xff08;包含有首页、病程记录、检查检验结果、医嘱、手术记录、护理记录等等。&#xff09;的保存、管理、传输和重现&#xff0c;取代手写纸张病历。不仅实现了…

存储服务的演化与MySQL分库分表

文章目录 一、存储服务的演化1.单体结构2.单表单库的数据量膨胀 -> 分库分表3.单个MySQL的读写压力过大 -> MySQL索引优化4.进一步缓解MySQL读写压力 -> 读写分离5.冷热数据分离 -> 使用Redis缓存 二、MySQL分库分表1.策略2.需要注意的问题 一、存储服务的演化 1.…

3D全景虚拟旅游在旅游行业中具备哪些应用价值?

在网络强国战略指引下&#xff0c;我们的网络基础设施建设步伐正在加快&#xff0c;与此同时&#xff0c;虚拟技术也在不断的更新迭代&#xff0c;虚拟旅游也逐渐崭露头角&#xff0c;将真实世界中的景点、文化以及历史场景等数字化&#xff0c;让游客身临其境地感受这些景点和…

HBase(一)HBase v2.2 高可用多节点搭建

最近刚刚完成了HBase相关的一个项目,作为项目的技术负责人,完成了大部分的项目部署,特性调研工作,以此系列文章作为上一阶段工作的总结. 前言 其实目前就大多数做应用的情况来讲,我们并不需要去自己搭建一套HBase的集群,现有的很多云厂商提供的服务已经极大的方便日常的应用使…

javaweb使用Thymeleaf 最凝练的CRUD项目-中

javaweb使用Thymeleaf 最凝练的CRUD项目-中 6、显示首页 ①目标 浏览器访问index.html&#xff0c;通过首页Servlet&#xff0c;渲染视图&#xff0c;显示首页。 ②思路 ③代码 [1]创建PortalServlet <servlet><servlet-name>PortalServlet</servlet-name…

怎么用Midjourney制作表情包

要使用Midjourney制作表情包&#xff0c;可以按照以下步骤进行操作&#xff1a; 1. 打开Midjourney的官方网站或下载Midjourney应用程序&#xff0c;并登录你的账户。 2. 在Midjourney中&#xff0c;选择创建新项目或表情包。 3. 在项目中&#xff0c;你可以选择使用预设的模…

类 和 对象

目录 1、面向对象编程 2、面向对象编程 2.1面向对象编程特征 3、类和对象的概念 3.1类的定义 3.11属性 3.12方法 3.13重载 3.14递归 3.13返回值return 3.2对象 3.2.1对象组合 4、jvm内主要三块内存空间 5、参数传值 1、面向对象编程 面向过程&#xff1a;关注的是步骤…

将大模型集成到语音识别系统中的例子

概述 本文旨在探索将大型语言模型&#xff08;LLMs&#xff09;集成到自动语音识别&#xff08;ASR&#xff09;系统中以提高转录准确性的潜力。 文章介绍了目前的ASR方法及其存在的问题&#xff0c;并对使用LLMs的上下文学习能力来改进ASR系统的性能进行了合理的动机论证。 本…

深度学习标量、向量、矩阵、张量之间的区别与联系

文章目录 前言1、张量**注意**&#xff1a; 2、**标量** (scalar)&#xff1a;0阶的张量&#xff0c;0个轴&#xff0c;一个单独的数(整数或实数)&#xff1b;3、**向量**(vector)&#xff1a;1阶的张量&#xff0c;也叫矢量&#xff0c;1个轴&#xff0c;一个数组&#xff1b;…

那些你必须知道的4个matlab小技巧(附最新安装包)

文末福利&#xff1a;MATLAB R2022b软件安装包 MATLAB 简介 01 一、MATLAB简介 数学类科技应用软件包括数值计算&#xff08;Number Crunching&#xff09;型软件和数学分析&#xff08;Math Analysis&#xff09;型软件 数值计算型软件 它们对大批数据具有较强的管理、计…

微信小程序下拉刷新获取数据和触底事件刷新实现

一、下拉刷新 1.json文件 说明&#xff1a;开启下拉刷新&#xff0c;然后设置窗口的背景色&#xff0c;方便观看。 "enablePullDownRefresh": true,"backgroundColor":"#FFC0CB" 2. js文件 说明&#xff1a;重新发起请求&#xff0c;并显示加…

【问题总结】Docker环境下备份和恢复postgresql数据库

目录 文章目录 以从备份恢复forest_resources库为例一、备份数据库二、需要还原的数据库准备1 删除掉远程的库。2 重新创建一个空的库。可以使用sql3 找到数据库存放的路径&#xff0c;并将备份文件上传到对应的路径下 三、 进入docker容器内部&#xff0c;执行数据库恢复附录…

Vue3统计数值(Statistic)

可自定义设置以下属性&#xff1a; 数值的标题&#xff08;title&#xff09;&#xff0c;类型&#xff1a;string | slot&#xff0c;默认&#xff1a;‘’数值的内容&#xff08;value&#xff09;&#xff0c;类型&#xff1a;string | number&#xff0c;默认&#xff1a;…

AlphaPose复现配置教程

AlphaPose复现配置教程 AlphaPose介绍 AlphaPose是一种准确的多人姿态估计器&#xff0c;这是第一个在COCO数据集上达到70 mAP (75 mAP)和在MPII数据集上达到80 mAP (82.1 mAP)的开源系统。为了匹配跨帧的同一人的姿态&#xff0c;我们还提供了一种高效的在线姿态跟踪器&…

scala学习手册

1. case class学习 样例类模式匹配 1.1 样例类&#xff08;case class&#xff09;适合用于不可变的数据。它是一种特殊的类&#xff0c;能够被优化以用于模式匹配。 case class MetaData(userId: String)case class Book(name: String) {def printBookName(): Unit {printl…

跨网络的通信过程、路由的作用以及默认网关

如下网络拓扑图&#xff0c;交换机0所在的网段为192.168.1.0/24&#xff0c;交换机1所在网段为192.168.2.0/24&#xff0c;且各自有2台主机&#xff1a; 假设PC0&#xff08;192.168.1.10/32&#xff09;要跟PC4&#xff08;192.168.2.11/32&#xff09;通信&#xff0c;如何实…