简化版的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
    }
}

猜你喜欢

转载自blog.csdn.net/sinat_33472737/article/details/109680707