Poi操作Excel导入导出数据

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";
    }
}
发布了31 篇原创文章 · 获赞 23 · 访问量 3816

猜你喜欢

转载自blog.csdn.net/leilei1366615/article/details/98841207