首先需要进行在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 }
注意要开启存在这个类的包注解
至此导入功能页完成了,