i18n 处理excle导出列名国际化问题

本文介绍了如何在Spring Boot项目中使用@Excel注解实现字段值的国际化,包括单字段和多字段值的动态设置,以及如何通过反射操作获取和修改Excel注解实例的成员值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

@Excel(name = “中文”)

public class I18nTest {

    @Test
    public void testSetExcelAnnotationValue() {
        setExcelAnnotationValue(OperationLogExcelVo.class, "operatorName", "name");
    }

    @Test
    public void testSetExcelAnnotationValues() {
        LanguageUtils.setExcelAnnotationValues(OperationLogExcelVo.class, "name");
    }

    public static <T> void setExcelAnnotationValue(Class<T> ExcelClass, String fieldName, String key) {
        try {
            //获取OperationLogExcelVo的fieldName字段
            Field field = ExcelClass.getDeclaredField(fieldName);
            //获取val字段上的Excel注解实例
            Excel excel = field.getAnnotation(Excel.class);
            //获取 excel 这个代理实例所持有的 InvocationHandler
            InvocationHandler invocationHandler = Proxy.getInvocationHandler(excel);
            // 获取 AnnotationInvocationHandler 的 memberValues 字段
            Field hField = invocationHandler.getClass().getDeclaredField("memberValues");
            // 因为这个字段事 private final 修饰,所以要打开权限
            hField.setAccessible(true);
            // 获取 memberValues
            Map memberValues = (Map) hField.get(invocationHandler);
            String value = Optional.ofNullable(memberValues.get(key))
                .map(Object::toString)
                .map(LanguageUtils::getMessage)
                .orElse(memberValues.get(key).toString());
            memberValues.put(key, value);
            System.out.println(excel.name());
        } catch (IllegalAccessException | NoSuchFieldException e) {
            e.printStackTrace();
        }
    }

    public static <T> void setExcelAnnotationValues(Class<T> excelClass, String key) {
        //获取OperationLogExcelVo的fieldName字段
        Field[] declaredFields = excelClass.getDeclaredFields();
        //获取val字段上的Excel注解实例
        Arrays.stream(declaredFields)
            .filter(field -> !field.getName().equalsIgnoreCase("serialVersionUID"))
            .map(field -> field.getAnnotation(Excel.class))
            .forEach(excel -> {
                //获取 excel 这个代理实例所持有的 InvocationHandler
                InvocationHandler invocationHandler = Proxy.getInvocationHandler(excel);
                // 获取 AnnotationInvocationHandler 的 memberValues 字段
                try {
                    Field hField = invocationHandler.getClass().getDeclaredField("memberValues");
                    // 因为这个字段事 private final 修饰,所以要打开权限
                    hField.setAccessible(true);
                    // 获取 memberValues
                    Map memberValues = (Map) hField.get(invocationHandler);
                    String value = Optional.ofNullable(memberValues.get(key))
                        .map(Object::toString)
                        .map(LanguageUtils::getMessage)
                        .orElse(memberValues.get(key).toString());
                    memberValues.put(key, value);
                } catch (NoSuchFieldException | IllegalAccessException e) {
                    e.printStackTrace();
                }
            });
    }
}

public class OperationLogExcelVo extends LogicalDeleteEntity {

    public OperationLogExcelVo() {
        LanguageUtils.setExcelAnnotationValuesDef(this.getClass());
    }

    /**
     * The constant serialVersionUID.
     */
    private static final long serialVersionUID = 8122843270286604440L;

    /**
     * The Operator name.
     */
    @Excel(name = "yhmdlm", orderNum = "1", width = 25)
    private String operatorName;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值