EasyPOI集成SpringMVC完成導入導出


首先需要進行在pom.xml中的導入poi的支持包

 1 <!-- easypoi的支持 -->
 2 <dependency>
 3   <groupId>cn.afterturn</groupId>
 4   <artifactId>easypoi-base</artifactId>
 5   <version>3.2.0</version>
 6 </dependency>
 7 <dependency>
 8   <groupId>cn.afterturn</groupId>
 9   <artifactId>easypoi-web</artifactId>
10   <version>3.2.0</version>
11 </dependency>
12 <dependency>
13   <groupId>cn.afterturn</groupId>
14   <artifactId>easypoi-annotation</artifactId>
15   <version>3.2.0</version>
16 </dependency>

准備domain對象,在domain對象中通過配置注解的方式,確定需要導入的屬性

 1  @Excel(name = "用戶名")
 2     @NotNull
 3     private String username;
 4 
 5     private  String password;
 6 
 7     @Excel(name = "郵箱")
 8     private String email;
 9 
10     @Excel(name = "年齡")
11     @Max(value = 80,message = "年齡不能大於80")
12     private Integer age;
13         //tpte=2表示圖片形式
14     @Excel(name = "頭像",type = 2,height = 30)
15     private String headImage;//頭像
16 
17     @ManyToMany
18     @JoinTable(name = "employee_role",joinColumns = @JoinColumn(name = "employee_id"),
19     inverseJoinColumns = @JoinColumn(name = "role_id"))
20     private List<Role> roles= new ArrayList<>();
21 
22     public String getPassword() {
23         return password;
24     }
25 
26     @ManyToOne()
27     @JoinColumn(name = "department_id")
28     //因為是多對以的關系,所以需要用穿透的方式拿去
29     @ExcelEntity
30     private Department department;

掃描view(在applicationContext-mvc.xml中)

<context:component-scan base-package="cn.afterturn.easypoi.view" />

配置視圖解析器

p:order="0" 先找這個bean的解析,再找其它的

<bean class="org.springframework.web.servlet.view.BeanNameViewResolver" p:order="0" />

前台傳入相應的查詢數據

<form id="searchForm" method="post" action="/employee/export">
    用戶名: <input name="username" class="easyui-textbox" style="width:80px">
    郵件: <input name="email" class="easyui-textbox" style="width:80px">
    部門:
    <input name="departmentId"  class="easyui-combobox"
           data-options="panelHeight:'auto',valueField:'id',textField:'name',url:'/util/deptlist'" />
    <a href="javascript:;" data-method="search" class="easyui-linkbutton" iconCls="icon-search">查詢</a>
    <!-- button不寫type,它就是提交 -->
    <button class="easyui-linkbutton" iconCls="icon-redo">導出</button>
</form>

后台接收參數進行導出

//導入功能
@RequestMapping("/export")
public String download(ModelMap map, EmployeeQuery query, HttpServletRequest req) {
  //findByQuery通過這個方法查詢出所有的數據
List<Employee> list = iEmployeeService.findByQuery(query);
String realPath = req.getServletContext().getRealPath("");
      
list.forEach(employee -> {
      //拼接圖片的路徑,解決導不出圖片的問題
employee.setHeadImage(realPath+employee.getHeadImage());
});
    //文件名 表頭 導出的類型
ExportParams params = new ExportParams("員工管理", "員工表", ExcelType.XSSF);
// params.setFreezeCol(2);//凍結
map.put(NormalExcelConstants.DATA_LIST, list); // 數據集合(導出的數據)
map.put(NormalExcelConstants.CLASS, Employee.class);//導出實體
map.put(NormalExcelConstants.PARAMS, params);//參數
map.put(NormalExcelConstants.FILE_NAME, "員工表");//文件名稱
//return "easypoiExcelView"; /WEB-INF/views/easypoiExcelView.jsp
return NormalExcelConstants.EASYPOI_EXCEL_VIEW;//View名稱
}

至此就完成了他的導出功能了

完成導入功能

首先准備一個jsp頁面

<!-- 注意:上傳需要加enctype -->
<form method="post" action="/import/empXlsx" enctype="multipart/form-data">
    <input class="easyui-filebox" name="empFile" data-options="prompt:'選擇一個excel文件..'" style="width:80%">
    <button class="easyui-linkbutton">導入</button>
</form>

導入驗證包,做驗證時使用

 
<dependency>
  <groupId>org.hibernate</groupId>
  <artifactId>hibernate-validator</artifactId>
  <version>5.2.4.Final</version>
</dependency>

在domain類中加入驗證注解

 1  @Excel(name = "用戶名")
 2     @NotNull//用戶名不能為空
 3     private String username;
 4 
 5     private  String password;
 6 
 7     @Excel(name = "郵箱")
 8     private String email;
 9 
10     @Excel(name = "年齡")
11     @Max(value = 80,message = "年齡不能大於80")//年齡最大不能大於80
12     private Integer age;

定義一個類用來接收參數完成導入操作

 1     @RequestMapping("/employeeXlsx")
 2     public  String load(MultipartFile empFile, HttpServletResponse resp) throws  Exception{
 3         //設置導入的參數
 4         ImportParams params = new ImportParams();
 5         //去掉第一行表頭
 6         params.setHeadRows(1);
 7 
 8         //開啟驗證
 9         params.setNeedVerfiy(true);
10 
11         //加入自定義驗證
12         params.setVerifyHandler(employeeCustomValidation);
13 
14 
15 
16         ExcelImportResult<Employee> result = ExcelImportUtil.importExcelMore(empFile.getInputStream(), Employee.class, params);
17         //拿到正確數據,將其保存到數據庫
18         List<Employee> list = result.getList();
19         //解決存不到部門的問題,通過名字查詢對應的部門
20         list.forEach(e ->{
21             String name = e.getDepartment().getName();
22             Department byName = departmentService.findByName(name);
23             //設置他的部門和初始密碼
24             e.setDepartment(byName);
25             e.setPassword("123");
26             employeeService.save(e);
27         });
28         //將錯誤的數據返回導出
29         Workbook workbook = result.getFailWorkbook();
30         //設置返回數據的格式,這個格式表示通過xlsx返回
31         resp.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
32         //attachment:不要用瀏覽器打開(下載)
33         resp.setHeader("Content-disposition", "attachment;filename=empFail.xlsx");
34         resp.setHeader("Pragma", "No-cache");//設置不要緩存
35         OutputStream ouputStream = resp.getOutputStream();
36         workbook.write(ouputStream);
37         ouputStream.flush();
38         ouputStream.close();
39         return "import";
40 
41     }

最后完成自定義驗證 驗證用戶名是否重復

 

 1 //自定義驗證,實現IExcelVerifyHandler方法,然后配置文件掃描這個包
 2 @Component
 3 public class EmployeeCustomValidation implements IExcelVerifyHandler<Employee> {
 4 
 5 @Autowired
 6 private IEmployeeService employeeService;
 7     @Override
 8     public ExcelVerifyHandlerResult verifyHandler(Employee employee) {
 9         //checkName判斷是否又這個用戶名,如果存在就返回false否者就是true
10         boolean b = employeeService.checkName(employee.getUsername());
11         if (b){
12             return new  ExcelVerifyHandlerResult(true);
13         }
14         return new ExcelVerifyHandlerResult(false,"用戶名已經存在,請核實");
15     }
16 }

注意要開啟存在這個類的包注解

 至此導入功能頁完成了, 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM