zoukankan      html  css  js  c++  java
  • Java操作ExcelPOI

    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>
        <!-- 图片压缩功能 -->
    View Code

     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名称
        }
    View Code

     导入功能(支持验证)

    <!--引入支持验证的包-->
        <dependency>
          <groupId>org.hibernate</groupId>
          <artifactId>hibernate-validator</artifactId>
          <version>5.2.4.Final</version>
        </dependency>
    View Code

    然后我们就额可以使用验证了但是需要使用

    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")
    View Code

    一个自己导入的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();
            }
    View Code

    这里我们需要使用一个自定义验证唯一性的类继承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;
        }
    }
    View Code

    这样就完成了我们对Excel的操作

  • 相关阅读:
    PHP中利用jQuery操作json格式数据,实现$_POST的数据传输和接收
    如何快速掌握一门技术【婴儿最强学习回头看一看】
    显示桌面.scf
    注册表数据库
    win10home_fixgpedit.msc
    Eclipse 中 jetty 调试模式(debug)正常启动无法访问;非调试模式正常
    svn中的与资源库同步操作 讲解
    windows下二进制mysql的卸载以及安装教程
    mysql服务正在启动或停止中请稍后片刻再试一次,服务强制杀死的方法
    Eclipse中git检出、更新、提交、合并分支、以及解决冲突
  • 原文地址:https://www.cnblogs.com/xiaoruirui/p/11735213.html
Copyright © 2011-2022 走看看