zoukankan      html  css  js  c++  java
  • EasyPoi实现多语言国际化

    学而时习之,不亦说乎

    利用反射修改注解中的值

    实现这个功能,主要是为了解决EasyPoi中未实现多语言国际化的问题

    EasyPoi通过简单的导出工具类,配合实体类中增加的相应注解,实现数据的Excel导出功能。

    但如何实现表头多语言国际化的功能,根据传入的语言标识,来确定表头部分的文字是简体中文,还是繁体中文,还是英文。

    主要的思路是,利用反射原理,获取注解中对应的值,并对该值进行修改。

    如下简单创建一个实体类,增加easypoi的@Excel注解,注解中name的值,即是导出的时候表头的信息,现在以逗号分隔三种语言的文字,根据传入语言标识,重新设置对应的文字。

    @Data
    public class StaOrgPost {

        @Excel(name = "岗位名称,崗位名稱,Post Name", width = 40)
        private String postName;

        @Excel(name = "岗位人数,崗位人數,Post Count", width = 10)
        private Integer userCnt;

    }

    创建一个导出语言工具类,利用反射,重新赋予@Excel中name字段的值

    public class ExcelLangUtils {

        private static final int VALUE_SIZE = 3;

        private ExcelLangUtils() {
        }

        public static Class chooseLang(Class<?> pojoClass, String lang)
                throws NoSuchFieldException, IllegalAccessException {

            //获取实体类中所有字段
            Field[] fields = pojoClass.getDeclaredFields();

            for (Field field : fields) {
                // 获取字段上的注解
                Excel anoExcel = field.getAnnotation(Excel.class);
                if (anoExcel != null) {
                    // 获取代理处理器
                    InvocationHandler invocationHandler = Proxy.getInvocationHandler(anoExcel);
                    // 获取私有 memberValues 属性
                    Field f = invocationHandler.getClass().getDeclaredField("memberValues");
                    f.setAccessible(true);
                    // 获取实例的属性map
                    Map<StringObject> memberValues = (Map<StringObject>) f.get(invocationHandler);
                    // 获取属性值
                    String excelValue = (String) memberValues.get("name");

                    if (StringUtils.isNotBlank(excelValue)) {
                        //根据传入的语言标识,重新设置属性值
                        List<String> valueList = Arrays.asList(excelValue.split(","));
                        if (valueList.size() == VALUE_SIZE) {
                            if (RptConstants.LANGUAGE_ZH.equals(lang)) {
                                memberValues.put("name", valueList.get(0));
                            }
                            if (RptConstants.LANGUAGE_TW.equals(lang)) {
                                memberValues.put("name", valueList.get(1));
                            }
                            if (RptConstants.LANGUAGE_EN.equals(lang)) {
                                memberValues.put("name", valueList.get(2));
                            }
                        }
                    }
                }
            }
            return pojoClass;
        }
    }

    导出工具类中列用该工具类,重新处理入参StaOrgPost.class

    workbook = ExcelExportUtil.exportBigExcel(exportParams,    ExcelLangUtils.chooseLang(StaOrgPost.class, RptConstants.LANGUAGE_TW), staOrgPostList);

    这样就简单实现了easypoi导出表头的国际化多语言功能

  • 相关阅读:
    HTML网页背景图很长要有滚动条滑动
    CentOS 6.6下安装配置Tomcat环境
    centos安装jdk1.7.80的rpm包
    vmware12共享windows的文件给虚拟的linux
    Oracle jdk 历史版本官方下载地址及下载方法
    CentOS所有版本下载地址分享
    为什么说docker可以保护Nginx、Tomcat、Mysql呢?
    Linux下安装Nginx依赖包和Nginx的命令
    Nginx的启动、停止、重启
    nginx无法启动: libpcre.so.1/libpcre.so.0: cannot open shared object file解决办法
  • 原文地址:https://www.cnblogs.com/conswin/p/13154881.html
Copyright © 2011-2022 走看看