EasyExcel--自定义表头(标题)样式策略

本文分析了EasyExcel设置表头样式的两种方式,并详细探讨了HorizontalCellStyleStrategy类的工作原理。为了应对复杂表头样式的设置需求,提出了自定义样式策略的实现思路,包括创建自定义样式对象、实现处理此样式的策略以及如何写入Excel。通过这种方式,可以实现对每个表头的个性化设置。
摘要由CSDN通过智能技术生成

前言:在项目开发中,我们有时候会遇到自定义表头样式的需求。EasyExcel官方文档中关于表头样式的说明有两种(以设置表头颜色为例):

  • 方式1:通过使用注解来设置颜色(优点:使用非常方便,缺点:对于复杂表头就无能为力了,例如无法单独设置父表头和子表头的颜色)
  • 方式2:通过使用HorizontalCellStyleStrategy 策略的方式来设置表头颜色(优点:通过此策略可以对表头设置更多的样式,缺点:但此策略的应用对象是所有表头,这意味着无法单独对单个的表头进行个性化设置)。
  • 因此,本文想提供一种可行的且更加全面的表头样式设置方式,即自定义策略
1. 源码分析

HorizontalCellStyleStrategy 策略类图.png

通过类图我们不难发现,HorizontalCellStyleStrategy 类继承了AbstractCellStyleStrategy抽象类,而此抽象类中有三个抽象方法,其中与标题头部样式有关的是setHeadCellStyls这个抽象方法,那么这个方法又是何时调用的呢?我们进一步到AbstractCellStyleStrategy类中查看。

AbstractCellStyleStrategy的afterCellDispose方法.png

可以看到,在afterCellDispose方法中有对setHeadCellStyls的调用,当传入的是表头时,就会执行此方法来设置表头样式,否则就是对单元格的内容进行样式设置。

现在,我们再来看看HorizontalCellStyleStrategy 类是如何实现具体实现这些抽象方法的:

  • HorizontalCellStyleStrategy 类中的属性及构造方法

HorizontalCellStyleStrategy 类属性.png
HorizontalCellStyleStrategy 类构造方法.png

可以看到,HorizontalCellStyleStrategy 类定义了两种类型的属性方框1中的属性是属于EasyExcel的样式对象,方框2中的属性是属于POI的,从这里我们不难发现,HorizontalCellStyleStrategy 构造方法中传入的EasyExcel的样式对象,最终都要转换成POI的对象。那么在哪里进行转换呢?请看下面这段代码。

  • 抽象方法ininCellStyle的实现

HorizontalCellStyleStrategy 类中的实现.png

上图中的initCellStyle方法,就是此策略进行对象转换的地方。通过StyleUtil工具类将EasyExcel对象转换成POI对象。值得注意的是,在代码调试的时我发现此方法只会执行一次,即在内容填充前进行样式的初始化,之后就不会执行了。 当然也可以在其父类AbstractCellStyleStrategy中发现此方法的调用时机。如下图所示:
AbstractCellStyleStrategy类中initCellStyle方法的调用时机.png

  • 抽象方法setHeadCellStyle的实现

HorizontalCellStyleStrategy 类中的实现.png

头部的具体样式都在这里进行设置,那么此方法又是何时调用的呢?

AbstractCellStyleStrategy类中setHeadCellStyle方法的调用时机.png

通过调用可以看到,当所有对Cell的操作都执行完之后,就会调用此方法,如果Cell是头,则执行头部样式方法,如果是内容则执行内容样式方法。至此,HorizontalCellStyleStrategy 类就分析完了。我们要想自定义策略就可以把HorizontalCellStyleStrategy 类当做参考对象

2. 自定义样式策略的实现
  • 基本思路:实现一个可以自定义表头样式的对象、实现一个可以处理此样式集合的策略、写Excel

  • 复杂表头样式对象【用于存储当表头的自定义样式信息】
/**
 * 复杂表头样式信息,包含需要自定义的表头坐标及样式
 *
 * @Author: nxf
 * @Date: 2021/1/17 20:32
 */
public class ComplexHeadStyles  {
   

    /**
    *   表头横坐标 - 行
    * */
    private Integer x;
    /**
    *   表头纵坐标 - 列
    * */
    private Integer y;
    /**
    *   内置颜色
    * */
    private Short indexColor;

    public ComplexHeadStyles(Integer x, Integer y, Short indexColor){
   
        this.x=x;
        this.y=y;
        this.indexColor=indexColor;
    }

    private void setCroods(Integer x,Integer y){
   
        this.x=x;
        this.y=y;
    }



    public Integer getX() {
   
        return x;
    }

    public void setX(Integer x) {
   
        this.x = x;
    }

    
  • 9
    点赞
  • 53
    收藏
    觉得还不错? 一键收藏
  • 11
    评论
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值