Spring AOP 实现 Excel 导出统一处理

你好,我是柳岸花开。在实际开发中,经常会遇到需要导出 Excel 数据的需求。为了避免代码重复,我们可以使用 Spring AOP(面向切面编程)来实现 Excel 导出的统一处理。本文将介绍如何使用 Spring AOP 在项目中统一处理 Excel 导出的操作,减少重复代码的编写。

  1. 引言

Excel 导出是许多项目中常见的功能,但每次都编写导出逻辑会导致代码重复,降低开发效率。通过 Spring AOP,我们可以将导出逻辑进行统一处理,提高代码的可维护性和可重用性。

  1. ExcelResponseAspect 类

下面是一个使用 Spring AOP 实现的 Excel 导出统一处理类 ExcelResponseAspect。该类使用了注解 @ExcelResponse 来标记需要进行 Excel 导出的方法,然后根据注解的配置来处理导出逻辑。 // ...(省略导入包和类定义)

​ @Aspect @Component @Slf4j public class ExcelResponseAspect { ​ @Pointcut("@annotation(com.uc.common.excel.annotations.ExcelResponse)") public void arroundHandlerPoinCut() { } ​ @Around(value = "arroundHandlerPoinCut()") public Object doAround(ProceedingJoinPoint pjp) throws Throwable { MethodSignature signature = (MethodSignature) pjp.getSignature(); Method method = signature.getMethod(); ExcelResponse excelResponse = method.getAnnotation(ExcelResponse.class); ​ // 获取方法参数 Object[] args = pjp.getArgs(); Object target = args[0]; ​ // 根据注解配置判断是否导出 Excel if (StringUtils.isNotBlank(excelResponse.determineExportName())) { Object exportExcel = BeanUtil.getFieldValue(target, excelResponse.determineExportName()); if (!Boolean.valueOf(String.valueOf(exportExcel))) { return pjp.proceed(); } } ​ // 如果有分页参数,设置记录数为最大 if (StringUtils.isNotBlank(excelResponse.pageSizeName())) { BeanUtil.setFieldValue(target, excelResponse.pageSizeName(), Integer.MAX_VALUE); } ​ Object result = null; try { result = pjp.proceed(); String fileName = URLEncoder.encode(excelResponse.fileName(), "UTF-8").replaceAll("\+", "%20"); HttpServletResponse response = genResponse(fileName); ​ MethodReturnValueHandler methodReturnValueHandler = excelResponse.methodReturnValueHandler().newInstance(); EasyExcel.write(response.getOutputStream(), methodReturnValueHandler.getHeaderClass()) .autoCloseStream(Boolean.FALSE) .sheet(excelResponse.sheetName()) .doWrite(methodReturnValueHandler.exactList(result)); ​ response.getOutputStream().flush(); } catch (Throwable e) { log.error("请求异常, method: {} ", method.getName(), e); } return null; } ​ // ...(省略方法) ​ public interface MethodReturnValueHandler { Class getHeaderClass(); Collection exactList(Object result); } } ​ 3. 使用 ExcelResponse 注解

要使用 ExcelResponse 注解来标记需要导出 Excel 的方法,需要在方法上添加 @ExcelResponse 注解,并配置相关属性。下面是一个示例: @ExcelResponse(fileName = "user_data", sheetName = "User Data") public List exportUserData(UserQuery userQuery) { List userList = userService.getUserList(userQuery); return userList; } ​ 在这个示例中,@ExcelResponse 注解标记了一个导出用户数据的方法,指定了 Excel 文件名为 "user_data",工作表名称为 "User Data"。

  1. 总结 通过使用 Spring AOP 和 ExcelResponseAspect 类,我们可以实现 Excel 导出的统一处理,将导出逻辑与业务逻辑分离,提高了代码的可维护性和可重用性。这对于需要频繁进行 Excel 导出的项目来说,是一个非常有用的技术。希望本文能够帮助你更好地理解 Spring AOP 和 Excel 导出的结合应用。

👇关注我,下期了解👇 ​ SpringMVC源码 ​ ​ alt ​ ​ 回复 222,获取Java面试题合集 ​ 关于我 ​ 一枚爱折腾的Java程序猿,专注Spring干货。把路上的问题记录下来,帮助那些和我一样的人。 ​ 好奇心强,喜欢并深入研究古天文。 ​ 崇尚 个人系统创建,做一些时间越长越有价值的事情。思考 把时间留下来 又 每刻都是新的。

本文由 mdnice 多平台发布

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

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

相关文章

【学习笔记】无人机(UAV)在3GPP系统中的增强支持(十三)-更换无人机控制器

引言 本文是3GPP TR 22.829 V17.1.0技术报告,专注于无人机(UAV)在3GPP系统中的增强支持。文章提出了多个无人机应用场景,分析了相应的能力要求,并建议了新的服务级别要求和关键性能指标(KPIs)。…

枚举的高阶用法之枚举里写方法以及注入spring的bean

1、前言 一般我们使用枚举都是用来定义一些常量。比如我们需要一个表示订单类(pc订单、手机订单)的常量,那我们就可以使用枚举来实现,如下: AllArgsConstructor public enum OrderTypeEnum{PC("PC", "电脑端"),PHONE("PHONE", "手机端&quo…

[计网初识2]web的3个核心标准html,url,http

学习内容 HTML,URL,HTTP的构成 1.规范web的3个核心标准? HTML(Hyper Text Markup Language),规范网页内容和版面布局的表示标准。URL(Uniform Resource Locator),规范网页识别符格式和含义的表示标准。HTTP(HyperText Transfer Protocl),规范游览器如…

JIRA的高级搜索JIRA Query Language(JQL)详解

JIRA的高级搜索功能非常强大,允许用户通过JIRA Query Language(JQL)来构建复杂的查询。以下是一些常用的高级搜索用法和示例: 1. 基本语法 JQL的基本语法包括字段、运算符和值的组合。例如: field operator value2.…

<数据集>UA-DETRAC车辆识别数据集<目标检测>

数据集格式:VOCYOLO格式 图片数量:20500张 标注数量(xml文件个数):20500 标注数量(txt文件个数):20500 标注类别数:4 标注类别名称:[car, van, others, bus] 序号类别名称图片数框数1car201871259342…

钡铼ARMxy控制器在智能网关中的应用

随着IoT物联网技术的飞速发展,智能网关作为连接感知层与网络层的枢纽,可以实现感知网络和通信网络以及不同类型感知网络之间的协议转换。钡铼技术的ARMxy系列控制器凭借其高性能、低功耗和高度灵活性的特点,在智能网关中发挥了关键作用&#…

数据结构回顾(Java)

1.数组 线性表 定义的方式 int[] anew int[10] 为什么查询快? 1.可以借助O(1)时间复杂度访问某一元素, 2.地址连续,逻辑连续 3.数组长度一旦确定就不可以被修改 当需要扩容的时候需要将老数组的内容复制过来 在Java中数组是一个对象 Ar…

bug定位策略

前提--用户环境层面 hosts异常:hosts文件主要是加快某个域名或者网站的解析速度,从而达到快速访问的作用,也可以屏蔽网站。hosts异常可能会导致部分网页无法访问,能够加载,但是网页无法正常显示;测试环境脏…

记录些Redis题集(2)

Redis 的多路IO复用 多路I/O复用是一种同时监听多个文件描述符(如Socket)的状态变化,并能在某个文件描述符就绪时执行相应操作的技术。在Redis中,多路I/O复用技术主要用于处理客户端的连接请求和读写操作,以实现高并发…

Python_使用pyecharts构建折线图

Pyecharts简介 Pyecharts是一款将python与echarts结合的强大的数据可视化工具,使用 pyecharts 可以生成独立的网页,也可以在 flask , Django 中集成使用。echarts :百度开源的一个数据可视化 JS 库,主要用于数据可视化。pyechart…

嵌入式linux相机 框图

摄像头读取数据显示到LCD流程 重点:摄像头数据(yuyv,mjpeg,rgb)(640,320)与LCD显示数据(RGB)(480,240)不同;需要转换&…

ReactRouter v6升级的步骤

React Router v6 引入了一个 Routes 组件&#xff0c;它有点像 Switch &#xff0c;但功能要强大得多。与 Switch 相比&#xff0c; Routes 的主要优势在于&#xff1a; <Routes> 中的所有 <Route> 和 <Link> 都是相对的。这导致在 <Route path> 和 &…

项目文章|EMBO J(IF=9.4):16S+代谢组解析肠道菌群代谢物改善高脂饮食诱导的胰岛素抵抗机制

肠道菌群及其代谢产物与肥胖相关疾病&#xff08;如2型糖尿病&#xff09;密切相关&#xff0c;但其因果关系和潜在机制尚不清楚。研究表明&#xff0c;肥胖与肠道微生物的丰度和多样性变化有关&#xff0c;例如&#xff0c;高脂饮食&#xff08;HFD&#xff09;诱导的肥胖会增…

AIGC率超标?掌握论文去AI痕迹的高效策略

随着 AI 技术迅猛发展&#xff0c;各种AI辅助论文写作的工具层出不穷&#xff01; 为了防止有人利用AI工具进行论文代写&#xff0c;在最新的学位法中已经明确规定“已经获得学位者&#xff0c;在获得该学位过程中如有人工智能代写等学术不端行为&#xff0c;经学位评定委员会…

ESP32CAM物联网教学11

ESP32CAM物联网教学11 霍霍webserver 在第八课的时候&#xff0c;小智把乐鑫公司提供的官方示例程序CameraWebServer改成了明码&#xff0c;这样说明这个官方程序也是可以更改的嘛。这个官方程序有四个文件&#xff0c;一共3500行代码&#xff0c;看着都头晕&#xff0c;小智决…

S7-200smart与C#通信

https://www.cnblogs.com/heizao/p/15797382.html C#与PLC通信开发之西门子s7-200 smart_c# s7-200smart通讯库-CSDN博客https://blog.csdn.net/weixin_44455060/article/details/109713121 C#上位机读写西门子S7-200SMART PLC变量 教程_哔哩哔哩_bilibilihttps://www.bilibili…

清朝嘉庆二十五年(1820年)地图数据

我们在《中国历史行政区划连续变化数据》一文中&#xff0c;为你分享了中国历史行政区划连续变化地图数据。 现在再为你分享清朝嘉庆二十五年&#xff08;1820年&#xff09;的地图数据&#xff0c;该数据对于研究历史的朋友应该比较有用&#xff0c;请在文末查看领取方式。 …

【Rust练习】2.数值类型

练习题来自https://practice-zh.course.rs/basic-types/numbers.html 1 // 移除某个部分让代码工作 fn main() {let x: i32 5;let mut y: u32 5;y x;let z 10; // 这里 z 的类型是? }y的类型不对&#xff0c;另外&#xff0c;数字的默认类型是i32 fn main() {let x: i…

Jupyter Lab 使用

Jupyter Lab 使用详解 Jupyter Lab 是一个基于 Web 的交互式开发环境&#xff0c;提供了比 Jupyter Notebook 更加灵活和强大的用户界面和功能。以下是使用 Jupyter Lab 的详细指南&#xff0c;包括安装、基本使用、设置根目录和扩展功能等内容。 一、Jupyter Lab 安装与启动…

HTTP背后的故事:理解现代网络如何工作的关键(一)

一.HTTP是什么 概念 &#xff1a; 1.HTTP ( 全称为 " 超文本传输协议 ") 是一种应用非常广泛的 应用层协议。 2.HTTP 诞生与1991年. 目前已经发展为最主流使用的一种应用层协议. 3.HTTP 往往是基于传输层的 TCP 协议实现的 . (HTTP1.0, HTTP1.1, HTTP2.0 均为 T…