易用宝项目记录day8-Excel的导入导出

1.EasyPOI集成SpringMVC完成导入导出

文档:http://easypoi.mydoc.io/

  1. 导包

    注意:今天使用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>
    

  2. 修改domian

    employee

    @Entity//表示一个由jpa管理的持久对象,对应数据库的一个表
    @Table(name = "employee")//table数据库的表名
    public class Employee extends BaseDomain {@Excel(name = "用户名")@NotNull(message = "用户名不能为空!")private String username;private String password;@Excel(name = "邮箱", width = 25)private String email;@Excel(name = "头像", type = 2, width = 10, height = 20)private String headImage;@Excel(name = "年龄")@Max(value = 100, message = "年龄不能超过100岁!")@Min(value = 0, message = "年龄不能小于0岁!")@Column(length = 11)private Integer age;@Column(length = 1)private Integer isdelete;@ManyToMany@JoinTable(name = "employee_role",joinColumns = @JoinColumn(name = "employee_id"),inverseJoinColumns = @JoinColumn(name = "role_id"))private List<Role> roles = new ArrayList<>();@ManyToOne(fetch = FetchType.LAZY)@JoinColumn(name = "department_id")private Department department;
    

    department

    @Entity//表示一个由jpa管理的持久对象,对应数据库的一个表
    @Table(name = "department")//table数据库的表名
    public class Department extends BaseDomain {@Excel(name = "部门名称")private String name;
    

###2.在MVC里扫描view

<!--扫描easypoi中的结果视图-->
<context:component-scan base-package="cn.afterturn.easypoi.view" />

3. 配置视图解析器

p:order=“1” 先找这个bean的解析,再找其它的

<bean class="org.springframework.web.servlet.view.BeanNameViewResolver" p:order="1" />

4. 前台传入相应的查询数据

 <%--查询条--%><form id="searchForm" action="/employee/download">用户名:<input name="username" class="easyui-textbox" style="width:80px">邮箱:<input name="email" class="easyui-textbox" style="width:80px">部门:<input id="cc" name="departmentId" class="easyui-combobox" panelHeight="auto"data-options="valueField:'id',textField:'name',url:'/util/dept'"/><a href="#" data-method="search" class="easyui-linkbutton" iconCls="icon-search">查询</a><button type="submit" class="easyui-linkbutton" iconCls="icon-search">导出Excel</button></form>

5. 后台接收参数进行导出

注意:头像路径必需是真实路径

 //下载Excel文件@RequestMapping("/download")public String download(ModelMap map, HttpServletRequest request, EmployeeQuery query) {List<Employee> list = employeeService.findByQuery(query);//获得头像真实路径String realPath = request.getSession().getServletContext().getRealPath("");list.forEach(e -> {e.setHeadImage(realPath + e.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");//View名称return NormalExcelConstants.EASYPOI_EXCEL_VIEW;}

导入功能

1. 访问页面

ImportController

@Controller
@RequestMapping("/import")
public class ImportController {@Autowiredprivate IEmployeeService employeeService;@Autowiredprivate IDepartmentService departmentService;@Autowiredprivate EmployeeExcelVerifyHandler excelVerifyHandler;@RequestMapping("/index")public String index() {return "import";}

import.jsp

<form method="post" action="/import/empxlsx" enctype="multipart/form-data"><input class="easyui-filebox" name="empFile"data-options="prompt:'请选择一个excel文件',accept:'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.ms-excel',validType:'isExcel'"style="width:80%">&emsp;<button id="sub" type="submit" disabled="disabled">导入Excel</button>
</form><!-- 注意:上传需要加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>

2. 导入实现

上传解析器一定要有名字:multipartResolver 必需加一个默认密码

员工对应的部门必需有id(根据名称拿到对应的部门)

 @RequestMapping("/empxlsx")public String empxlsx(MultipartFile empFile, HttpServletResponse response) throws Exception {/*System.out.println(empFile);System.out.println(empFile.getName());  //empFile:上传控件名称System.out.println(empFile.getOriginalFilename()); //emp.xlsx:上传的文件名称System.out.println(empFile.getSize()); //文件大小System.out.println(empFile.getContentType());//文件的memi类型*/InputStream inputStream = empFile.getInputStream();//准备一些导入的参数ImportParams params = new ImportParams();//要求导入的时候做验证params.setNeedVerfiy(true);//设置自定义的验证处理器params.setVerifyHandler(excelVerifyHandler);//params.setTitleRows(1);//params.setHeadRows(1);//把上传的excel文件中的数据变成Employee数据ExcelImportResult<Employee> result = ExcelImportUtil.importExcelMore(inputStream,Employee.class, params);//获取到引入成功的数据List<Employee> list = result.getList();//把员工进行保存list.forEach(e -> {//设置一个默认密码e.setPassword("123456");//设置默认为不删除e.setIsdelete(1);//根据名称到数据库中拿到部门Department department = e.getDepartment();if (department != null) {Department dbDept = departmentService.findByName(department.getName());e.setDepartment(dbDept);}employeeService.save(e);System.out.println(e);});return "import";}

导入验证

使用的是JSR 303 规范

###1.导入验证包

<dependency><groupId>org.hibernate</groupId><artifactId>hibernate-validator</artifactId><version>5.2.4.Final</version>
</dependency>

###2.加上验证的注解

  1. employee

    @Entity//表示一个由jpa管理的持久对象,对应数据库的一个表
    @Table(name = "employee")//table数据库的表名
    public class Employee extends BaseDomain {@Excel(name = "用户名")@NotNull(message = "用户名不能为空!")private String username;private String password;@Excel(name = "邮箱", width = 25)private String email;@Excel(name = "头像", type = 2, width = 10, height = 20)private String headImage;@Excel(name = "年龄")@Max(value = 100, message = "年龄不能超过100岁!")@Min(value = 0, message = "年龄不能小于0岁!")@Column(length = 11)private Integer age;@Column(length = 1)private Integer isdelete;@ManyToMany@JoinTable(name = "employee_role",joinColumns = @JoinColumn(name = "employee_id"),inverseJoinColumns = @JoinColumn(name = "role_id"))private List<Role> roles = new ArrayList<>();@ManyToOne(fetch = FetchType.LAZY)@JoinColumn(name = "department_id")private Department department;
    

###3. 加上自定义注解

这个类型是需要Spring扫描

@Component
public class EmployeeExcelVerifyHandler implements IExcelVerifyHandler<Employee> {@Autowiredprivate IEmployeeService employeeService;@Overridepublic ExcelVerifyHandlerResult verifyHandler(Employee employee) {//如果用户存在,我们就返回一个false//  checkUsername:这个用户名是否可以使用if(!employeeService.checkUsername(employee.getUsername())){ExcelVerifyHandlerResult result = new ExcelVerifyHandlerResult(false);result.setMsg("用户名已经存在!");return result;}return  new ExcelVerifyHandlerResult(true);}
}

###4.导入功能修改

要验证,必需设置 params.setNeedVerfiy(true);

自定义验证:params.setVerifyHandler(employeeExcelVerifyHandler);

result.getList(); 拿到所有通过验证的数据 result.getFailList():拿到所有错误的数据 result.getFailWorkbook();拿到错误的文本

@Autowired
private EmployeeExcelVerifyHandler employeeExcelVerifyHandler;
...
@RequestMapping("/empXlsx")
public String empXlsx(MultipartFile empFile, HttpServletResponse response) throws Exception{//准备一些导入的参数ImportParams params = new ImportParams();params.setTitleRows(1);params.setHeadRows(1);params.setNeedVerfiy(true); //需要做验证//设置验证处理器params.setVerifyHandler(employeeExcelVerifyHandler);//把上传的excel文件中的数据变成EmployeeExcelImportResult<Employee> result = ExcelImportUtil.importExcelMore(empFile.getInputStream(),Employee.class, params);//拿到相应的值List<Employee> list = result.getList();//把员工进行保存list.forEach(e -> {//设置一个默认密码e.setPassword("123456");//根据名称到数据库中拿到部门Department department = e.getDepartment();if(department!=null){Department dbDept =  departmentService.findByName(department.getName());e.setDepartment(dbDept);}employeeService.save(e);});//拿到错误的值
//        List<Employee> errList = result.getFailList();
//        errList.forEach(e -> System.out.println("错误的:"+e));//有错误的情况进行导出if(result.isVerfiyFail()){//拿到错误的文件Workbook failWorkbook = 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();failWorkbook.write(ouputStream);ouputStream.flush();ouputStream.close();}return "import";
}

易用宝项目记录day8-Excel的导入导出相关推荐

  1. Excel表格导入导出功能实现

    ## 01.员工管理-Excel导入功能介绍 ### 目标 在前面员工的添加是一个一个进行的,如果一次性添加多个员工信息,这时候就会很繁琐 因此需要我们开发一个批量导入的功能,将用户的信息存储到 ex ...

  2. 蓄力-利用POI进行excel的导入导出(包含图片)

    这里写自定义目录标题 利用POI进行excel的导入导出 引入的jar包 excel导入 主方法: 将excel里面的图片转成数据 xls格式 xlsx格式 将图片数据转成字节流的方式传输到FTP服务 ...

  3. EasyPoi实现excel文件导入导出

    EasyPoi学习实践 1 简介 easypoi功能如同名字easy,主打的功能就是容易,让一个没见接触过poi的人员 就可以方便的写出Excel导出,Excel模板导出,Excel导入,Word模板 ...

  4. EasyExcel实现Excel文件导入导出

    1 EasyExcel简介 EasyExcel是一个基于Java的简单.省内存的读写Excel的开源项目.在尽可能节约内存的情况下支持读写百M的Excel. github地址: https://git ...

  5. excel winform 导入 导出_强大的 Excel 导入导出工具 hutool

    " 最近项目上需要用到 Excel 的导入导出功能,想着之前使用的都有点麻烦,所以结合多方资料,终于找到了这个还算不错的 Excel 处理工具,一起来看" 今日安利好物名为 Hut ...

  6. java自定义注解实现excel数据导入导出,设置单元格数据验证与生成省市区多列联动效果

    本文通过自定义注解实现excel数据导入导出.以及设置excel文件中列数据验证,即用户在excel文件中输入数据时就可以对数据格式验证是否符合,节省了程序中过多的数据验证操作,注解还额外提供了一系列 ...

  7. sqlserver 与access,excel互相导入导出代码

    sqlserver 与access,excel互相导入导出代码 [转]http://hi.baidu.com/jiangfeng1225/blog/item/62c0e6088b30fbdb63d98 ...

  8. [Java中实现Excel表导入导出]基于easy-poi和EasyExcel两种方式实现

    第一种:基于easy-poi实现Excel导入导出 1.导出Excel表格 第一步:在pom文件中导入依赖 <!--基于easy-poi实现Excel导入导出--><dependen ...

  9. 手摸手教学-利用原生POI对excel的导入导出以及阿里的easyexcel的基本操作

    文章目录 原生POI对excel的导入导出以及阿里的easyexcel的基本操作 首先是最原始的POI操作excel 其次是POI操作excel对数据库的导入导出 最后是阿里的easyexcel的简单 ...

  10. 基于delphi的excel数据导入导出

    因为淘宝客户的一个小需求,写了一个"基于delphi 7的excel数据导入导出"小工具.为了抛砖引玉,将这个小工具分享出来.希望对初学者和用得到的朋友有点点小小的帮助.oracl ...

最新文章

  1. OpenCV-Python:K值聚类
  2. 自学python三个月能赚钱吗-培训三个月拿“高薪”?起底人工智能“速成班”忽悠大法...
  3. DYNP_VALUES_READ
  4. 邊做邊學 Internet Explorer 8:瞭解 IE8 相容性技術
  5. JDK自带监控工具 jps、jinfo、jstat、jmap、jconsole
  6. springMVC 控制层添加异步线程
  7. 查找算法:折半查找算法实现及分析
  8. 彻底理解jdbc为什么用反射创建驱动程序对象
  9. I2C是什么,什么类型设备支持I2C,为什么要使用它?
  10. js模拟java的spring
  11. 安卓能硬改的手机机型_这款iPhone手机专属特效AR相机,我真的爱了
  12. 大数据应用之Windows平台Hbase客户端Eclipse开发环境搭建
  13. 模式识别人工神经网络BP算法
  14. word里画的流程图怎么全选_怎么用word画流程图
  15. 有隐藏分区如何激活win7旗舰版
  16. 三角函数的倍角、半角与降幂公式
  17. NTFS文件系统文件删除对比
  18. openwrt安装ipk报错“incompatible with the architectures configured”
  19. 机器人社社长事迹_社团先进个人事迹材料
  20. 用python3实现HDU爬虫(后续可能更新VJ)2016.11.4更新

热门文章

  1. CCS软件的基础使用(以点灯为例)
  2. 以4%参数量比肩GPT-3!Deepmind 发布检索型 LM,或将成为 LM 发展新趋势!?
  3. 超详细的springBoot学习教程
  4. webQQ协议——获取信息
  5. LordPE v1.4 by yoda
  6. html文件做屏保win10,win10怎么自己添加动态屏保
  7. windowsXP sp3 升级包
  8. 使用Idea进行Junit单元测试
  9. 处理minidump文件用到的“工具”的分享
  10. 前端面试题总汇、常考、笔试题等