首先需要進行在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 }
注意要開啟存在這個類的包注解
至此導入功能頁完成了,