Easypoi导入导出快速上手

2020-08-17 689 0

1. 介绍

Easypoi的目标不是替代poi,而是让一个不懂导入导出的快速使用poi完成Excel和word的各种操作,而不是看很多api才可以完成这样工作

独特的功能

  • 基于注解的导入导出,修改注解就可以修改Excel
  • 支持常用的样式自定义
  • 基于map可以灵活定义的表头字段
  • 支持一堆多的导出,导入
  • 支持模板的导出,一些常见的标签,自定义标签
  • 支持HTML/Excel转换,如果模板还不能满足用户的变态需求,请用这个功能
  • 支持word的导出,支持图片,Excel

http://doc.wupaas.com/docs/easypoi/

2. 引入依赖

<dependency>
    <groupId>cn.afterturn</groupId>
    <artifactId>easypoi-spring-boot-starter</artifactId>
    <version>4.2.0</version>
</dependency>

3. 导入

以下针对Controller的excel导入示例进行说明

3.1 导入和校验数据

  • 定义实体映射excel导入字段和校验规则
/**
 * 导入学生实体
 * 
 * @author hushow
 * @date 2020年8月13日 下午1:04:01
 */
@Getter
@Setter
public class StudentDTO implements IExcelModel {

    @Excel(name = "学生名称")
    @NotNull(message = "不能为空")
    private String name;

    @Excel(name = "班级编号")
    @Pattern(regexp = "^-?[1-9]\\d*$", message = "格式不正确")
    private String no;

    @Excel(name = "年级")
    @NotNull(message = "不能为空")
    private String grade;

    @Excel(name = "邮箱", width = 25)
    @Pattern(regexp = "^[A-Za-z0-9]+([_\\.][A-Za-z0-9]+)"
        + "*@([A-Za-z0-9\\-]+\\.)+[A-Za-z]{2,6}$", message = "格式不正确")
    private String email;

    @Excel(name = "班主任姓名")
    private String teacherName;

    @Excel(name = "班主任手机号")
    @Pattern(regexp = "^[1]([3-9])[0-9]{9}$", message = "格式不正确")
    private String teacherPhone;

    private String errorMsg;
}

关键说明:
验证失败,如果需要拿到每一行的验证errorMsg信息,则导入实体需要实现IExcelModel接口

  • 导入示例代码
@PostMapping("/importVerify")
@ResponseBody
public List<StudentDTO> importVerify(ServletContext servletContext, 
    @RequestParam("myfile") MultipartFile myfile) {

    try {

        ImportParams params = new ImportParams();
        // 设置需要验证数据
        params.setNeedVerify(true);
        ExcelImportResult<StudentDTO> result =
            ExcelImportUtil.importExcelMore(myfile.getInputStream(), StudentDTO.class, params);

        // 处理校验错误数据
        if (!CollectionUtils.isEmpty(result.getFailList())) {
            log.debug("开始错误数据================================");

            String failName = "fail_" + myfile.getName();
            File tmpDir = WebUtils.getTempDir(servletContext);
            File failFile = new File(tmpDir, failName);
            FileOutputStream fos = new FileOutputStream(failFile);
            result.getFailWorkbook().write(fos);
            fos.close();

            log.debug("错误文件已写入:" + failFile.getAbsolutePath());

            // 失败的数据
            for (int i = 0; i < result.getFailList().size(); i++) {
                log.debug(ReflectionToStringBuilder.toString(result.getFailList().get(i)));
            }
            log.debug("结束错误数据================================");
        }

        log.debug("开始处理成功数据================================");
        for (int i = 0; i < result.getList().size(); i++) {
            log.debug(ReflectionToStringBuilder.toString(result.getList().get(i)));
        }
        log.debug("结束处理成功数据================================");

        return result.getList();
    } catch (Exception e) {
        log.error(e.getMessage(), e);
        // 此处建议抛出具体的业务异常封装
        throw new RuntimeException("导入数据异常" + e.getMessage(), e);
    }
}
  • 测试效果

    导入源始数据:

    file
    导入失败结果:
    file

4. 导出

以下针对Controller的excel导出示例进行说明

4.1 普通导出

  • 定义实体,参考3.1

  • 导出示例

    @GetMapping("/export")
    public void export(HttpServletResponse response) {
    
    try {
    
        List stuList = new ArrayList();
        StudentDTO stu = new StudentDTO();
        stu.setEmail("abc@foxmail.com");
        stu.setGrade("初二");
        stu.setName("阿虎");
        stu.setNo("3");
        stu.setTeacherName("张老师");
        stu.setTeacherPhone("17799999999");
        stuList.add(stu);
    
        ExportParams tp = new ExportParams();
        Workbook workbook = ExcelExportUtil.exportExcel(tp, StudentDTO.class, stuList);
    
        response.setContentType("application/binary;charset=UTF-8");
        response.setHeader("Content-Disposition",
            "attachment;fileName=" + URLEncoder.encode("student.xls", "UTF-8"));
        workbook.write(response.getOutputStream());
    
    } catch (Exception e) {
        log.error(e.getMessage(), e);
        // 此处建议抛出具体的业务异常封装
        throw new RuntimeException("导出异常:" + e.getMessage(), e);
    }
    }
  • 结果:
    file

相关文章

版本号命名规范,为软件开发注入秩序
数据库事物,数据一致性的基石
解决Docker Hub镜像超时困扰
听歌搜歌下歌,尽在MusicFree
线上PostgreSQL锁表故障分析
PostgreSQL创建外部表场景及使用

发布评论