學而時習之,不亦說乎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<String, Object> memberValues = (Map<String, Object>) 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