1.前台的from表单必须是post请求,并有enctype="multipart/form-data"属性,
2.input标签的类型为file,name必须和后台接收的MultipartFile变量名一致
3.设置初始密码
4.excel中有对应的关联对象名称时(如部门名称)无法直接导入到Employee中,需要通过部门的名称从数据库中查询到相应的部门对象,然后放入到员工对象中
5.获得部门对象从repository层开始操作数据库
6.在domain中设置验证:用户名不能为空,email不能为空,age的最大值和最小值->需要导入JSR 303 规范验证包
7.验证导入对象的用户名不能在数据库中存在
1)配置自定义的视图解析器
2)自定义验证类实现IExcelVerifyHandler接口(excel验证处理器)
3)验证参数时设置验证处理器:params.setVerifyHandler(employeeIExcelVerifyHandler);
org.hibernate
hibernate-validator
5.2.4.Final
@Excel(name = "用户名")
@NotNull(message = "导入员工的用户名必须存在")
private String username;
@Excel(name = "年龄")
@Max(value = 80,message = "导入员工的年龄不能超过65岁")
@Min(value = 20,message = "导入员工的年龄不能低于20岁")
private Integer age;
@Override
public Boolean checkUserName(String username) {
//return !(employeeRepository.getCountByUsername(username)>0);
return employeeRepository.getCountByUsername(username) > 0 ? false : true;
}
2.自定义类实现IExcelVerifyHandler接口
打上@Component注解,Controller层才能注入EmployeeIExcelVerifyHandler
@Component
public class EmployeeIExcelVerifyHandler implements IExcelVerifyHandler {
@Autowired
IEmployeeService employeeService;
@Override
public ExcelVerifyHandlerResult verifyHandler(Employee employee) {
//设置初始化的验证值为true
ExcelVerifyHandlerResult excelVerifyHandlerResult = new ExcelVerifyHandlerResult(true);
if (!employeeService.checkUsername(employee.getUsername())){
excelVerifyHandlerResult.setSuccess(false);
excelVerifyHandlerResult.setMsg("此用户名已经存在");
}
return excelVerifyHandlerResult;
}
}
//通过部门的名称从数据库中获得相应的部门对象
Department findByName(String deptName);
Service层及其实现
@Autowired
private DepartmentRepository departmentRepository;
@Override
public Department findByName(String deptName) {
return departmentRepository.findByName(deptName);
}
@Controller
@RequestMapping("/import")
public class ImportController {
@Autowired
private IEmployeeService employeeService;
@Autowired
private IDepartmentService departmentService;
@Autowired
private EmployeeIExcelVerifyHandler employeeIExcelVerifyHandler;
public String empImport(MultipartFile empFile, HttpServletResponse response) throws Exception {
//获得输入的流
InputStream inputStream = empFile.getInputStream();
//获得基本的参数配置
ImportParams params = new ImportParams();
//设置开启参数的验证
params.setNeedVerfiy(true);
//参数开启自定义的验证
params.setVerifyHandler(employeeIExcelVerifyHandler);
//得到excel中employee对象的集合
ExcelImportResult result = ExcelImportUtil.importExcelMore(inputStream, Employee.class, params);
//getList:获取到引入成功的数据,getFailList:获取到引入失败的数据
List list = result.getList();
list.forEach(e -> {
e.setPassword("123");//设置初始密码
//excel中的部门名称查出部门对象,放入到员工对象中,在持久化保存到数据库
if (e.getDepartment() != null) {
Department dept = departmentService.findByName(e.getDepartment().getName());
e.setDepartment(dept);
}
employeeService.save(e);
});
System.out.println("----------------------------------------------");
//如果导入失败的文件应该从前台导出excel,并告知失败的原因
if (result.isVerfiyFail()) {
//错误的文件
Workbook wb = result.getFailWorkbook();
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); //mime类型
response.setHeader("Content-disposition", "attachment;filename=error.xlsx");
response.setHeader("Pragma", "No-cache");//设置不要缓存
OutputStream ouputStream = response.getOutputStream();
wb.write(ouputStream);
ouputStream.flush();
ouputStream.close();
}
return "import";
}