简化版的easyexcel取消默认表头样式,且支持回调以达到不同表头样式差异化

在 easyexcel 取消默认的表头样式这篇文章中,夹带了基于注解单元格内容格式的设置。下方代码仅仅只是重写表头样式,不包含单元格内容格式设置。

一方案、下方代码依旧是基于easyexcel的WriteCellStyle,ExcelStyleAnnotationAndCancelDefaultHeadStyleCellWriteHandler#buildHeadCellStyle方法可在easyexcel 取消默认的表头样式中找到该方法。headStyleConsumer回调可用于不同单元格的表头内容的格式做不同设置。ThreeConsumer没有将relativeRowIndex放进去,只因参数已经有三个了,应该将这三个参数和relativeRowIndex封装到一个类中。如下方的HeadConsumer可替换ThreeConsumer。

public class CancelDefaultHeadStyleCellWriteHandler extends AbstractCellStyleStrategy {
    private WriteCellStyle headWriteCellStyleSelf;
    private ThreeConsumer<CellStyle,Cell,Head> headStyleConsumer;
    public CancelDefaultHeadStyleCellWriteHandler(WriteCellStyle headWriteCellStyle,ThreeConsumer<CellStyle,Cell,Head> headStyleConsumer) {
        this.headWriteCellStyleSelf = headWriteCellStyle;
        this.headStyleConsumer = headStyleConsumer;
    }
    @Override
    protected void initCellStyle(Workbook workbook) {
        //NO-OP
    }

    @Override
    protected void setHeadCellStyle(Cell cell, Head head, Integer relativeRowIndex) {
        Workbook workbook = cell.getSheet().getWorkbook();
        CellStyle headCellStyleSelf = ExcelStyleAnnotationAndCancelDefaultHeadStyleCellWriteHandler.buildHeadCellStyle(workbook, headWriteCellStyleSelf);
        if (headCellStyleSelf == null) {
            return;
        }
        if (headStyleConsumer != null) {
            headStyleConsumer.accept(headCellStyleSelf,cell,head);
        }
        cell.setCellStyle(headCellStyleSelf);
    }

    @Override
    protected void setContentCellStyle(Cell cell, Head head, Integer relativeRowIndex) {
        //NO-OP
    }
}
@FunctionalInterface
public interface ThreeConsumer<T, U, V>  {
    void accept(T t, U u,V v);
}
public interface HeadConsumer<T extends HeadConsumer.HeadConsumerHelper> {
    void accept(T t);
    @Data
    public static class HeadConsumerHelper{
        private Workbook workbook;
        private Cell cell;
        private Head head;
        private Integer relativeRowIndex;
        private CellStyle headCellStyle;
    }
}

 ThreeConsumer示例:根据表头内容设置不同的样式,当然如果有relativeRowIndex的话,也可以根据需求设置不同行的表头样式。(基于WriteTable的写,不同table的relativeRowIndex都是从0开始

    public static void headStyleConsumer(CellStyle cellStyle, Cell cell, Head head) {
        String name = cell.getStringCellValue().trim();
        if ("AA".equals(name) || "BB".equals(name)) {
            Font font = cell.getSheet().getWorkbook().createFont();
            font.setFontName("宋体");
            font.setFontHeightInPoints((short)11);
            cellStyle.setFont(font);
            cell.getRow().setHeight((short)1000);
        }else {
            cellStyle.setBorderTop(BorderStyle.NONE);
            cellStyle.setBorderRight(BorderStyle.NONE);
            cell.getRow().setHeight((short)600);
        }
    }

二方案、抛弃掉基于easyexcel的WriteCellStyle,重写setHeadCellStyle方法,如下代码所示。HeadConsumer回调用来设置表头样式,表头差异化样式可在回调中设置。

public class CancelDefaultHeadStyleCellWriteHandler extends AbstractCellStyleStrategy {
    private HeadConsumer<HeadConsumer.HeadConsumerHelper> headStyleConsumer;
    public CancelDefaultHeadStyleCellWriteHandler(HeadConsumer<HeadConsumer.HeadConsumerHelper> headStyleConsumer) {
        this.headStyleConsumer = headStyleConsumer;
    }
    @Override
    protected void initCellStyle(Workbook workbook) {
        //NO-OP
    }

    @Override
    protected void setHeadCellStyle(Cell cell, Head head, Integer relativeRowIndex) {
        Workbook workbook = cell.getSheet().getWorkbook();
        CellStyle cellStyle = workbook.createCellStyle();
        HeadConsumer.HeadConsumerHelper helper = new HeadConsumer.HeadConsumerHelper();
        helper.setHeadCellStyle(cellStyle);
        helper.setHead(head);
        helper.setCell(cell);
        helper.setRelativeRowIndex(relativeRowIndex);
        helper.setWorkbook(workbook);
        headStyleConsumer.accept(helper);
        cell.setCellStyle(cellStyle);
    }

    @Override
    protected void setContentCellStyle(Cell cell, Head head, Integer relativeRowIndex) {
        //NO-OP
    }
}

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于 EasyExcel,要实现多行表头不同样式,可以使用 `WriteCellStyle` 和 `WriteFont` 来设置不同样式。下面是一个示例代码: ```java // 创建工作簿 Workbook workbook = new Workbook(); // 创建工作表 Sheet sheet = workbook.createSheet("Sheet1"); // 设置第一行表头 Row row1 = sheet.createRow(0); Cell cell1 = row1.createCell(0); cell1.setCellValue("表头1"); // 设置第二行表头 Row row2 = sheet.createRow(1); Cell cell2 = row2.createCell(0); cell2.setCellValue("表头2"); // 创建样式 WriteCellStyle style1 = new WriteCellStyle(); WriteFont font1 = new WriteFont(); font1.setBold(true); // 设置粗体 style1.setWriteFont(font1); // 将字体应用到样式 WriteCellStyle style2 = new WriteCellStyle(); WriteFont font2 = new WriteFont(); font2.setColor(FontColor.RED); // 设置字体颜色为红色 style2.setWriteFont(font2); // 将字体应用到样式 // 设置第一行表头样式 CellRangeAddress region1 = new CellRangeAddress(0, 0, 0, 0); // 合并单元格 sheet.addMergedRegion(region1); cell1.setCellStyle(style1); // 设置第二行表头样式 CellRangeAddress region2 = new CellRangeAddress(1, 1, 0, 0); // 合并单元格 sheet.addMergedRegion(region2); cell2.setCellStyle(style2); // 导出 Excel ExcelWriter excelWriter = EasyExcel.write("output.xlsx").build(); excelWriter.write(workbook, sheet); excelWriter.finish(); ``` 在上面的示例中,通过创建不同的 `WriteCellStyle` 和 `WriteFont` 对象,设置不同样式,然后将样式应用到相应的单元格上,实现了多行表头不同样式的效果。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值