EasyExcel合并列(横向合并)

工具类

package com.bytz.modules.cms.statistics.excel;


import com.alibaba.excel.metadata.Head;
import com.alibaba.excel.metadata.data.CellData;
import com.alibaba.excel.metadata.data.WriteCellData;
import com.alibaba.excel.write.handler.CellWriteHandler;
import com.alibaba.excel.write.handler.context.CellWriteHandlerContext;
import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
import com.alibaba.excel.write.metadata.holder.WriteTableHolder;
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.util.CellRangeAddress;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class ExcelFillCellMergePrevCol implements CellWriteHandler {
    private static final String KEY ="%s-%s";
    //所有的合并信息都存在了这个map里面
    Map<String, Integer> mergeInfo = new HashMap<>();

    public ExcelFillCellMergePrevCol() {
    }
    public ExcelFillCellMergePrevCol(Map<String, Integer> mergeInfo) {
        this.mergeInfo = mergeInfo;
    }

    @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) {

    }

    @Override
    public void afterCellDataConverted(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, WriteCellData<?> cellData, Cell cell, Head head, Integer relativeRowIndex, Boolean isHead) {
    }

    @Override
    public void afterCellDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, List<WriteCellData<?>> cellDataList, Cell cell, Head head, Integer relativeRowIndex, Boolean isHead) {

      //当前行
        int curRowIndex = cell.getRowIndex();
        //当前列
        int curColIndex = cell.getColumnIndex();

        Integer num = mergeInfo.get(String.format(KEY, curRowIndex, curColIndex));
        if(null != num){
            // 合并最后一行 ,列
            mergeWithPrevCol(writeSheetHolder, cell, curRowIndex, curColIndex,num);
        }
    }

    public void mergeWithPrevCol(WriteSheetHolder writeSheetHolder, Cell cell, int curRowIndex, int curColIndex, int num) {
        Sheet sheet = writeSheetHolder.getSheet();
        CellRangeAddress cellRangeAddress = new CellRangeAddress(curRowIndex, curRowIndex, curColIndex, curColIndex + num);
        sheet.addMergedRegion(cellRangeAddress);
    }

    //num从第几列开始增加多少列
    // curRowIndex 在第几行进行行合并
    // curColIndex 在第几列进行合并
    // num 合并多少格
    // 比如我上图中中心需要在第三行 从0列开始合并三列 所以我可以传入 (3,0,2)
    public void add (int curRowIndex,  int curColIndex , int num){
        mergeInfo.put(String.format(KEY, curRowIndex, curColIndex),num);
    }

}

使用

        //合并单元格
        ExcelFillCellMergePrevCol mergePrevCol = new ExcelFillCellMergePrevCol();
        int headSize = 3;
        if (areaInSize!=0){
            mergePrevCol.add(headSize + areaInSize, 0, 2);
            mergePrevCol.add(headSize + ExcelData.size() +1, 0, 2);
            mergePrevCol.add(headSize + ExcelData.size()+2, 0, 2);
            mergePrevCol.add(headSize + + ExcelData.size()+3, 0, 3+categories.size());
        }else {
            mergePrevCol.add(headSize + areaOutSize, 0, 2);
            mergePrevCol.add(headSize + areaOutSize +1, 0, 2);
            mergePrevCol.add(headSize + areaOutSize+2, 0, 2);
            mergePrevCol.add(headSize + areaOutSize+3, 0, 3+categories.size());

        }

        //写入表头
        EasyExcel.write(outputStream)
                .head(header)
                .needHead(true)
                .autoCloseStream(true)
                .sheet()
                .registerWriteHandler(mergePrevCol)
                .doWrite(dataList)
                ;

效果图(合计的部分)

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
EasyExcel合并可以通过 `merge` 方法实现。具体步骤如下: 1. 创建一个 `WriteSheet` 对象,定义表格的基本信息。 ```java WriteSheet writeSheet = EasyExcel.writerSheet("合并示例").build(); ``` 2. 定义表头信息,并添加到 `WriteSheet` 对象中。 ```java List<List<String>> head = new ArrayList<>(); head.add(Arrays.asList("姓名", "性别", "年龄")); writeSheet.setHead(head); ``` 3. 定义要写入的数据,并添加到 `WriteSheet` 对象中。 ```java List<DemoData> data = new ArrayList<>(); data.add(new DemoData("张三", "男", 20)); data.add(new DemoData("李四", "女", 22)); data.add(new DemoData("王五", "男", 25)); writeSheet.setClazz(DemoData.class); EasyExcel.write(fileName).sheet().doWrite(data); ``` 4. 使用 `merge` 方法合并指定的单元格。 ```java // 合并第一中姓名相同的单元格 int firstRow = 1; int lastRow = 1; String lastName = data.get(0).getName(); for (int i = 1; i < data.size(); i++) { if (data.get(i).getName().equals(lastName)) { lastRow++; } else { if (lastRow > firstRow) { writeSheet.merge(firstRow, lastRow, 0, 0); } firstRow = i + 1; lastRow = firstRow; lastName = data.get(i).getName(); } } if (lastRow > firstRow) { writeSheet.merge(firstRow, lastRow, 0, 0); } ``` 上面的代码中,我们首先定义了要合并的单元格的行和的起始和结束位置,然后使用 `merge` 方法将这些单元格合并起来。其中,`merge` 方法接受 4 个参数,分别表示要合并的单元格的行和的起始和结束位置。在本例中,我们将第一中姓名相同的单元格进行了合并

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值