easyexcel 填写模板指定行合并单元格

1.easyexcel(官网)添加版本依赖

       <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>easyexcel</artifactId>
            <version>3.1.1</version>
        </dependency>

2.编写一个类继承合并单元策略,重写merge()方法

package com.lxj.exam.handler;

import com.alibaba.excel.metadata.Head;
import com.alibaba.excel.write.merge.AbstractMergeStrategy;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.ss.util.RegionUtil;
import java.util.List;

/**
 * 合并单元格处理类
 */
public class MyHandler extends AbstractMergeStrategy {

    /**
     * 合并开始行
     */
    private Integer startRow = 0;
    /**
     * list表格所有的合并列集合
     */
    private List<CellRangeAddress> cellRangeAddressList = null;

    public MyHandler() {
    }

    public MyHandler(int startRow, List<CellRangeAddress> cellRangeAddressList) {
        this.startRow = startRow;
        this.cellRangeAddressList = cellRangeAddressList;
    }

    @Override
    protected void merge(Sheet sheet, Cell cell, Head head, Integer relativeRowIndex) {
        // 设置样式
        CellStyle cellStyle = cell.getCellStyle();
        //水平居中
        cellStyle.setAlignment(HorizontalAlignment.CENTER);
        //自动换行
        cellStyle.setWrapText(true);
        //在这里判断从哪一行开始调用合并的方法
        if (cell.getRowIndex() > this.startRow) {
            if (relativeRowIndex == null || relativeRowIndex == 0) {
                return;
            }
            mergeColumn(sheet, cell, head, relativeRowIndex);
        }
    }

    /**
     * 合并单元格
     *
     * @param sheet
     * @param cell
     * @param head
     * @param relativeRowIndex
     */
    protected void mergeColumn(Sheet sheet, Cell cell, Head head, Integer relativeRowIndex) {
        int rowIndex = cell.getRowIndex();
        int colIndex = cell.getColumnIndex();
        sheet = cell.getSheet();
        // 获取前一行
        Row preRow = sheet.getRow(rowIndex - 1);
        //获取前一列
        Cell preCell = preRow.getCell(colIndex);
        List<CellRangeAddress> list = this.cellRangeAddressList;
        for (int i = 0; i < list.size(); i++) {
            CellRangeAddress cellRangeAddress = list.get(i);
            if (cellRangeAddress.containsColumn(preCell.getColumnIndex())) {
                int lastColIndex = cellRangeAddress.getLastColumn();
                int firstColIndex = cellRangeAddress.getFirstColumn();
                CellRangeAddress cra = new CellRangeAddress(cell.getRowIndex(), cell.getRowIndex(), firstColIndex, lastColIndex);
                sheet.addMergedRegion(cra);
                // 加边框
                RegionUtil.setBorderBottom(BorderStyle.THIN, cra, sheet);
                RegionUtil.setBorderLeft(BorderStyle.THIN, cra, sheet);
                RegionUtil.setBorderRight(BorderStyle.THIN, cra, sheet);
                RegionUtil.setBorderTop(BorderStyle.THIN, cra, sheet);
                return;
            }
        }

    }



}

3.测试方法

