EasyExcel 设置自定义表头

本文详细讲解了如何使用EasyExcel在Java中处理Excel数据,通过`@ExcelProperty`和自定义处理器`ExcelTitleHandler`动态设置表头,适用于导出数据时减少代码复杂性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

实体类写法

 //@ExcelProperty(value = {"${bigHead}","${dateHead}","团号"}, index = 0) 配置两行表头写法
    @ExcelProperty(value = {"${bigHead}","团号"}, index = 0)
    private String opuOrderNo;      // 团号
    @ExcelProperty(value = {"${bigHead}","房号"}, index = 1)
    private String roomNo;          // 房号
    @ExcelProperty(value = {"${bigHead}","房型"}, index = 2)
    private String roomMode;        // 房型
    @ExcelProperty(value = {"${bigHead}","姓名"}, index = 3)
    private String name;            // 姓名
    @ExcelProperty(value = {"${bigHead}","入住日期"}, index = 4)
    private String startDate;       // 入住日期
    @ExcelProperty(value = {"${bigHead}","离店日期"}, index = 5)
    private String endDate;         // 离店日期
    @ExcelProperty(value = {"${bigHead}","房价"}, index = 6)
    private String roomPrice;          // 房价
    @ExcelProperty(value = {"${bigHead}","房晚"}, index = 7)
    private String stayDay;            // 房晚

package com.zbscxy.devOpsManage.util;

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 org.apache.commons.collections4.CollectionUtils;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.springframework.util.ObjectUtils;
import org.springframework.util.PropertyPlaceholderHelper;

import java.util.List;
import java.util.Properties;

/**
 * @ClassName: ExcelTitleHandler
 * @Description:
 * @Author: zmm
 * @Date: 2023/9/25 17:34
 */
public class ExcelTitleHandler implements CellWriteHandler {
    /**
     * 错误信息处理时正则表达式的格式
     */
    private final String EXCEL_ERROR_REG = "^(.*)(\\(错误:)(.*)(\\))$";

    private String bigHead;

    private String dateHead;

    PropertyPlaceholderHelper placeholderHelper = new PropertyPlaceholderHelper("${", "}");

    public ExcelTitleHandler(String bigHead, String dateHead) {
        this.bigHead = bigHead; //表头1
        this.dateHead = dateHead;  //表头2
    }


    @Override
    public void beforeCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row, Head head, Integer columnIndex, Integer relativeRowIndex, Boolean isHead) {
        // 动态设置表头字段
        if (!ObjectUtils.isEmpty(head)) {
            List<String> headNameList = head.getHeadNameList();
            if (CollectionUtils.isNotEmpty(headNameList)) {
                Properties properties = new Properties();
                properties.setProperty("bigHead", bigHead);
                properties.setProperty("dateHead", dateHead);
                for (int i = 0; i < headNameList.size(); i++) {
                    // 循环遍历替换
                    headNameList.set(i, placeholderHelper.replacePlaceholders(headNameList.get(i), properties));
                }
            }
        }
    }

    @Override
    public void afterCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Cell cell, Head head, Integer relativeRowIndex, Boolean isHead) {
    }

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


工具类写法 

/**
     * 导出 (无需设置表头、通过注解在导出class上:@ExcelProperty即可)
     * @param response
     * @param excelName excel名称
     * @param sheetName sheet名称
     * @param clazz     导出标题类(必须添加导出注解)
     * @param data      导出数据
     * @param titleName  表头
     * @throws Exception
     */    
public static void exportData(HttpServletResponse response, String excelName, String sheetName, Class clazz, List data, String titleName) throws Exception {
        response.setContentType("application/vnd.ms-excel");
        response.setCharacterEncoding("utf-8");
        // 这里URLEncoder.encode可以防止中文乱码
        excelName = URLEncoder.encode(excelName, "UTF-8").replaceAll("\\+", "%20");
        String filename = new String(excelName.getBytes("UTF-8"), "ISO-8859-1");
        response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + filename + ExcelTypeEnum.XLSX.getValue());
        response.setHeader("filename", filename + ExcelTypeEnum.XLSX.getValue());

        WriteCellStyle headWriteCellStyle = new WriteCellStyle();
        //设置头部标题居中
        headWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);
        // 内容的策略
        WriteCellStyle contentWriteCellStyle = new WriteCellStyle();
        // 这里需要指定 FillPatternType 为FillPatternType.SOLID_FOREGROUND 不然无法显示背景颜色.头默认了 FillPatternType所以可以不指定
        contentWriteCellStyle.setFillPatternType(FillPatternType.SOLID_FOREGROUND);
        //设置边框样式
        contentWriteCellStyle.setBorderLeft(BorderStyle.THIN);//细实线
        contentWriteCellStyle.setBorderTop(BorderStyle.THIN);
        contentWriteCellStyle.setBorderRight(BorderStyle.THIN);
        contentWriteCellStyle.setBorderBottom(BorderStyle.THIN);
        // 这个策略是 头是头的样式 内容是内容的样式 其他的策略可以自己实现
        HorizontalCellStyleStrategy horizontalCellStyleStrategy = new HorizontalCellStyleStrategy(headWriteCellStyle, contentWriteCellStyle);
        String dateHead = ""; // 第二行表头  留着作为案例
        EasyExcel.write(response.getOutputStream(), clazz)
                //插入数据
                .sheet(sheetName)
                .registerWriteHandler(new ExcelTitleHandler(titleName, dateHead))
                .registerWriteHandler(horizontalCellStyleStrategy)
                .doWrite(data);
    }

