EasyExcel导出报表(多table包含合并策略)

该博客介绍了如何使用EasyExcel库在Java中导出包含多个表格的Excel报表,其中上部分表格应用了合并策略。数据来源于多集群环境的资源监控,包括CPU、内存、存储PVC等信息,并从Prometheus和平台获取。核心代码展示了如何处理数据,设置合并策略以及导出操作,同时提供了字体和表头样式的配置。
摘要由CSDN通过智能技术生成

EasyExcel导出报表(多table包含合并策略)

导入Pom

  <!-- easyexcel -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>easyexcel</artifactId>
            <version>2.2.8</version>
        </dependency>

数据

多集群环境下的,资源类型:deploy ,statefulset,dameonset的控制的Pod对应的CPU,内存,存储PVC,以及所属的租户信息等,这些数据是可以从prometheus中进行获取的,是时序向量数据,其中七牛云存储的数据无法从prometheus获取,所以需要从平台中获取数据。

核心代码

使用到的地方

List<ReportForm> reportForms = monitorCenterService.getReportForm(subNamespacesList, timeMap,rangeMap,startTime,endTime);
        if (Objects.nonNull(reportForms) && reportForms.size() > 0) {
   

            List<ReportFormEasyExcelDto> multiPvcDtoList = new ArrayList<>();
            List<ReportFormEasyExcelDto> nonOrSinglePvcDtoList = new ArrayList<>();
            List<WriteHandler> mergeMultiPvcHandlerList = getWriteHandlerList(reportForms, multiPvcDtoList, nonOrSinglePvcDtoList);
            EasyExcelUtil.mergeCall(multiPvcDtoList, nonOrSinglePvcDtoList, getEasyExcelHeadList(), mergeMultiPvcHandlerList, httpResponse);

            return ActionReturnUtil.returnSuccess();
        } else if (Objects.nonNull(reportForms) && reportForms.size() == 0) {
   
            return ActionReturnUtil.returnSuccessWithData("没有报表数据可以导出");
        } else {
   
            logger.error("获取的报表数据出现异常");
            return ActionReturnUtil.returnErrorWithData("获取的报表数据出现异常");
        }

private List<WriteHandler> getWriteHandlerList(List<ReportForm> reportForms,List<ReportFormEasyExcelDto> multiPvcDtoList, List<ReportFormEasyExcelDto> nonOrSinglePvcDtoList) {
   
        List<WriteHandler> writeHandlerList = new ArrayList<>();
        int beginRow = 1,endRow = 0;
        for (ReportForm reportForm : reportForms) {
   
            if (!CollectionUtils.isEmpty(reportForm.getStorageUsageMap()) && !CollectionUtils.isEmpty(reportForm.getStorageRequestMap())) {
   
                int size = reportForm.getStorageRequestMap().size();
                if (size > 1) {
   
                    endRow += size;
                    for (int i = 0; i < reportFormAttrsLength - 4; i++) {
   
                        OnceAbsoluteMergeStrategy onceAbsoluteMergeStrategy = new OnceAbsoluteMergeStrategy(beginRow, endRow, i, i);
                        writeHandlerList.add(onceAbsoluteMergeStrategy);
                    }
                    beginRow = beginRow + size 
EasyExcel 中动态合并单元格可以使用 MergeStrategy 类来实现。下面是一个示例代码: ```java // 创建一个合并策略 MergeStrategy mergeStrategy = new MergeStrategy() { @Override public MergeCellStrategy mergeCellStrategy(List<CellRangeAddress> list, Cell cell, Sheet sheet) { // 判断需要合并的单元格是否符合条件(例如合并相同的内容) if (list.size() > 1) { return new MergeCellStrategy(list.get(0), list.get(list.size() - 1)); } return null; } }; // 创建导出数据的列表 List<List<Object>> dataList = new ArrayList<>(); dataList.add(Arrays.asList("姓名", "年龄", "性别")); dataList.add(Arrays.asList("张三", 20, "男")); dataList.add(Arrays.asList("李四", 22, "女")); dataList.add(Arrays.asList("王五", 25, "男")); // 创建一个导出工作簿 Workbook workbook = new WorkbookBuilder().build(dataList); // 获取导出的第一个工作表 Sheet sheet = workbook.getSheet(0); // 将第一行合并为一个单元格 List<CellRangeAddress> mergeRegions = new ArrayList<>(); mergeRegions.add(new CellRangeAddress(0, 0, 0, 2)); mergeStrategy.mergeCellStrategy(mergeRegions, null, sheet); // 将数据写入工作表 ExcelWriter excelWriter = EasyExcel.write("demo.xlsx").build(); excelWriter.write(dataList, sheet); // 关闭 ExcelWriter 和 Workbook excelWriter.finish(); workbook.close(); ``` 在这个示例代码中,我们首先创建了一个 MergeStrategy 类,用于控制需要合并的单元格。在 mergeCellStrategy 方法中,我们可以根据自己的需求决定哪些单元格需要合并。例如,在这个示例中,我们将第一行的三个单元格合并为一个单元格。 然后,我们创建了一个导出数据的列表,并使用 WorkbookBuilder 类创建了一个工作簿。接着,我们获取了工作簿中的第一个工作表,并使用 mergeStrategy 对象将需要合并的单元格进行了合并。最后,我们使用 EasyExcel 的 ExcelWriter 类将数据写入工作表,并保存到文件中。 需要注意的是,当我们使用 mergeStrategy 对象合并单元格时,需要将需要合并的单元格信息以 List<CellRangeAddress> 的形式传递给 mergeCellStrategy 方法。在这个示例中,我们只合并了第一行的单元格,因此 List<CellRangeAddress> 中只有一个元素。如果需要合并多个单元格,可以将多个 CellRangeAddress 对象添加到 List<CellRangeAddress> 中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值