/**
*@param templateFilePath 模板文件路径
*@param filePath 导出文件路径
*/
 public static void test3(String templateFilePath, String filePath) {
        Map<String, List<ExcelDto>> map = new HashMap<>();
        map.put("a", getListDtos());
        Map<String, Object> testMap = new HashMap<>();
        testMap.put("date", LocalDateTime.now());
        testMap.put("title", "测试");
        // 添加合并单元格地址
        List<CellRangeAddress> list = new ArrayList<>();
        //new CellRangeAddress(开始行,结束行,开始列,结束列) 
        list.add(new CellRangeAddress(1, 1, 2, 3));
        list.add(new CellRangeAddress(1, 1, 5, 6));
        // 创建ExcelWriterBuilder 
        ExcelWriterBuilder excelWriterBuilder = EasyExcel.write(filePath)
                .withTemplate(templateFilePath);
        ExcelWriter excelWriter = excelWriterBuilder.build();
        // 创建writeSheet,并注册合并单元格handler
        WriteSheet writeSheet = EasyExcel.writerSheet()
                .registerWriteHandler(new MyHandler(0,list))
                .build();
        WriteSheet writeSheet1 = EasyExcel.writerSheet().build();
        // 填写配置,forceNewRow true表示自动创建一行,后面的数据后移
        FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build();
        //填写数据
        excelWriter.fill(new FillWrapper("a", getListDtos()), fillConfig, writeSheet);
        excelWriter.fill(testMap,writeSheet1);
        // 关闭填写
        excelWriter.finish();
    }

    public static List<ExcelDto> getListDtos() {
        List<ExcelDto> list = new ArrayList<>();
        int i = 0;
        while (i < 1) {
            list.add(new ExcelDto("张三", 2, 2, "打工仔", "打工仔"));
            list.add(new ExcelDto("李四1", 2, 2, "打工仔", "打工仔"));
            list.add(new ExcelDto("李四2", 2, 2, "打工仔", "打工仔"));
            list.add(new ExcelDto("李四3", 2, 2, "打工仔", "打工仔"));
            list.add(new ExcelDto("李四4", 2, 2, "打工仔", "打工仔"));
            list.add(new ExcelDto("李四5", 2, 2, "打工仔", "打工仔"));
            i++;
        }
        return list;
    }

模板文件

导出的文件内容

 注:有两个需要注意的地方是,1.代码里面用了forceNewRow为ture,在写excel模板的时候,

表达式需要合并的地方一定要合并。

 没有合并,结果会像下面看到一样。

 2.第二个要注意的地方是,这个两个填充数据的顺序一定是list数据在上,kay-value数据在下,否则导出来的数据没有合并。像下面的这样就是对的。

 

 

  • 5
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
您好,针对您的问题,我可以给出以下解答: 如果您需要在 EasyExcel 中导出带有合并单元模板,可以按照以下步骤操作: 1. 在 Java 中定义好模板的表头,包括要合并单元位置和内容。例如: ``` List<List<String>> head = new ArrayList<List<String>>(); List<String> head0 = new ArrayList<String>(); List<String> head1 = new ArrayList<String>(); List<String> head2 = new ArrayList<String>(); List<String> head3 = new ArrayList<String>(); head0.add("第一列"); // 第一第一列到第三列需要合并 head0.add(null); head0.add(null); head0.add("第二列"); head1.add("第一"); head1.add("第一"); head1.add("第一"); head1.add("第二"); head2.add("第三列"); head2.add("第四列"); head2.add("第五列"); head2.add("第六列"); head3.add("数据1"); head3.add("数据2"); head3.add("数据3"); head3.add("数据4"); head.add(head0); head.add(head1); head.add(head2); head.add(head3); ``` 2. 在导出 Excel 文件时,使用 `ExcelWriter` 对象的 `write0` 方法,将表头写入 Excel 中。例如: ``` ExcelWriter writer = EasyExcel.write(fileName).build(); Sheet sheet = new Sheet(1, 0); sheet.setHead(head); writer.write0(null, sheet); ``` 3. 设置需要合并单元。使用 `Sheet` 对象的 `setMerge` 方法,设置需要合并单元位置。例如: ``` // 合并第一第一列到第三列 CellRangeAddress cellRangeAddress = new CellRangeAddress(0, 0, 0, 2); List<CellRangeAddress> cellRangeAddressList = new ArrayList<CellRangeAddress>(); cellRangeAddressList.add(cellRangeAddress); sheet.setMerge(cellRangeAddressList); ``` 4. 最后,将数据写入 Excel 文件并关闭 `ExcelWriter` 对象。例如: ``` writer.write(data, sheet); writer.finish(); ``` 这样就可以导出带有合并单元模板了。希望对您有所帮助。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值