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