1. 程式人生 > >JeeSite的Excel匯入、匯出

JeeSite的Excel匯入、匯出

介紹:

對Apache POI 3.9的簡單封裝,實現Excel的匯出匯入功能。使用Annotation定義匯出匯入欄位。http://jeesite.com

優點:

  1. 簡單易用,支援大數量匯出,配置簡單,程式碼量少。
  2. 支援Excel 2003、2007、2010(xls、xlsx)格式。
  3. 支援簡單格式設定,對齊方式,排序等
  4. 可匯出字典型別資料,自定義資料欄位型別(例如:部門關聯物件,部門名稱與部門編號互轉)。
  5. 無需建立匯入模板,系統自動生成。

缺點:

  1. 格式單一,無法匯出格式比較複雜的表格。
  2. 不能使用模板進行匯入,匯出。

使用示例:

1、匯出實體物件中的annotation的定義(ExcelField說明見:5、

ExcelField定義說明):

  1. @Entity
  2. @Table(name = "sys_user")  
  3. publicclass User extends BaseEntity {  
  4.     private Long id;        // 編號
  5.     ...  
  6.     ...  
  7.     ...   
  8.     private List<Role> roleList = Lists.newArrayList(); // 擁有角色列表
  9.     @Id
  10.     @ExcelField(title="ID", type=1, align=2, sort=1)  
  11.     public Long getId() {  
  12.         return id;  
  13.     }  
  14.     @ManyToOne
  15.     @ExcelField(title="所屬區域", align=2, sort=10)  
  16.     public Area getArea() {  
  17.         return area;  
  18.     }  
  19.     @ManyToOne
  20.     @ExcelField(title="所屬部門", align=2, sort=20)  
  21.     public Office getOffice() {  
  22.         return office;  
  23.     }  
  24.     @Length(min=1, max=100)  
  25.     @ExcelField(title="姓名", align=2, sort=40)  
  26.     public String getName() {  
  27.         return name;  
  28.     }  
  29.     @Length(min=0, max=100)  
  30.     @ExcelField(title="使用者型別", align=2, sort=80, dictType="sys_user_type")  
  31.     public String getUserType() {  
  32.         return userType;  
  33.     }  
  34.     @ExcelField(title="建立時間", type=0, align=1, sort=90)  
  35.     public Date getCreateDate() {  
  36.         return createDate;  
  37.     }  
  38.     @ExcelField(title="最後登入日期", type=1, align=1, sort=110)  
  39.     public Date getLoginDate() {  
  40.         return loginDate;  
  41.     }  
  42.     @ManyToMany
  43.     @ExcelField(title="擁有角色", align=1, sort=800, fieldType=RoleListType.class)  
  44.     public List<Role> getRoleList() {  
  45.         return roleList;  
  46.     }  
  47. }  
 

 2、Excel匯出示例:

  1. public String exportFile(User user) {  
  2.     try {  
  3.         String fileName = "使用者資料"+DateUtils.getDate("yyyyMMddHHmmss")+".xlsx";   
  4.                 // 查詢資料
  5.         Page<User> page = systemService.findUser(new Page<User>(request, response, -1), user);   
  6.                 // 1:建立Excel匯出物件;2:設定資料;3:寫入輸出流;4:臨時資料銷燬
  7.         new ExportExcel("使用者資料", User.class)  
  8.                      .setDataList(page.getList())  
  9.                      .write(response, fileName)  
  10.                      .dispose();  
  11.         returnnull;  
  12.     } catch (Exception e) {  
  13.         addFlashMessage("匯出使用者失敗!失敗資訊:"+e.getMessage());  
  14.     }  
  15.     return"redirect:"+BaseController.ADMIN_PATH+"/sys/user/?repage";  
  16. }  

