关于EasyExcel 合并单元格方法该如何实现

在做一个业务的导出,目前遇到一个需求,如下图:
在这里插入图片描述

import com.alibaba.excel.metadata.CellData;
import com.alibaba.excel.metadata.Head;
import com.alibaba.excel.write.handler.CellWriteHandler;
import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
import com.alibaba.excel.write.metadata.holder.WriteTableHolder;
import lombok.Data;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.CellRangeAddress;

import java.util.List;

/**
 * 单元格合并策略类
 *
 */
@Data
public class ExcelFillCellMergeStrategy implements CellWriteHandler {
   
    /**
     * 哪几列的字段需要合并
     */
    private int[] mergeColumnIndex;
    /**
     * 从第几行开始合并
     */
    private int mergeRowIndex;

    public ExcelFillCellMergeStrategy() {
   
    }

    public ExcelFillCellMergeStrategy(int mergeRowIndex, int[] mergeColumnIndex) {
   
        this.mergeRowIndex = mergeRowIndex;
        this.mergeColumnIndex = mergeColumnIndex;
    }

    @Override
    public void beforeCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row,
                                 Head head, Integer integer, Integer integer1, Boolean aBoolean) {
   

    }

    @Override
    public void afterCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Cell cell,
                                Head head, Integer integer, Boolean aBoolean) {
   

        Workbook workbook = writeSheetHolder.getSheet().getWorkbook();
        CellStyle cellStyle = workbook.createCellStyle();
        Font cellFont = workbook.createFont();
//加粗
        cellFont.setBold(true);
//字体大小
        cellFont.setFontHeightInPoints((short) 12);
//居中
        cellStyle.setAlignment(HorizontalAlignment.CENTER);
        cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
        cellStyle.setFont(cellFont);
        cell.setCellStyle(cellStyle);
//设置 自动换行
        cellStyle.setWrapText(true);
    }

    @Override
    public void afterCellDataConverted(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder,
                                       CellData cellData, Cell cell, Head head, Integer integer, Boolean aBoolean) {
   

    }

    @Override
    public void afterCellDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder,
                                 List<CellData> list, Cell cell, Head head, Integer integer, Boolean aBoolean) {
   

//当前行
        int curRowIndex = cell.getRowIndex();
//当前列
        int curColIndex = cell.getColumnIndex();
        if (curRowIndex > mergeRowIndex) {
   
            for (int i = 0; i < mergeColumnIndex.length; i++) {
   
                if (curColIndex == mergeColumnIndex[i]) {
   
                    mergeWithPrevRow(writeSheetHolder, cell, curRowIndex, curColIndex);
                    break;
                }
            }
        }

    }

    private void mergeWithPrevRow(WriteSheetHolder writeSheetHolder, Cell cell, int curRowIndex, int curColIndex) {
   
//获取当前行的当前列的数据和上一行的当前列列数据,通过上一行数据是否相同进行合并
        Object curData = cell.getCellTypeEnum() == CellType.STRING ? cell.getStringCellValue() :
                cell.getNumericCellValue();
        Cell preCell = cell.getSheet().getRow(curRowIndex - 1).getCell(curColIndex);
        Object preData = preCell.getCellTypeEnum() == CellType.STRING ? preCell.getStringCellValue() :
                preCell.getNumericCellValue();

// 比较当前行的第一列的单元格与上一行是否相同,相同合并当前单元格与上一行
//
        if (curData.equals(preData)) {
   
            Sheet sheet = writeSheetHolder.getSheet();
            List<CellRangeAddress> mergeRegions = sheet.getMergedRegions();
            boolean isMerged = false;
            for (int i = 0; i < mergeRegions.size() && !isMerged; i++) {
   
                CellRangeAddress cellRangeAddr = mergeRegions.get(i);
// 若上一个单元格已经被合并,则先移出原有的合并单元,再重新添加合并单元
                if (cellRangeAddr.isInRange(curRowIndex - 1, curColIndex)) {
   
                    sheet.removeMergedRegion(i);
                    cellRangeAddr.setLastRow(curRowIndex);
                    sheet.addMergedRegion(cellRangeAddr);
                    isMerged = true;
                }
            }
// 若上一个单元格未被合并,则新增合并单元
            if (!isMerged) {
   
                CellRangeAddress cellRangeAddress = new CellRangeAddress(curRowIndex - 1, curRowIndex, curColIndex,
                        curColIndex);
                sheet.addMergedRegion(cellRangeAddress);
            }
        }
    }
}

相关推荐

  1. EsayExcel读取合并单元

    2023-12-21 22:52:01       57 阅读
  2. EASYEXCEL导出表格(有标题、单元合并

    2023-12-21 22:52:01       54 阅读
  3. EasyExcel简单合并单元数据工具类

    2023-12-21 22:52:01       72 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2023-12-21 22:52:01       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2023-12-21 22:52:01       106 阅读
  3. 在Django里面运行非项目文件

    2023-12-21 22:52:01       87 阅读
  4. Python语言-面向对象

    2023-12-21 22:52:01       96 阅读

热门阅读

  1. C语言初学6:判断

    2023-12-21 22:52:01       59 阅读
  2. 网站访问量指标

    2023-12-21 22:52:01       55 阅读
  3. C语言求回文数(详解版)

    2023-12-21 22:52:01       60 阅读
  4. C语言三个数从小到大排序/输出

    2023-12-21 22:52:01       49 阅读
  5. netstat命令检查端口是否监听

    2023-12-21 22:52:01       57 阅读
  6. IEEE双栏摘要排版

    2023-12-21 22:52:01       55 阅读
  7. CCF编程能力等级认证GESP—C++5级—20230923

    2023-12-21 22:52:01       86 阅读
  8. 阿里lindorm与MyBatis Plus集成

    2023-12-21 22:52:01       63 阅读
  9. Scrum项目管理流程及免费敏捷工具

    2023-12-21 22:52:01       79 阅读