Poi操作Excel导入导出数据
一.导入依赖
使用easypoi
他是原生poi的又一层封装,在使用easypoi的时候要将之前引入的poi依赖删除掉
<!-- easypoi的支持 -->
<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>
<!--easypoi验证-->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>5.2.4.Final</version>
</dependency>
二.注解
给要操作导入导出的domain层对象中打上注解
注意:一定要加上getter,setter
@Entity
@Table(name="employee")
public class Employee extends BaseDomain{
@Excel(name="用户名")
@NotNull(message = "用户名不能为空哦!!") //导入时的验证 不为空
private String username;
private String password;
@Excel(name = "邮箱",width =20)
private String email;
@Excel(name = "年龄")
@Max(value = 80,message = "max 最大值不能超过15") //导入时的验证
private Integer age;
//头像
@Column(updatable = false)
//type为导出类型 1文本 2图片 3函数
@Excel(name = "头像",type = 2,width = 30,height = 30)
private String headImage;
/* @JsonIgnoreProperties(value={"hibernateLazyInitializer","handler","fieldHandler"}) 局部忽略属性*/
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name="department_id")
//表示一个继续深入导出的实体,但他没有太多的实际意义,只是告诉系统这个对象里面同样有导出的字段
@ExcelEntity
private Department department;
//多对多关系配置
@ManyToMany
//中间表名字 自己所在中间表的列名
另一个多方所在中间表的列名
@JoinTable(name="employee_role",
joinColumns = @JoinColumn(name="employee_id"),
inverseJoinColumns = @JoinColumn(name="role_id"))
private Set<Role> roles = new HashSet<>();
-----------深入导出的domain对象配置--------------------------------------
@Entity
@Table(name="department")
public class Department extends BaseDomain {
@Excel(name="部门")
private String name;
三.Mvc配置
上传功能需要在applicationContext-mvc.xml中配置文件上传解析器
<!--去扫描excel注解的必须配置-->
<context:component-scan base-package="cn.afterturn.easypoi.view"/>
<!--此配置 当你controller返回一个逻辑视图的时候,优先去找controller对外提供的接口,-->
<bean class="org.springframework.web.servlet.view.BeanNameViewResolver" p:order="1"/>
<!--配置视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/"/>
<property name="suffix" value=".jsp"/>
</bean>
<!--文件上传解析器-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="200000000"/>
</bean>
四.Controller层实现导入导出功能
(1)导出
//-----------------------------------excel操作导出数据
@RequestMapping("/outexcel")
public String download(HttpServletRequest request,ModelMap map,Employeequery query) {
List<Employee> list = service.findAllByQuery(query);
for (Employee employee : list) {
String rootPath = request.getServletContext().getRealPath("/");
employee.setHeadImage(rootPath+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, "employee");//文件名称
return NormalExcelConstants.EASYPOI_EXCEL_VIEW;//View名称
}
(2)导入
(1)设置自定义校验规则导入
需要的验证包
<!-- JSR 303 规范验证包 -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>5.2.4.Final</version>
</dependency>
自定义验证类完成后要交给spring管理
<context:component-scan base-package="cn.ydsat.aisell.common" />
自定义验证类
package cn.ydsat.aisell.common;
import cn.afterturn.easypoi.excel.entity.result.ExcelVerifyHandlerResult;
import cn.afterturn.easypoi.handler.inter.IExcelVerifyHandler;
import cn.ydsat.aisell.domain.Employee;
import cn.ydsat.aisell.service.IEmployeeService;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
//自定义excel校验名字是否重复 实现IExcelVerifyHandler接口
@Component
public class MyExcelverifiyName implements IExcelVerifyHandler<Employee>{
@Autowired
private IEmployeeService employeeService;
@Override
public ExcelVerifyHandlerResult verifyHandler(Employee employee) {
//设置默认验证为true
ExcelVerifyHandlerResult excelVerifyHandlerResult = new ExcelVerifyHandlerResult(true);
if (StringUtils.isNotBlank(employee.getUsername())){
Employee one = employeeService.findOneByname(employee.getUsername());
if (one != null) {
excelVerifyHandlerResult.setSuccess(false);
excelVerifyHandlerResult.setMsg("对不起,此员工已经存在,请不要重复提交");
}
}
return excelVerifyHandlerResult;
}
}
(2)导入功能完成
package cn.ydsat.aisell.web.Controller;
import cn.afterturn.easypoi.excel.ExcelImportUtil;
import cn.afterturn.easypoi.excel.entity.ImportParams;
import cn.afterturn.easypoi.excel.entity.result.ExcelImportResult;
import cn.afterturn.easypoi.handler.inter.IExcelVerifyHandler;
import cn.ydsat.aisell.domain.Department;
import cn.ydsat.aisell.domain.Employee;
import cn.ydsat.aisell.service.IDepartmentService;
import cn.ydsat.aisell.service.IEmployeeService;
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.ss.usermodel.Workbook;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
@Controller
@RequestMapping("/import")
public class ExcelController {
@Autowired
private IEmployeeService employeeService;
@Autowired
private IDepartmentService departmentService;
@Autowired
private IExcelVerifyHandler excelVerifyHandler;
//导入文件首页
@RequestMapping("/index")
public String index() {
return "import";
/* return "upload";*/
}
@RequestMapping("/inexcel")
public String upload(MultipartFile file,HttpServletResponse resp) throws Exception {
//导入的基本配置
ImportParams params = new ImportParams();
params.setHeadRows(1);//表头占一行
params.setTitleRows(1);//标题占一行
//代表导入这里是需要验证的(根据字段上的注解)
params.setNeedVerfiy(true); //需要验证 // need:需要 verfiy:核实,验证
//设及一个自定义校验 (自定义校验名字不可重复)
params.setVerifyHandler(excelVerifyHandler);
ExcelImportResult<Employee> result = ExcelImportUtil.importExcelMore(file.getInputStream(), Employee.class, params);//的导入功能
//导入成功的数据
List<Employee> list = result.getList(); //验证完后正确的数据
for (Employee employee : list) {
//判断前端传递的部门名称不为空
if(employee.getDepartment()!=null&& StringUtils.isNotBlank(employee.getDepartment().getName())){
//根据传入的部门名称进行查询,此时将查出来的信息赋值给传入对象,此时对象中的部门既有id又有部门了
Department department = departmentService.findDepartmentByName(employee.getDepartment().getName());
employee.setDepartment(department);
System.out.println(department);
}
//设置导入对象的数据信息中设定初始密码,设置名字密码一致,进行md5加密处理
employee.setPassword(employee.getUsername());
employeeService.save(employee);
System.out.println(employee);
}
//拿到导出失败的工作簿
Workbook failWorkbook = result.getFailWorkbook();
//如果有错误,就直接导出错误文件到前台
if (result.isVerfiyFail()) { //验证是否有失败的数据
ServletOutputStream fos = resp.getOutputStream();
resp.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); //mime类型
resp.setHeader("Content-disposition", "attachment;filename=error.xlsx");
result.getFailWorkbook().write(fos);
fos.close();
}
return "import";
}
}