更好用的excel國際化多語言匯出
阿新 • • 發佈:2018-12-30
不知道大家在開發中有沒有遇到過『excel匯出』的需求,反正我最近寫了不少這種功能,剛開始利用poi,一行行的手動塞資料,生成excel,而且還有國際化需求,比如:標題欄有一列,使用者切換成"簡體中文"時, 匯出的標題應該是『使用者姓名』,而切換到"英文"時, 匯出的標題應該變成『Customer Name』(當然還有一些細節 ,比如英文環境,日期通常是 "月/日/年"格式,而中文格式是"年-月-日")
偶爾幹一兩次還行,經常這麼手動處理,純體力活就太枯燥了,在一個小夥伴的抱怨下,到網上搜索了下,看看有沒有更省力的通用解決方案,還真找到了,比如Excel4J (向原作者致敬,提供這麼方便的開源專案)。大致原理是基於註解,用法很簡單:
public class Student2 { @ExcelField(title = "學號", order = 1) private Long id; @ExcelField(title = "姓名", order = 2) private String name; ... }
打個註解就行,匯出一行搞定:
List<Student2> list = new ArrayList<>(); ... ExcelUtils.getInstance().exportObjects2Excel(list, Student2.class, true, "學生資訊", true, BASE_PATH + "student2.xlsx");
不過原作者並沒有提供國際化多語言的功能,於是順著這個思路,略為修改了一下,再定義一個多語言的註解:
/** * 國際化標題註解 * * @author 菩提樹下的楊過 */ @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.FIELD) public @interface I18nField { /** * 國際化標題欄(例如: ["zh-cn|學生","en-us|student"]) * * @return 國際化標題配置陣列 */ String[] titles(); }
匯出的地方去判斷有無這個註解就行(詳細大家可以看原始碼),修改後,原來的Student2改成:
@Data public class Student2 { @ExcelField(title = "學號", order = 1) @I18nField(titles = {"en-us|student id"}) private Long id; @ExcelField(title = "姓名", order = 2) @I18nField(titles = {"en-us|name"}) private String name; ... }
匯出時指定語言:
List<Student2> list = new ArrayList<>(); ... ExcelUtils.getInstance().exportObjects2Excel(list, Student2.class, true, "student", true, BASE_PATH + "student2-en.xlsx", "en-us"); ExcelUtils.getInstance().exportObjects2Excel(list, Student2.class, true, "學生資訊", true, BASE_PATH + "student2-cn.xlsx", "zh-cn");
效果如下:
中文匯出:
英文匯出: