效果展示:

关键代码:

导出代码

        // 第一行表头
        String enterpriseTitle = brandName + " " + seriesName + " "  + vehicleName;

        // 开始导出
        response.setContentType("application/vnd.ms-excel");
        response.setCharacterEncoding("utf-8");
        // 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系
        String fileName = URLEncoder.encode(enterpriseTitle, "UTF-8");
        response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
        EasyExcel.write(response.getOutputStream(), CarPartVO.class) 
                .registerWriteHandler(new ImplProgressReportSheetWriteHandler(enterpriseTitle)) // 第一行的注册合并策略
                .sheet(enterpriseTitle) // sheet名
                .relativeHeadRowIndex(2) // *表头行数  默认表头从第二行开始写入
                .registerWriteHandler(new HorizontalCellStyleStrategy(getHeadWriteCellStyle(), getContentWriteCellStyle()))
                .registerWriteHandler(new ExcelCellWidthStyleStrategy())
                .doWrite(exList);

第一行表头

package com.adc.da.jydata.util;

import com.alibaba.excel.write.handler.SheetWriteHandler;
import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
import com.alibaba.excel.write.metadata.holder.WriteWorkbookHolder;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.CellRangeAddress;

public class ImplProgressReportSheetWriteHandler implements SheetWriteHandler {
    private final String reportTitle; // 新增标题字段

    // 添加带参构造器
    public ImplProgressReportSheetWriteHandler(String reportTitle) {
        this.reportTitle = reportTitle;
    }

    @Override
    public void beforeSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {}

    @Override
    public void afterSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {
        Workbook workbook = writeWorkbookHolder.getWorkbook();
        Sheet sheet = workbook.getSheetAt(0);

        Row row1 = sheet.createRow(0);
        row1.setHeight((short) 100);
        Cell row1Cell1 = row1.createCell(0);

        // 使用传入的标题参数
        row1Cell1.setCellValue(this.reportTitle); // 标题由参数带入;当然下面的也可以设计成参数,需要的话自己实现

        CellStyle row1CellStyle = workbook.createCellStyle();
        row1CellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
        row1CellStyle.setAlignment(HorizontalAlignment.CENTER);

        Font row1Font = workbook.createFont();
        row1Font.setBold(true);
        row1Font.setFontName("宋体");
        row1Font.setFontHeightInPoints((short) 12);// 标题字号
        row1CellStyle.setFont(row1Font);
        row1Cell1.setCellStyle(row1CellStyle);

        sheet.addMergedRegionUnsafe(new CellRangeAddress(0, 1, 0, 10));// 共11列, 11-1=10
    }
}

第二行表头

@Data
@ApiModel(value="CarPartVO 对象", description="导出车辆零部件信息表")
public class CarPartVO {

    @ExcelProperty(value = "零部件分级-一级")
    private String partLevel1;

    // ...  省略掉中间字段
    @ExcelIgnore
    private String level;

}