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

41 篇文章 0 订阅

业务场景:我们使用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值来确定生成表格的列名为什么,你们根据实际业务场景来进行判断,这里知道怎么用即可

  • 9
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

子非我鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值