EasyExcel 设置自定义表头

实体类写法

 //@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);
        }
    }

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
EasyExcel是一个方便、易用、高效的Java Excel操作库,广泛应用于各种Java应用程序中。在EasyExcel中,导出动态表头是常见的操作需求,因为有时候表头的列数和列名是不确定的,需要在运行时动态生成。下面将介绍如何使用EasyExcel导出动态表头。 首先需要定义Excel的列头信息,可以通过继承AbstractWriteHandler接口,重写afterSheetCreate方法,在该方法中动态生成列头信息。代码示例如下: ``` public class DynamicHeadExcelHandler implements AbstractWriteHandler { private List<List<String>> headTitles = new ArrayList<>(); @Override public void afterSheetCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, RowWriteHandler rowWriteHandler) { List<String> headTitle1 = new ArrayList<>(); headTitle1.add("姓名"); headTitle1.add("年龄"); headTitles.add(headTitle1); List<String> headTitle2 = new ArrayList<>(); headTitle2.add("性别"); headTitle2.add("地址"); headTitles.add(headTitle2); writeHead(writeSheetHolder, writeTableHolder); } private void writeHead(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder) { int maxColumnSize = getMaxColumnSize(headTitles); Sheet sheet = writeSheetHolder.getSheet(); sheet.createRow(0); for (int i = 0; i < maxColumnSize; i++) { Cell cell = sheet.getRow(0).createCell(i); cell.setCellValue(getCellValue(i)); cell.setCellStyle(getHeadStyle(writeSheetHolder, writeTableHolder)); } CellRangeAddress range = new CellRangeAddress(0, 0, 0, maxColumnSize - 1); sheet.addMergedRegion(range); } private int getMaxColumnSize(List<List<String>> headTitles) { int max = 0; for (List<String> titles : headTitles) { int size = titles.size(); if (size > max) { max = size; } } return max; } private String getCellValue(int index) { StringBuilder builder = new StringBuilder(); for (List<String> titles : headTitles) { if (titles.size() > index) { builder.append(titles.get(index)).append(" "); } } return builder.toString(); } private CellStyle getHeadStyle(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder) { CellStyle cellStyle = writeSheetHolder.getSheet().getWorkbook().createCellStyle(); Font font = writeSheetHolder.getSheet().getWorkbook().createFont(); font.setBold(true); font.setFontHeightInPoints((short) 14); cellStyle.setFont(font); cellStyle.setAlignment(HorizontalAlignment.CENTER); return cellStyle; } } ``` 在上述代码中,我们定义了两行表头信息,每一行都是一个List<String>类型的数据。在afterSheetCreate方法中,我们通过遍历headTitles来动态生成列头信息。然后在writeHead方法中,我们生成了一个合并单元格的行并将列头信息填入其中。 接下来,我们在程序中使用该ExcelHandler,可以通过以下代码实现: ``` ExcelWriter excelWriter = EasyExcel.write(outputStream).registerWriteHandler(new DynamicHeadExcelHandler()).build(); excelWriter.write(data, EasyExcel.writerSheet().build()); excelWriter.finish(); ``` 在上述代码中,我们创建了一个ExcelWriter对象,并将DynamicHeadExcelHandler注册为WriteHandler。然后我们调用write方法将数据写入Excel中。 综上所述,EasyExcel提供了方便的API来实现动态表头的导出,通过继承AbstractWriteHandler接口来实现表头生成。以上就是使用EasyExcel导出动态表头的方法。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值