EasyPOI集成SpringMVC完成导入导出


首先需要进行在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 }

注意要开启存在这个类的包注解

 至此导入功能页完成了, 

 

 

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM