【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.hqwc.cn/news/29413.html

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

相关文章

【Win10系统下载Python3】

Python3官网&#xff1a;https://www.python.org/downloads/windows/ 注

微服务Day3——Nacos配置管理\Feign远程调用\Gateway网关

一、Nacos配置管理 1、统一配置管理 当微服务部署的实例越来越多&#xff0c;达到数十、数百时&#xff0c;逐个修改微服务配置就会让人抓狂&#xff0c;而且很容易出错。我们需要一种统一配置管理方案&#xff0c;可以集中管理所有实例的配置。 Nacos一方面可以将配置集中管理…

性能测试之性能问题分析

开始性能测试前需要了解的内容&#xff1a; 1、项目具体需求。 2、指标&#xff1a;响应时间在多少以内&#xff0c;并发数多少&#xff0c;tps多少&#xff0c;总tps多少&#xff0c;稳定性交易总量多少&#xff0c;事务成功率&#xff0c;交易波动范围&#xff0c;稳定运行时…

ROS:pluginlib

目录 一、前言二、概念三、作用四实际用例4.1需求4.2流程4.3准备4.4创建基类4.5创建插件4.6注册插件4.7构建插件库4.8使插件可用于ROS工具链4.8.1配置xml4.8.2导出插件 4.9使用插件4.10执行 一、前言 pluginlib直译是插件库&#xff0c;所谓插件字面意思就是可插拔的组件&…

极值理论 EVT、POT超阈值、GARCH 模型分析股票指数VaR、条件CVaR:多元化投资组合预测风险测度分析...

全文链接&#xff1a;http://tecdat.cn/?p24182 本文用 R 编程语言极值理论 (EVT) 以确定 10 只股票指数的风险价值&#xff08;和条件 VaR&#xff09;&#xff08;点击文末“阅读原文”获取完整代码数据&#xff09;。 使用 Anderson-Darling 检验对 10 只股票的组合数据进行…

和chatgpt学架构02-环境搭建

目录 1 安装vs code2 vs code功能介绍3 安装nodejs4 安装vue5 在vs code打开工程总结 我们在上一篇 技术选型 里咨询了chatgpt前后端的框架选择和数据库的选择。有了框架之后就需要选择合适的开发工具了&#xff0c;继续咨询一下chatgpt 我现在选型&#xff0c;前端使用vue&am…

JavaScript 判断 null 、undefined、NaN的可靠方法、验证以及注意事项

索引 判断方法判断undefined判断null判断NaN 注意事项undefined和null和比较NaN和自己比较 有些时候需要判断类型是否为null、undefined或者NaN&#xff0c;常用的方法有以下&#xff1a; 判断方法 判断undefined 使用typeof typeof xxx undedfined注意&#xff1a;typeof…

【后端面经-Java】JVM垃圾回收机制

【后端面经-Java】JVM垃圾回收机制 1. Where&#xff1a;回收哪里的东西&#xff1f;——JVM内存分配2. Which&#xff1a;内存对象中谁会被回收&#xff1f;——GC分代思想2.1 年轻代/老年代/永久代2.2 内存细分 3. When&#xff1a;什么时候回收垃圾&#xff1f;——GC触发条…

若依cloud(RuoYi-Cloud)新增业务模块和功能模块增删改查演示

前言 看了几篇文章感觉都不太满意&#xff0c;索性自己来写一篇。 一、后端 后端新建业务模块流程大致如下&#xff1a; 1、后端新建一个&#xff08;在ruoyi-module模块下&#xff09;业务模块&#xff0c;仿照已有的模块将此模块配置好&#xff0c;例如仿照系统模块&…

CodeGeex论文阅读

《CodeGeeX: A Pre-Trained Model for Code Generation with Multilingual Evaluations on HumanEval-X》 论文地址&#xff1a;https://arxiv.org/pdf/2303.17568.pdf 代码地址&#xff1a;https://github.com/THUDM/CodeGe 一、简介 CodeGeeX&#xff0c;是一个具有130亿…

银河麒麟高级服务器操作系统V10安装mysql数据库

一、安装前 1.检查是否已经安装mysql rpm -qa | grep mysql2.将查询出的包卸载掉 rpm -e --nodeps 文件名3.将/usr/lib64/libLLVM-7.so删除 rm -rf /usr/lib64/libLLVM-7.so4.检查删除结果 rpm -qa | grep mysql5.搜索残余文件 whereis mysql6.删除残余文件 rm -rf /usr/b…

【多线程】(六)Java并发编程深度解析:常见锁策略、CAS、synchronized原理、线程安全集合类和死锁详解

文章目录 一、常见锁策略1.1 乐观锁和悲观锁1.2 读写锁1.3 重量级锁和轻量级锁1.4 自旋锁1.5 公平锁和非公平锁1.6 可重入锁和不可重入锁 二、CAS2.1 什么是CAS2.2 CAS的实现原理2.3 CAS应用2.4 ABA问题 三、synchronized原理3.1 synchronized锁的特点3.2 加锁工作过程3.3 锁消…