1引入pox文件在pom中引入就可以使用了
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
<dependency> <groupId>cn.afterturn</groupId> <artifactId>easypoi-base</artifactId> <version>3.2.0</version> </dependency> <dependency> <groupId>cn.afterturn</groupId> <artifactId>easypoi-web</artifactId> <version>3.2.0</version> </dependency> <dependency> <groupId>cn.afterturn</groupId> <artifactId>easypoi-annotation</artifactId> <version>3.2.0</version> </dependency> <!--引入支持验证的包--> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-validator</artifactId> <version>5.2.4.Final</version> </dependency> <!-- 图片压缩功能 -->
2写入前台
<form id="searchForm" action="/employee/export" method="post"> <%--其中的name,id属性非常重要,我们可以通过很多种方式获得其中的值--%> 用户名: <input name="username" class="easyui-textbox" style="width:80px"> 邮件: <input name="email" class="easyui-textbox" style="width:80px"> <%--valueField 这个属性为前端传过来存入其中我们需要确定是否为id textField需要确定是否为text--%> 部门<input class="easyui-combobox" name="departmentId" data-options="valueField:'id',textField:'name',url:'/department/findAll'" /> <a href="#" data-method="search" class=" easyui-linkbutton" iconCls="icon-search">Search</a> <button class=" easyui-linkbutton" iconCls="icon-search">导出</button> </form>
发送一个请求/employee/export求情
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
@RequestMapping("/export") /*ModelMap是一个传过来的流里面携带数据 * 通过easypoi导出的时候需要找到他写的一个bean跳转 * 所以需要在appliction-mvc中配置一个他自带的类和一个bean视图解析器*/ public String export(EmployeeQuery query,ModelMap map, HttpServletRequest req){ List<Employee> employeeList = employeeService.queryAll(query); ExportParams params = new ExportParams("员工数据", "员工表", ExcelType.XSSF); //固定列 //params.setFreezeCol(2); //显示头像 String realPath = req.getServletContext().getRealPath(""); //遍历把我们对象中的路径变为真实路径 employeeList.forEach(e->{ e.setHeadImage(realPath+e.getHeadImage()); }); map.put(NormalExcelConstants.DATA_LIST, employeeList); // 数据集合 map.put(NormalExcelConstants.CLASS, Employee.class);//导出实体 map.put(NormalExcelConstants.PARAMS, params);//参数 map.put(NormalExcelConstants.FILE_NAME, "employee");//文件名称 return NormalExcelConstants.EASYPOI_EXCEL_VIEW;//View名称 }
导入功能(支持验证)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
<!--引入支持验证的包--> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-validator</artifactId> <version>5.2.4.Final</version> </dependency>
然后我们就额可以使用验证了但是需要使用
params.setNeedVerfiy(true);必须要使用
直接添加注解
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
@Excel(name = "用户名") @NotNull(message = "用户名不能空") private String username; private String password; @Excel(name = "邮件",width = 20) //@NotNull private String email; @Max(value = 100) @Min(value = 18) @Excel(name = "年龄") private Integer age; //图片 @Excel(name = "头像",type = 2,width = 20) private String headImage; //部门 @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "department_id")
一个自己导入的form
<form action="/import/employeeXlsx" method="post" enctype="multipart/form-data"> <input class="easyui-filebox" name="emFile" style="width:80%" data-options="prompt:'选择一个文件...',buttonText: '选择文件'" /> <button class="easyui-linkbutton">导入</button> </form>
在使用一个我们的请求
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
@RequestMapping("/employeeXlsx") public String employeeXlsx(MultipartFile emFile, HttpServletResponse response) throws Exception{ ImportParams params = new ImportParams(); //params.setTitleRows(1); params.setHeadRows(1);//从第二行开始读取 params.setNeedVerfiy(true); //设置验证支持必须设置 //设置我们自己的唯一性验证 params.setVerifyHandler(employeeExcelVerifyHandler); //设置一个验证处理器 //二.获取excel中的数据,封装成了一个结果对象(有很多东西) ExcelImportResult<Employee> result = ExcelImportUtil.importExcelMore( emFile.getInputStream(), Employee.class, params); //三.获到正确的数据,并把它们保存到数据库 List<Employee> list = result.getList(); list.forEach(e->{ //设置默认的密码 e.setPassword("123"); //通过关联对象把数据存进去 Department dept = departmentService.findDepartmentByName(e.getDepartment().getName()); e.setDepartment(dept); employeeService.save(e); }); //四.如果有错误,把错误数据返回到前台(让前台下载一个错误的excel) //4.1判断是否有错误 if(result.isVerfiyFail()){ //4.2拿到错误的文件薄 Workbook failWorkbook = result.getFailWorkbook(); //把这个文件导出 response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); //mime类型这个类型是2007版的 response.setHeader("Content-disposition", "attachment;filename=error.xlsx"); //告诉浏览下载的是一个附件,名字叫做error.xlsx response.setHeader("Pragma", "No-cache");//设置不要缓存 OutputStream ouputStream = response.getOutputStream(); failWorkbook.write(ouputStream); ouputStream.flush(); ouputStream.close(); }
这里我们需要使用一个自定义验证唯一性的类继承IExcelVerifyHandler
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
package cn.jiedada.aisell.common; import cn.afterturn.easypoi.excel.entity.result.ExcelVerifyHandlerResult; import cn.afterturn.easypoi.handler.inter.IExcelVerifyHandler; import cn.jiedada.aisell.domain.Employee; import cn.jiedada.aisell.service.IEmployeeService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; /** * 自定义验证(我们会在这里做唯一性的验证) */ @Component public class EmployeeExcelVerifyHandler implements IExcelVerifyHandler<Employee> { @Autowired private IEmployeeService employeeService; /** * * ExcelVerifyHandlerResult * suceess :代表验证成功还是失败(如果用户名重复,就代表失败) * msg:失败的原因 */ @Override public ExcelVerifyHandlerResult verifyHandler(Employee employee) { ExcelVerifyHandlerResult result = new ExcelVerifyHandlerResult(true); //如果根据用户名获取到用户,代表这个用户已经存在 Employee tempEmp = employeeService.findEmployeeByUsername(employee.getUsername()); if(tempEmp!=null){ result.setSuccess(false); result.setMsg("用户名重复"); } return result; } }
这样就完成了我们对Excel的操作