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 작성에 따라 다른 테이블의 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
}
}