1. 介绍
Easypoi的目标不是替代poi,而是让一个不懂导入导出的快速使用poi完成Excel和word的各种操作,而不是看很多api才可以完成这样工作
独特的功能
- 基于注解的导入导出,修改注解就可以修改Excel
- 支持常用的样式自定义
- 基于map可以灵活定义的表头字段
- 支持一堆多的导出,导入
- 支持模板的导出,一些常见的标签,自定义标签
- 支持HTML/Excel转换,如果模板还不能满足用户的变态需求,请用这个功能
- 支持word的导出,支持图片,Excel
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);
}
}
-
测试效果:
导入源始数据:
导入失败结果:
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); } } -
结果: