easyexcel define o formato das células e realiza o controle preciso do formato de cada coluna por meio de anotações personalizadas

No documento easyexcel oficial, você pode definir o formato da célula do cabeçalho e o formato da célula do conteúdo.Existem dois construtores na classe de estratégia do formato da célula.

public HorizontalCellStyleStrategy(WriteCellStyle headWriteCellStyle,
    List<WriteCellStyle> contentWriteCellStyleList) {
    this.headWriteCellStyle = headWriteCellStyle;
    this.contentWriteCellStyleList = contentWriteCellStyleList;
}

public HorizontalCellStyleStrategy(WriteCellStyle headWriteCellStyle, WriteCellStyle contentWriteCellStyle) {
    this.headWriteCellStyle = headWriteCellStyle;
    contentWriteCellStyleList = new ArrayList<WriteCellStyle>();
    contentWriteCellStyleList.add(contentWriteCellStyle);
}

A diferença entre os dois é: o primeiro construtor define os parâmetros de formato da célula para o conteúdo como um conjunto, como você pode ver no código-fonte abaixo,

HorizontalCellStyleStrategy类中给内容设置单元格格式的代码如下:
@Override
protected void setContentCellStyle(Cell cell, Head head, Integer relativeRowIndex) {
    if (contentCellStyleList == null || contentCellStyleList.isEmpty()) {
        return;
    }
    cell.setCellStyle(contentCellStyleList.get(relativeRowIndex % contentCellStyleList.size()));
}

Pode-se ver que contentCellStyleList é a coleção de formato de célula de conteúdo no construtor. A função dessa coleção é realmente alterar o estilo do Excel. Por exemplo, se você fornecer 2 estilos diferentes, 1,3,5 será um estilo , 2,4,6 Comporte-se em outro estilo. Por exemplo, se você fornecer 3 estilos diferentes, 1,4,7 será um estilo, 2,5,8 será outro estilo e 3,6,9 será um estilo, através da célula. O código setCellStyle (contentCellStyleList.get (relativeRowIndex% contentCellStyleList.size ())) pode ser visto.

Através do código acima, descobrimos que embora easyexcel defina estilos para linhas, ou seja, na mesma linha, estilos de coluna diferentes são iguais, mas cada coluna em uma linha executará o método setContentCellStyle do código acima, é aqui que podemos reescrever , podemos Reescrever este método, você pode obter seu próprio controle preciso do formato da célula

A implementação é a seguinte:

Por meio da depuração, verifica-se que o parâmetro head neste método pode obter o nome do parâmetro da classe de entidade correspondente à célula, ou seja, o nome do campo, conforme mostrado no parâmetro de observação abaixo

@ExcelProperty("备注")
private String remark;

Agora que você pode obter o nome do campo, pode jogar livremente.

A primeira versão da minha implementação é ter uma string específica no nome do campo e, em seguida, definir um estilo separado. Por exemplo, se o nome do campo terminar em quantidade, o formato de célula que definir será executado e o outros executarão o formato de célula de conteúdo comum.


private static final String AMOUNT = "amount";

@Override
protected void setContentCellStyle(Cell cell, Head head, Integer relativeRowIndex) {
    if (head.getFieldName().toLowerCase().endsWith(AMOUNT)) {
        Workbook wb = cell.getSheet().getWorkbook();
        CellStyle cellStyle = wb.createCellStyle();
        Font font = wb.createFont();
        font.setFontName("宋体");
        font.setFontHeightInPoints((short) 13);
        cellStyle.setFont(font);
        cellStyle.setAlignment(HorizontalAlignment.RIGHT);
        cell.setCellStyle(cellStyle);

    }else {
        super.setContentCellStyle(cell,head,relativeRowIndex);
    }
}

Uma das maiores limitações da implementação acima é que, se houver vários formatos na mesma linha, é particularmente difícil de usar. Portanto, há uma segunda maneira: por meio de anotações personalizadas.

Porque podemos obter o nome do campo, então a reflexão será pensada.Contanto que a classe do nome do campo seja dada, o campo pode ser obtido. Obtenha as anotações no campo por meio de reflexão e defina o formato da célula para o campo. O código de implementação é o seguinte:

@Slf4j
public class ExcelStyleAnnotationCellWriteHandler extends HorizontalCellStyleStrategy {

    private Class c;
    ExcelStyleAnnotationCellWriteHandler(Class c, WriteCellStyle headWriteCellStyle, WriteCellStyle contentWriteCellStyle) {
        super(headWriteCellStyle, contentWriteCellStyle);
        this.c = c;
    }

    @Override
    protected void setContentCellStyle(Cell cell, Head head, Integer relativeRowIndex) {
        try {
            Field declaredField = c.getDeclaredField(head.getFieldName());
            ExcelStyle annotation = declaredField.getAnnotation(ExcelStyle.class);
            if (annotation != null) {
                Workbook wb = cell.getSheet().getWorkbook();
                CellStyle cellStyle = wb.createCellStyle();
                Font font = wb.createFont();
                font.setFontName(annotation.fontName());
                font.setFontHeightInPoints(annotation.fontHeightInPoints());
                cellStyle.setFont(font);
                cellStyle.setAlignment(annotation.horizontalAlignment());
                cellStyle.setVerticalAlignment(annotation.verticalAlignment());
                cell.setCellStyle(cellStyle);
            }else {
                super.setContentCellStyle(cell,head,relativeRowIndex);
            }
        } catch (NoSuchFieldException e) {
            log.error("ExcelStyleAnnotationCellWriteHandler error{0}",e);
        }

    }
}

自定义注解如下,写的不全,大家可以自行补充


@Target({ElementType.FIELD,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface ExcelStyle {
    String fontName() default "宋体";
    short fontHeightInPoints() default 12;
    HorizontalAlignment horizontalAlignment() default HorizontalAlignment.LEFT;
    VerticalAlignment verticalAlignment() default VerticalAlignment.CENTER;
}
注解使用方式如下

@ExcelProperty("账号")
@ColumnWidth(28)
@ExcelStyle(fontName = "宋体",horizontalAlignment = HorizontalAlignment.LEFT)
private String account;

Ao substituir o método setContentCellStyle, as anotações no campo são lidas e as células são formatadas. Se não houver anotações, o estilo geral é adotado.

Um problema encontrado ao usar cabeçalhos de várias linhas: https://github.com/alibaba/easyexcel/issues/990 , você pode verificar para evitar entrar em si mesmo

 

 

 

Acho que você gosta

Origin blog.csdn.net/sinat_33472737/article/details/103660527
Recomendado
Clasificación