通用Excel导出工具类,定义某些列特定格式实践操作

目录

1、使用场景

2、代码实现

3、成果展现

4、总结

         5、参考文章


1、使用场景

        因为项目需要,在已有通用ExcelExportUtils导出工具类中已经封装,仅仅需要传入导出dataList,导出表格HeadCloums,以及读取数据之中的导出列名称 exportCols。如果此时返回给的的datalist之中,比如包含某个分类(分支机构的id),但是导出列表之中需要显示的分类(分支机构)名称,或者需要格式化某些字段的格式等。此时应该如何解决此问题呢?

         传统方式:在传递给ExcelExportUtils工具类之前的datalist进行转换,以为这在导出之前已经准备好需要显示的数据格式。

                       优点:无需改动已经封装好的ExcelExportUtils工具类,意味着数据在导出之前已经准备好。

                       缺点:此时如果数据量比较大,意味着在生成数据datalist的过程需要一个循环(1w次),来格式化数据形成最后导出结果数据;然后在导出的过程之中;写入到Excel

        的过程之中仍然需要循环(1w次)。这样就造成循环次数为2w次

        创新方式:为了减少循环次数,在导出过程之中只进行一次循环,这样就能够提供导出速度提升。其中的实现方案,调整ExcelExportUtils之中,加入如下三个参数,格式化的类型Class,格式化字段名 数组,格式化需要调用的方法数组。然后在ExcelExportUtils通过反射方式调用格式化类型对应的方法,这样就可以实现需要格式化某个字段的时候可以做到不用循环多次调用。

                   优点:可以减少循环次数,实现导出的时候一次循环就可以实现。如果是1w条记录,这样仅仅只需要循环1w次。

                   缺点: 需改动已经封装好的ExcelExportUtils工具类,同时引入的类的反射机制调用方法,如果方法某个实现Service里面,还需要需要通过Applicantion的 Context方式获得对应的Bean对象,然后去获得对应的格式化方法。                     

2、代码实现

//调整返回时长的格式
                    boolean hasFormatField=false;
                    String formatFieldValue="";
                    String filedValue=fieldObj.toString();
                    for(int m=0;m<formatColumns.length;m++){
                        if(filedName.equals(formatColumns[m])){
                            Class clz = Class.forName(className);
                            //反射调用格式化方法
                            Object classObj = clz.newInstance();
                            //获取方法
                            String methodName=methodNames[m];
                            Method method = classObj.getClass().getDeclaredMethod(methodName, Long.class);
                            //调用方法
                            formatFieldValue = (String) method.invoke(obj, fieldObj);
                            hasFormatField=true;
                        }
                    }
                    if(hasFormatField){
                        filedValue=formatFieldValue;
                    }
                    row.createCell(j).setCellValue(filedValue);

调用方法:        

   public Resp exportLiveVisitDetail(String nickName,String roomId,HttpServletResponse httpServletResponse) {
        PageInfo<LiveViewDetails> resultList=liveStatisticsClient.findViewDetailsByCondition(null,null,nickName,roomId);
        List<LiveViewDetails> dataList=resultList.getList();
        String[] columnNames=new String[]{"用户昵称","来源机构","观看时长","首次进入时间","最后退出时间"};
        String className="cc.wdcloud.hrss.live.utils.SecondsToFormatUtils";

        String[] formatColumns=new String[]{"viewTime"};
        String[] methodNames=new String[]{"secondsToFormat"};
        Resp returnResult=exportLiveDataToExcel(httpServletResponse,"观看详情导出",dataList,
                LiveViewDetails.class,className,methodNames,formatColumns,columnNames,
                "nickName","branchName","viewTime","firstTime","lastTime");
        return  returnResult;
    }

3、成果展现

       

4、总结

       经过此功能开发,发现如果要实现业务系统减少循环内容,可以使用反射机制调用对应的类的方式减少循环次数。同时如果要获得Spring容器之中的bean对象,需要通过在SpringBoot的启动类Apllication之中把引用上下文赋值给某个静态对象

    public static void main(String[] args) {
        SpringApplication application = new SpringApplication(Application.class);
        application.setAllowBeanDefinitionOverriding(true);
        //run方法的返回值ConfigurableApplicationContext继承了ApplicationContext上下文接口
        ConfigurableApplicationContext applicationContext =application.run(args);
        //将run方法的返回值赋值给工具类中的静态变量
        BeanUtil.applicationContext = applicationContext;
    }

5、参考文章

object is not an instance of declaring class

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值