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导出

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是一个简单的示例代码,用于动态导出Excel表头: ``` import java.io.FileOutputStream; import java.util.ArrayList; import java.util.List; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Workbook; public class ExcelExporter { public static void main(String[] args) { // 创建工作簿 Workbook workbook = new HSSFWorkbook(); // 创建工作表 Sheet sheet = workbook.createSheet("Sheet1"); // 创建表头 List<String> headers = new ArrayList<>(); headers.add("姓名"); headers.add("年龄"); headers.add("性别"); // 创建表头行 Row headerRow = sheet.createRow(0); // 循环添加表头单元格 for (int i = 0; i < headers.size(); i++) { Cell cell = headerRow.createCell(i); cell.setCellValue(headers.get(i)); } // 导出Excel文件 try (FileOutputStream outputStream = new FileOutputStream("example.xls")) { workbook.write(outputStream); } catch (Exception e) { e.printStackTrace(); } } } ``` 在该示例代码中,我们创建了一个名为“Sheet1”的工作表,并在其中动态添加了表头。我们首先创建了一个包含表头标题的字符串列表,然后在工作表的第一行中创建了一个表头行,并在其中循环添加每个表头单元格。 最后,我们将工作簿写入文件中,这将导出Excel文件。请注意,此示例使用了Apache POI库中的HSSFWorkbook类,该类用于创建Excel 97-2003工作簿(.xls文件)。如果您需要创建Excel 2007+工作簿(.xlsx文件),则应该使用XSSFWorkbook类。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值