在 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
}
}