java实现动态导出excel,根据自己封装的实体导出多列。

问题描述

项目中用户要求根据自己的自定义导出数据。
例如:本来有 工作日,节假日,双休日 3个列
本来是可以直接写个对应实体类,设置三个导出列就可以了。
在这里插入图片描述
导出如下图:
在这里插入图片描述

此时,用户这是要增加一个 国庆节或其他节日。变成下图这种格式
在这里插入图片描述
这个国庆节只有当月有,我们又不可能总是去更改我们的导出实体类,所以我们只能设置动态导出。

动态导出实体类

构造导出项目的实体 entityTitleList

        //************************************************************************//

        // 有多少值班项目可以根据实际从数据库中查出来
        List<String> dateList = new ArrayList<>();
        dateList.add("工作日");
        dateList.add("节假日" );
        dateList.add("双休日");
        dateList.add("国庆节");

        // 查出当前月都有那些值班项目,从而生成动态表头列
        List<ExcelExportEntity> entityTitleList = new ArrayList<>();
        // 建造动态导出的列
        //构造对象等同于@Excel
        ExcelExportEntity excelentity = new ExcelExportEntity("姓名", "name");
        excelentity.setNeedMerge(true);
        entityTitleList.add(excelentity);

        for(String str : dateList){

            excelentity = new ExcelExportEntity(str, str);
            List<ExcelExportEntity> temp = new ArrayList<>();
            temp.add(new ExcelExportEntity("值班日期", str + "Day"));
            temp.add(new ExcelExportEntity("总天数", str + "s"));
            //构造List
            excelentity.setList(temp);

            entityTitleList.add(excelentity);

        }

导出的数据格式的封装

      
            // 最终存放的数据
            List<Map<String, Object>> listData = new ArrayList<Map<String, Object>>();

            // 第一列姓名
            String userName = "李梦";
            Map<String, Object> stringObjectMapName = new HashMap<>();
            stringObjectMapName.put("name", userName);

            // 一个beanList [bean,bean]
            // 每个bean中有对应的日期和类型
            // 最终可根据自己的数据查询到该实际数据
            List<ZbpbDate> zbpbDates = new ArrayList<>();

            ZbpbDate zbpbDateNew = new ZbpbDate();
            zbpbDateNew.setZbpbType("工作日").setZbpbDate("2023-10-07 00:00:00.0");
            zbpbDates.add(zbpbDateNew);
            zbpbDateNew = new ZbpbDate();
            zbpbDateNew.setZbpbType("国庆节").setZbpbDate("2023-10-01 00:00:00.0");
            zbpbDates.add(zbpbDateNew);


            if(PlatformObjectUtils.isNotEmpty(zbpbDates)){
                SimpleDateFormat sdf = new SimpleDateFormat("M月d日");

                List<Map<String, Object>> listDateType = new ArrayList<>();
                Map<String, Object> stringObjectMap = new HashMap<>();

                for(ZbpbDate zbpbDate : zbpbDates){

                    SimpleDateFormat sdfDate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.s");
                    Date d = sdfDate.parse(zbpbDate.getZbpbDate());
                    String dateStr = sdf.format(d);
                    stringObjectMap.put(zbpbDate.getZbpbType() + "Day",  PlatformObjectUtils.isEmpty(stringObjectMap.get(zbpbDate.getZbpbType() + "Day"))? dateStr:dateStr+ ","+stringObjectMap.get(zbpbDate.getZbpbType() + "Day"));
                    stringObjectMap.put(zbpbDate.getZbpbType() + "s", PlatformObjectUtils.isEmpty(stringObjectMap.get(zbpbDate.getZbpbType() + "s"))?1: (Integer)stringObjectMap.get(zbpbDate.getZbpbType() + "s")+ 1);

                }

                // 将对应的数据放到对应的map中
                for(String s : dateList){
                    listDateType = new ArrayList<>();
                    Map<String, Object> stringObjectMapLocal = new HashMap<>();
                    stringObjectMapLocal.put(s+"Day",stringObjectMap.get(s+"Day")) ;
                    stringObjectMapLocal.put(s+"s",stringObjectMap.get(s+"s")) ;
                    listDateType.add(stringObjectMapLocal);
                    stringObjectMapName.put(s, listDateType);
                }
            }
            listData.add(stringObjectMapName);
            String tilte = "XX月值班统计表";
            ExportParams exportParams = new ExportParams(tilte, "值班排班数据");
            // 将entityTitleList放入导出的类型中
            Workbook workbook = ExcelExportUtil.exportExcel(exportParams, entityTitleList, listData);
            workbook.createCellStyle().setLocked(true);

            FileOutputStream fos = new FileOutputStream("E:/XX单位值班排班数据.xls");
            workbook.write(fos);
            fos.close();

    }

导出图如下:
在这里插入图片描述
以上就是实现了动态的导出。

总结

1.以上功能的实现需要有个表存储动态的列。故此可以不用频繁改变代码从而实现动态导出列的增加。
2.以上功能实现是基于easypoi的map导出

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值