EasyPoi實現多語言國際化

學而時習之,不亦說乎app

利用反射修改註解中的值

實現這個功能,主要是爲了解決EasyPoi中未實現多語言國際化的問題工具

EasyPoi經過簡單的導出工具類,配合實體類中增長的相應註解,實現數據的Excel導出功能。post

但如何實現表頭多語言國際化的功能,根據傳入的語言標識,來肯定表頭部分的文字是簡體中文,仍是繁體中文,仍是英文。spa

主要的思路是,利用反射原理,獲取註解中對應的值,並對該值進行修改。代理

以下簡單建立一個實體類,增長easypoi的@Excel註解,註解中name的值,便是導出的時候表頭的信息,如今以逗號分隔三種語言的文字,根據傳入語言標識,從新設置對應的文字。excel

@Data
public class StaOrgPost {

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

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

}









建立一個導出語言工具類,利用反射,從新賦予@Excel中name字段的值code

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.classget

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

這樣就簡單實現了easypoi導出表頭的國際化多語言功能it

相關文章
相關標籤/搜索