easyexcel définit le format des cellules, et réalise un contrôle précis du format de chaque colonne grâce à des annotations personnalisées

Dans le document officiel d'easyexcel, vous pouvez définir le format de cellule d'en-tête et le format de cellule du contenu. Il existe deux constructeurs dans la classe de stratégie de format de cellule.

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);
}

La différence entre les deux est la suivante: le premier constructeur définit les paramètres de format de cellule sur le contenu comme un ensemble, comme vous pouvez le voir dans le code source ci-dessous,

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

On peut voir que contentCellStyleList est la collection de formats de cellule de contenu dans le constructeur. La fonction de cette collection est en fait de changer le style d'Excel. Par exemple, si vous donnez 2 styles différents, alors 1,3,5 sera un style , 2,4,6 Se comportent dans un autre style. Par exemple, si vous donnez 3 styles différents, 1,4,7 sera un style, 2,5,8 sera un autre style et 3,6,9 sera un style, à travers la cellule. Le code setCellStyle (contentCellStyleList.get (relativeRowIndex% contentCellStyleList.size ())) est visible.

Grâce au code ci-dessus, nous avons constaté que bien qu'easyexcel définisse des styles pour les lignes, c'est-à-dire que dans la même ligne, différents styles de colonnes sont identiques, mais que chaque colonne d'une ligne exécutera la méthode setContentCellStyle de code ci-dessus, c'est là que nous pouvons réécrire , nous pouvons En réécrivant cette méthode, vous pouvez obtenir votre propre contrôle précis du format de cellule

La mise en œuvre est la suivante:

Grâce au débogage, on constate que le paramètre head dans cette méthode peut obtenir le nom du paramètre de la classe d'entité correspondant à la cellule, c'est-à-dire le nom du champ, comme indiqué dans le paramètre remarque ci-dessous

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

Maintenant que vous pouvez obtenir le nom du terrain, vous pouvez jouer librement.

La première version de mon implémentation consiste à avoir une chaîne spécifique dans le nom du champ, puis à définir un style distinct. Par exemple, si le nom du champ se termine par montant, le format de cellule que j'ai défini sera exécuté et le d'autres exécuteront le format de cellule de contenu commun.


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);
    }
}

L'une des plus grandes limitations de l'implémentation ci-dessus est que s'il existe différents formats dans la même ligne, son utilisation est particulièrement difficile. Il existe donc un deuxième moyen: via des annotations personnalisées.

Parce que nous pouvons obtenir le nom du champ, alors la réflexion sera pensée. Tant que la classe du nom du champ est donnée, le champ peut être obtenu. Obtenez les annotations sur le champ par réflexion et définissez le format de cellule du champ. Le code d'implémentation est le suivant:

@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;

En remplaçant la méthode setContentCellStyle, les annotations du champ sont lues et les cellules sont mises en forme. S'il n'y a pas d'annotations, le style général est adopté.

Un problème rencontré lors de l'utilisation d'en-têtes multilignes: https://github.com/alibaba/easyexcel/issues/990 , vous pouvez le vérifier pour éviter de vous mettre en vous-même

 

 

 

Je suppose que tu aimes

Origine blog.csdn.net/sinat_33472737/article/details/103660527
conseillé
Classement