使用反射实现动态修改@Excel的注解属性

2023-10-26

业务场景:我们使用poi实现数据导出时,通常是根据@Excel(name=“xxx”)来确定列名。通常情况下这个是不会发生变动的。但这里就说少数情况,在我们需要这里根据某些情况来进行改变的时候,我们就需要用到反射。

AirQualityRankingResp.java

@Data
public class AirQualityRankingResp {
    /** 站点名称 */
    @Excel(name = "站点名称")
    private String site;
    private String siteNumber;
    @Excel(name = "分析时间")
    private String dateTime;
    /** 污染因子 */
    private String pollutionFactor;
    @Excel(name = "AQI")
    private Double value;
    /** 排名 */
    @Excel(name = "排名")
    private Integer ranking;
}

正常使用@Excel导出数据如下

在这里插入图片描述

动态修改@Excel的属性,代码实现

  /**
     * 通过反射动态设置导出的Excel列名
     *
     * @param annotatedColumnName:实体类中被@Excel注解的字段名
     * @param annotationFieldName:实体类中被@Excel中注解的属性名
     * @param newAnnotationFieldValue:属性的新值
     */
    private void setExcelAnnotationValue(String annotatedColumnName, String annotationFieldName, String newAnnotationFieldValue){
        try{
            Class<AirQualityRankingResp> airQualityRankingRespClass = AirQualityRankingResp.class;
            Field classDeclaredField =  airQualityRankingRespClass.getDeclaredField(annotatedColumnName);
            Excel excel = classDeclaredField.getAnnotation(Excel.class);
            InvocationHandler excelInvocationHandler = Proxy.getInvocationHandler(excel);
            Field excelInvocationHandlerField = excelInvocationHandler.getClass().getDeclaredField("memberValues");
            excelInvocationHandlerField.setAccessible(true);
            Map map = (Map) excelInvocationHandlerField.get(excelInvocationHandler);
            map.put(annotationFieldName, newAnnotationFieldValue);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
  • 使用示例
   @RequestMapping(value = "/rankingAnalysisExportXls")
    public ModelAndView exportXls(HttpServletRequest request, AirRankingReq airRankingReq) {
        switch (airRankingReq.getName()){
            case "2":
                setExcelAnnotationValue("value","name","SO2");
                break;
            case "3":
                setExcelAnnotationValue("value","name","NO2");
                break;
            case "4":
                setExcelAnnotationValue("value","name","PM10");
                break;
            case "5":
                setExcelAnnotationValue("value","name","CO");
                break;
            case "6":
                setExcelAnnotationValue("value","name","O3");
                break;
            case "7":
                setExcelAnnotationValue("value","name","PM2.5");
                break;
        }
        List<AirQualityRankingResp> list = lrMonitorConcentrationService.rankingAnalysis(airRankingReq);
        // Step.3 AutoPoi 导出Excel
        LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
        ModelAndView mv = new ModelAndView(new JeecgEntityExcelView());
        mv.addObject(NormalExcelConstants.FILE_NAME, "lr_meteorological_data"); //此处设置的filename无效 ,前端会重更新设置一下
        mv.addObject(NormalExcelConstants.CLASS, AirQualityRankingResp.class);
        //update-begin--Author:liusq  Date:20210126 for:图片导出报错,ImageBasePath未设置--------------------
        ExportParams exportParams = new ExportParams("空气质量数据排名" + "报表", "导出人:" + sysUser.getRealname(), "空气质量排名");
        exportParams.setImageBasePath(upLoadPath);
        //update-end--Author:liusq  Date:20210126 for:图片导出报错,ImageBasePath未设置----------------------
        mv.addObject(NormalExcelConstants.PARAMS, exportParams);
        mv.addObject(NormalExcelConstants.DATA_LIST, list);
        return mv;
    }

在这里插入图片描述

我这里是根据前端给的name值来确定生成表格的列名为什么,你们根据实际业务场景来进行判断,这里知道怎么用即可

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用反射实现动态修改@Excel的注解属性 的相关文章

  • 如果我在 XML 布局中声明一个片段,如何将它传递为 Bundle?

    我有一个活动已替换为片段 该活动采用了一个 Intent 其中包含一些有关该活动应该显示哪些数据的额外信息 现在 我的 Activity 只是执行相同工作的 Fragment 的包装器 如果我使用标记在 XML 中声明该片段 如何将该捆绑包
  • Java:如何将ArrayList作为对象的实例变量?

    我正在开展一个班级项目 用 Java 构建一个小型 Connect4 游戏 我目前的想法是拥有一类 Columns 它具有一些整数 索引 最大长度 isFull 作为实例变量 以及一个 ArrayList 来接收上面的整数和每个玩家的表现
  • 正则表达式奇/偶数

    我有一个正则表达式问题 我不知道该怎么做 它必须匹配开头包含任意数量的 a 的所有字符串 如果 a 的数量为偶数 则匹配单个 0 如果 a 的数量为奇数 则匹配单个 1 如何跟踪偶数 奇数 Sample aaa1 aaaa0 a aa 1
  • 从 java servlet 运行长进程的最佳方法是什么?

    我想问从 java servlet 运行长进程的最佳方法是什么 我有一个网络应用程序 当客户端发出请求时 它会运行一个 servlet 该 servlet 应该从请求中获取一些参数 然后运行一个进程 这个过程可能需要很长时间 所以我需要单独
  • 如何在 Jboss 7.1 中配置简单身份验证

    我正在从事由以下人员编写的项目纯jsps 脚本 不使用任何框架 jboss版本 jboss as 7 1 0 Final 我现在正在尝试在其上添加简单的身份验证 因此 当用户尝试浏览 jsp 时 比如说 http localhost myC
  • 如何在angularjs中读取pdf流

    I got the following PDF stream from a server 如何在 AngularJS 中读取这个流 我尝试使用以下代码在新窗口中将其作为 PDF 文件打开 success function data wind
  • Servlet 包含 Tomcat 中的 HTTP 标头

    我有一个 servlet 它的请求调度程序包含另一个 servlet 包含的 servlet 设置了我想在包括小服务程序 因此 我在 include 方法中传入一个自定义 HTTPResponse 对象 该对象捕获来自 servlet 的所
  • Java 中修剪字符串的可能前缀

    I have String str 我想从中提取不包括可能的前缀的子字符串 abc 我想到的第一个解决方案是 if str startsWith abc return str substring abc length return str
  • 动态元素 ID 到 setId(int) - Android

    我看到了语法定义setId int and findViewByID int 但我们如何使用findViewById R id row1 我尝试使用这个 Object1 setId Integer parseInt repeat 它没有显示
  • antisamy 解析器强制关闭标签

    我使用 Antisamy 来验证 HTML 我的政策允许 iframe 例如 YouTube 视频 问题是 如果标签为空 像这样 清洗后会是这样的 但它应该有正常的结束标签 这会破坏之后页面上的所有内容 我已经将指令设置为使用大部分 HTM
  • 在 Android 谷歌地图中绘制 4K 折线

    我现在正在开发一个适用于 Android 设备的应用程序 主要功能是在地图上绘制折线以显示城市中每条街道的交通情况 不幸的是 当我绘制大约 3K 折线时 数量会根据屏幕尺寸和缩放级别而减少 我的地图变得非常慢 我没有提及绘制所有线条的时间
  • Java TreeMap时间复杂度-lowerKey

    时间复杂度是多少lowerKey Java实现中的操作TreeMap 我认为它是 log n 但我在文档中找不到它 更基本操作的复杂性已有详细记录 此实现提供了有保证的 log n 时间成本 containsKey 获取 放置和删除操作 顺
  • 如果表不存在,如何使用 Derby Db 创建表

    我是新来的apache derby我似乎无法工作 CREATE TABLE IF NOT EXISTS table1 可以实现MySql等等我得到了 Syntax error Encountered NOT at line 1 column
  • 如何从java程序中编译.java文件[重复]

    这个问题在这里已经有答案了 可能的重复 从 Java 内部编译外部 java 文件 https stackoverflow com questions 10889186 compiling external java files from
  • 如何在 Selenium 中定位具有特定文本的跨度? (使用Java)

    我在使用 java 查找 Selenium 中的 span 元素时遇到问题 HTML 看起来像 div class settings padding span Settings span div 我尝试了以下方法但没有成功 By xpath
  • int 到 long 赋值

    我一直在尝试这个 int 和 long 转换 我尝试分配一个int变量为along多变的 代码如下 public static void main String args int i 1024 long j i long k i i i i
  • 策略模式的现实示例

    我一直在读关于OCP原理 http en wikipedia org wiki Open closed principle以及如何使用策略模式来实现这一目标 我打算尝试向几个人解释这一点 但我能想到的唯一例子是根据 订单 的状态使用不同的验
  • GAE、JPA、XG 事务、实体组过多异常

    我知道 GAE 上的 XG 交易有 5 个实体组的限制 但我认为我在一项交易中仅使用 3 个组 商品 类别 商品类别 但仍然遇到此异常 引起原因 java lang IllegalArgumentException 在单个事务中对太多实体组
  • 如何使用 Java 11 和 JavaFX 11 运行 ControlsFX 示例应用程序

    ControlFX 网站 http fxexperience com controlsfx says 如果您想使用 ControlsFX 示例应用程序 只需 下载 ControlsFX 版本并在上运行以下命令 命令提示符 请务必将 替换为实
  • 从 Web 服务器异步调用应用程序

    我有一个用 Spring 制作的 在 Tomcat 上运行的 Web 应用程序 在同一台机器上有一个普通的 Java 应用程序 我想通过从Web服务器调用Java应用程序来执行它 但我想让应用程序不会使用服务器的资源 它涉及分类器的训练 因

随机推荐

  • 【进程间通信 之 通信的建立】

    目录 前言 进程间通信的目的 进程间通信的方式 管道 1 匿名管道 简单示例1 消息传输 五个特性 四种场景 简单示例2 进程控制 对管道的深入理解 2 命名管道 简单示例3 不相关进程间通信 system V 共享内存 简单示例4 通知事
  • loadrunner11目标场景

    目标场景 设置一个运行目标 通过Controller的自动加载功能进行自动化负载 如果测试的结果达到目标 说明系统的性能符合测试目标 否则就提示无法达到目标 编辑目标场景 目标类型有5种
  • python-图像边缘化处理

    本文由本人原创 仅作为自己的学习记录 主要利用Sobel 用作边缘检测 它是一离散性差分算子 用来运算图像亮度函数的灰度值 在图像的任何一点使用此算子 将会产生对应的灰度矢量或是其法矢量 Sobel边缘检测通常带有方向性 可以只检测竖直边缘
  • 【Linux0.11 源码历险记 2】《保护模式》

    继续跟着stup s 来看 lidt idt 48 load idt with 0 0 lgdt gdt 48 load gdt with whatever appropriate idt 48 word 0 idt limit 0 wor
  • 【Unity】 2D 游戏 库存模块实现

    库存模块主要参考了 youtube 上的视频 BMo 的 Flexible INVENTORY SYSTEM in Unity with Events and Scriptable Objects 和 Simple Inventory UI
  • DVWA SQL injection

    low 猜测表名 1 union select 1 group concat table name from information schema tables where table schema dvwa 如果出现问题 到MySQL里将
  • Java常用对象API——基本数据类型对象包装类

    基本数据类型对象包装类 为了方便操作基本数据类型值 将其封装成了对象 在对象中定义了属性和行为丰富了该数据的操作 用于描述该对象的类就称为基本数据类型对象包装类 byte Byte short Short int Integer long
  • EXCEL中数据透视表的(空白)如何不显示,并且不影响数据更新

    或许有碰到同样问题的 希望对大家有所帮助 1 数据透视表更新过来的数据显示 空白 不好看 开始将用户做了筛选 将空白的复选框去掉 可以达到效果 但是发现有数据更新时 新的数据不能被同步显示 除非手动去再次筛选用户将除空白外的数据勾选 2 点
  • Ble Mesh的Heatbeat(心跳)&地址&Model(模型)

    心跳 将节点配置为定期发送称为心跳消息的消息 Heartbeat 消息的目的 1 表示该节点仍然处于活动状态 2 允许根据传递 Heartbeat 消息所需的跳数确定其与接收者的距离 Heartbaeat的opcode 和Friend re
  • 主存储器的基本组成

    主存储器的基本组成 存储体 存储体也叫存储矩阵 是由一个个存储0或1的记忆单元 存储元 构成的 为了存取存储体中的信息 必须对存储单元进行编址 编址单位是指具有相同地址的那些存储元件构成的一个单位 常见有按字节编址 寻址访存 CPU首先把被
  • C#集合(泛型集合与非泛型)

    每日一句 自律 努力 方法 坚持 时间 优秀 集合特点 一种数据容器 一种数据结构 容纳多个数据 大小可变 空间不一定连续 命名空间 非泛型集合 System Collections 非泛型集合 System Collections Gen
  • 动态博客系统

    Halo 是我折腾过的众多博客系统里面 最好 最容易上手的动态博客系统之一 solo 也是 轻快 简洁 功能强大 正文 上周末正在募集团队一起写算法题 群里讨论需要一个网站来存放文章 恰巧我有一个已经备案但闲置的域名 马上开干 之前的网站是
  • 解惑React之this.setState({ [name]: value })

    react之this setState name value 疑问 学习React中文官方文档中的非空组件与受控组件中 遇到如下代码 class Reservation extends React Component constructor
  • 【面试系列】重排链表

    题意 原题链接 思路 快慢指针找到中点 或者先遍历得到长度 再遍历一半也可行 反转后半部分 归并两部分 代码 Definition for singly linked list struct ListNode int val ListNod
  • Excel 解析,通过Excel的地址和MultipartFile进行解析

    目录 两种方法都用到了read 和getValue 方法对数据进行解析 只是二者传入的Excel数据格式不一样 第一种方法 通过Excel地址进行解析Excel的数据 第二种方法 解析Excel的MultipartFile数据流获取数据 H
  • mmocr 训练字符检测模型

    目录 1 数据集 2 config文件配置 3 测试模型 1 数据集 这里以icdar2015字符检测为例https blog csdn net jizhidexiaoming article details 124149164 spm 1
  • Visio 2007/2010 左侧"形状"窗口管理

    Visio 2007 2010 左侧 形状 窗口管理 Visio 打开后 通常窗口左侧会有一个 形状 面板 我们可以方便地从中选择需要的形状 有时为了获得更大的版面空间或者不小心关闭了形状面板 怎么把它重新调出来 我们可以从 视图 中把它找
  • 使用docker快速搭建服务器环境

    思路 将nginx mysql tomcat等环境打包为一个个docker 然后使用docker compose管理 服务器内安装docker相关环境 然后直接运行docker compose配置 即可快速搭建完成服务器环境 之后可以将相关
  • Markdown / KaTex数学公式汇总

    目录 LaTex和KaTex 软件推荐 Mathpix 一 如何插入公式 二 上下标 三 常用运算符 四 高级运算符 五 常用数学符号 六 特殊符号 6 1 箭头 6 2 公式序号 七 括号使用 八 矩阵 九 集合运算 十 希腊字母 十一
  • 使用反射实现动态修改@Excel的注解属性

    业务场景 我们使用poi实现数据导出时 通常是根据 Excel name xxx 来确定列名 通常情况下这个是不会发生变动的 但这里就说少数情况 在我们需要这里根据某些情况来进行改变的时候 我们就需要用到反射 AirQualityRanki