3、Excel 匯入示例:

  1. public String importFile(MultipartFile file) {  
  2.     try {  
  3.         int successNum = 0;  
  4.         int failureNum = 0;  
  5.         StringBuilder failureMsg = new StringBuilder();  
  6.                 // 建立匯入Excel物件
  7.         ImportExcel ei = new ImportExcel(file, 10);  
  8.                 // 獲取傳入Excel檔案的資料,根據傳入引數型別,自動轉換為物件
  9.         List<User> list = ei.getDataList(User.class);  
  10.                 // 遍歷資料,儲存資料
  11.         for (User user : list){  
  12.             try{  
  13.                 if ("true".equals(checkLoginName("", user.getLoginName()))){  
  14.                     user.setPassword(SystemService.entryptPassword("123456"));  
  15.                     BeanValidators.validateWithException(validator, user);  
  16.                     systemService.saveUser(user);  
  17.                     successNum++;  
  18.                 }else{  
  19.                     failureMsg.append("<br/>登入名 "+user.getLoginName()+" 已存在; ");  
  20.                     failureNum++;  
  21.                 }  
  22.             }catch(ConstraintViolationException ex){  
  23.                 failureMsg.append("<br/>登入名 "+user.getLoginName()+" 匯入失敗:");  
  24.                 List<String> messageList = BeanValidators.extractPropertyAndMessageAsList(ex, ": ");  
  25.                 for (String message : messageList){  
  26.                     failureMsg.append(message+"; ");  
  27.                     failureNum++;  
  28.                 }  
  29.             }catch (Exception ex) {  
  30.                 failureMsg.append("<br/>登入名 "+user.getLoginName()+" 匯入失敗:"+ex.getMessage());  
  31.             }  
  32.         }  
  33.         if (failureNum>0){  
  34.             failureMsg.insert(0",失敗 "+failureNum+" 條使用者,匯入資訊如下:");  
  35.         }  
  36.         addFlashMessage("已成功匯入 "+successNum+" 條使用者"+failureMsg);  
  37.     } catch (Exception e) {  
  38.         addFlashMessage("匯入使用者失敗!失敗資訊:"+e.getMessage());  
  39.     }  
  40.     return"redirect:"+BaseController.ADMIN_PATH+"/sys/user/?repage";  
  41. }  

4、Excel 匯入模板下載示例

  1. public String importFileTemplate() {  
  2.     try {  
  3.                 String fileName = "使用者資料匯入模板.xlsx";  
  4.         List<User> list = Lists.newArrayList(); list.add(UserUtils.getUser(true));  
  5.                 // 第三個引數設定為“2”表示輸出為匯入模板(1:匯出資料;2:匯入模板)
  6.         new ExportExcel("使用者資料", User.class2).setDataList(list).write(response, fileName).dispose();  
  7.         returnnull;  
  8.     } catch (Exception e) {  
  9.         addFlashMessage("匯出使用者失敗!失敗資訊:"+e.getMessage());  
  10.     }  
  11.     return"redirect:"+BaseController.ADMIN_PATH+"/sys/user/?repage";  
  12. }  

5、ExcelField定義說明:

  1. /** 
  2.  * Copyright &copy; 2012-2013 <a href="https://github.com/thinkgem/jeesite">JeeSite</a> All rights reserved. 
  3.  * 
  4.  * Licensed under the Apache License, Version 2.0 (the "License"); 
  5.  */
  6. package com.thinkgem.jeesite.common.utils.excel.annotation;  
  7. import java.lang.annotation.ElementType;  
  8. import java.lang.annotation.Retention;  
  9. import java.lang.annotation.RetentionPolicy;  
  10. import java.lang.annotation.Target;  
  11. /** 
  12.  * Excel註解定義 
  13.  * @author ThinkGem 
  14.  * @version 2013-03-10 
  15.  */
  16. @Target({ElementType.METHOD, ElementType.FIELD, ElementType.TYPE})  
  17. @Retention(RetentionPolicy.RUNTIME)  
  18. public@interface ExcelField {  
  19.     /** 
  20.      * 匯出欄位名(預設呼叫當前欄位的“get”方法,如指定匯出欄位為物件,請填寫“物件名.物件屬性”,例:“area.name”、“office.name”) 
  21.      */
  22.     String value() default"";  
  23.     /** 
  24.      * 匯出欄位標題 
  25.      */
  26.     String title();  
  27.     /** 
  28.      * 欄位型別(0:匯出匯入;1:僅匯出;2:僅匯入) 
  29.      */
  30.     int type() default0;  
  31.     /** 
  32.      * 匯出欄位對齊方式(0:自動;1:靠左;2:居中;3:靠右) 
  33.      */
  34.     int align() default0;  
  35.     /** 
  36.      * 匯出欄位欄位排序(升序) 
  37.      */
  38.     int sort() default0;  
  39.     /** 
  40.      * 如果是字典型別,請設定字典的type值 
  41.      */
  42.     String dictType() default"";  
  43.     /** 
  44.      * 反射型別 
  45.      */
  46.     Class<?> fieldType() default Class.class;  
  47. }