1引入pox文件在pom中引入就可以使用了
<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="80px">
邮件: <input name="email" class="easyui-textbox" style="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求情
@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名称
}
导入功能(支持验证)
<!--引入支持验证的包-->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>5.2.4.Final</version>
</dependency>
然后我们就额可以使用验证了但是需要使用
params.setNeedVerfiy(true);必须要使用
直接添加注解
@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="80%"
data-options="prompt:'选择一个文件...',buttonText: '选择文件'" />
<button class="easyui-linkbutton">导入</button>
</form>
在使用一个我们的请求
@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
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的操作