方法调用 

 public void exportRoomStatisticsList(Long classId, HttpServletResponse response) {
        try {
            //获取报表数据
            BasicAndStatisticsClassStayVo basicAndStatisticsClassStayVo = getRoomStatisticsListData(classId);
            //将详情数据 添加到 tbClassStaySettlementImportVos中
            List<TbClassStaySettlementImportVo> tbClassStaySettlementImportVos = getClassStayStuDetails(basicAndStatisticsClassStayVo);
            //添加空数据,占两行 与统计数据隔离
            addNullData(tbClassStaySettlementImportVos);
            //添加统计数据表头
            addStatisticsTitleData(tbClassStaySettlementImportVos);
            //添加统计数据
            addStatisticsData(basicAndStatisticsClassStayVo, tbClassStaySettlementImportVos);
            String excelName = "培训班学员每日住宿房型数量报表-" + System.currentTimeMillis();
            String sheetName = "培训班学员每日住宿房型数量报表";
            String className = basicAndStatisticsClassStayVo.getClassStayStuDetails().get(0).getClassName();
            EasyExcelUtils.exportData(response, excelName, sheetName, TbClassStaySettlementImportVo.class, tbClassStaySettlementImportVos,className);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

### 实现 EasyExcel 自定义表头 #### 使用 `@ExcelProperty` 注解实现基本表头定制 对于基础的表头定制,可以通过使用 `@ExcelProperty` 注解来指定列名及其顺序。然而当面对不同维度下的动态变化需求时,仅依靠此注解难以满足灵活性的要求[^1]。 ```java public class DataModel { @ExcelProperty("固定字段一") private String fieldOne; @ExcelProperty("可变维度A/B/C") // 这里希望根据实际业务逻辑改变 private Integer dimensionValue; // getter and setter methods... } ``` #### 动态生成表头方案 针对上述提到的不同维度统计场景,推荐采用编程方式构建数据模型而非硬编码多个实体类。具体做法是在写入 Excel 前先组装好带有正确标题的数据集合: ```java // 定义一个通用的数据载体接口/抽象类 public abstract class DynamicHeaderData { public List<String> getHeaders(); // 返回当前实例对应的表头列表 } // 针对每种可能的变化情况创建具体的子类实现 public class SpecificDimension extends DynamicHeaderData { private final String fixedFieldLabel = "固定字段"; private final String dynamicDimenstionName; public SpecificDimension(String dimName){ this.dynamicDimenstionName=dimName; } @Override public List<String> getHeaders(){ return Arrays.asList(fixedFieldLabel, dynamicDimenstionName); } } ``` 接着,在执行导出操作之前,依据实际情况初始化相应的 `SpecificDimension` 对象并调用其 `getHeaders()` 方法获取即时所需的表头配置。 #### 应用样式策略以增强视觉效果 为了进一步美化输出文档,还可以利用 `HorizontalCellStyleStrategy` 或者其他类似的 API 来应用自定义格式化规则给整个工作簿或是特定区域内的单元格。这涉及到设置字体大小、背景色等外观特性[^2]。 ```java WriteCellStyle headWriteCellStyle = new WriteCellStyle(); headWriteCellStyle.setFillForegroundColor(IndexedColors.LIGHT_YELLOW.getIndex()); FontData fontData = new FontData(); fontData.setFontHeightInPoints((short) 14); // 设置字号为14磅 fontData.setBold(true); // 加粗显示文字 headWriteCellStyle.setWriteFont(fontData); // 创建水平方向上的样式策略 HorizontalCellStyleStrategy horizontalCellStyleStrategy = new HorizontalCellStyleStrategy(headWriteCellStyle, null /* 默认正文无特殊样式 */); EasyExcel.write(fileName).registerWriteHandler(horizontalCellStyleStrategy)...build(); ``` 以上代码片段展示了如何设定头部样式的细节,并将其应用于即将被写出的工作薄上。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值