Java导出excel合并行功能

导出的excel需要上下行相同的数据进行行合并的功能。如图显示

这里我使用的是项目框架自带的导出模板代码,是在这套模板基础之上做的修改。

java 复制代码
// 我主要演示的就是mergeRows方法的操作,dataList是导出数据的集合。
workbook = ExcelTools.expData(workbook, templateSheet);
// 合并行操作
cseQuotaManageCheckService.mergeRows(workbook, dataList);

这是mergeRows方法。

java 复制代码
// 合并行操作
    public void mergeRows(Workbook workbook, List<?> dataList) {
        if (dataList.isEmpty()) {
            return;
        }

        Sheet sheet = workbook.getSheetAt(0);
        int startRow = 2;  // 数据从第 2 行开始
        int deptNameCol = 1;  // 从第几列开始
        int benchmarkScoreCol = 2;
        int finalScoreCol = 3;
        int daunScoreCol = 4;

        int i = 0;
        while (i < dataList.size()) {
            int mergeStart = i;
            CseQuotaManageCheckVO current = (CseQuotaManageCheckVO) dataList.get(i);

            // 查找连续相同的数据行
            while (i < dataList.size() - 1) {
                CseQuotaManageCheckVO next = (CseQuotaManageCheckVO) dataList.get(i + 1);
                if (current.getDeptName().equals(next.getDeptName()) &&
                        current.getBenchmarkScore().equals(next.getBenchmarkScore()) &&
                        current.getFinalScore().equals(next.getFinalScore()) &&
                        current.getDaunScore().equals(next.getDaunScore())) {
                    i++;
                } else {
                    break;
                }
            }

            // 如果找到多个连续相同的行,则合并它们
            if (mergeStart != i) {
                mergeCellsIfNotOverlap(sheet, startRow + mergeStart, startRow + i, deptNameCol, deptNameCol);
                mergeCellsIfNotOverlap(sheet, startRow + mergeStart, startRow + i, benchmarkScoreCol, benchmarkScoreCol);
                mergeCellsIfNotOverlap(sheet, startRow + mergeStart, startRow + i, finalScoreCol, finalScoreCol);
                mergeCellsIfNotOverlap(sheet, startRow + mergeStart, startRow + i, daunScoreCol, daunScoreCol);
            }

            // 继续下一个不相同的数据行
            i++;
        }
    }

    // 解决要合并的区域已经存在合并单元格
    private void mergeCellsIfNotOverlap(Sheet sheet, int firstRow, int lastRow, int firstCol, int lastCol) {
        CellRangeAddress newRegion = new CellRangeAddress(firstRow, lastRow, firstCol, lastCol);
        for (int i = 0; i < sheet.getNumMergedRegions(); i++) {
            CellRangeAddress existingRegion = sheet.getMergedRegion(i);
            if (isOverlapping(existingRegion, newRegion)) {
                return;  // 跳过合并,因为它与现有合并区域重叠
            }
        }
        sheet.addMergedRegion(newRegion);

        // 居中操作
        applyCellStyle(sheet, newRegion);
    }

    // 对合并后的行数据内容进行居中显示操作
    private void applyCellStyle(Sheet sheet, CellRangeAddress region) {
        Workbook workbook = sheet.getWorkbook();
        CellStyle centeredStyle = workbook.createCellStyle();
        centeredStyle.setAlignment(HorizontalAlignment.CENTER);
        centeredStyle.setVerticalAlignment(VerticalAlignment.CENTER);

        for (int row = region.getFirstRow(); row <= region.getLastRow(); row++) {
            for (int col = region.getFirstColumn(); col <= region.getLastColumn(); col++) {
                Row sheetRow = sheet.getRow(row);
                if (sheetRow == null) {
                    sheetRow = sheet.createRow(row);
                }
                Cell cell = sheetRow.getCell(col);
                if (cell == null) {
                    cell = sheetRow.createCell(col);
                }
                cell.setCellStyle(centeredStyle);
            }
        }
    }

    private boolean isOverlapping(CellRangeAddress region1, CellRangeAddress region2) {
        return !(region1.getLastRow() < region2.getFirstRow() ||
                region1.getFirstRow() > region2.getLastRow() ||
                region1.getLastColumn() < region2.getFirstColumn() ||
                region1.getFirstColumn() > region2.getLastColumn());
    }
相关推荐
benbenAItalk5 小时前
数字人口播视频的批量生产实践:素材规范、任务编排与质量验收
java·前端·音视频
sunshine22 girl5 小时前
Java学习二 基本语法2, 算术运算符
java·学习
2601_966949655 小时前
为什么量化策略需要大量历史股票数据?从回测可信度理解数据规模
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash
niucloud-admin5 小时前
JAVA V6 多商户商城 开发文档——插件目录结构
java·开发语言
2601_962885725 小时前
如何用 Python 扫描 A 股跳空缺口并统计缺口回补概率?
java·前端·python
滕州市燕猫虎计算机科技工作室个体工商户5 小时前
Java锁
java·开发语言
多加点辣也没关系6 小时前
JavaScript|第31章:表单与控件
开发语言·javascript·ecmascript
菜鸟~noob2336 小时前
【电子战】 第09篇:阵列信号处理——波束形成、MVDR、MUSIC【含matlab代码】
开发语言·matlab·信号处理
ocean21036 小时前
2025-2026年Python面试高频知识点洞察
开发语言·python·面试·python八股文
零依赖极客7 小时前
Day 6·1 ARMv8.2 dotprod——vdotq_s32 一条指令做 4 个点积
c语言·开发语言·人工智能·矩阵·arm·vllm