当前位置: 首页 > news >正文

Easypoi Excel导入校验 两种方式

案例一

用JSR 303校验

所用数据

结果

Controller层

@CrossOrigin@PostMapping("/importStudentVerify")publicStringimportStudentVerify(@RequestParam("file")MultipartFilefile,HttpServletResponseresponse)throwsException{if(file.isEmpty()){thrownewException("error file is empty");}ImportParamsparams=newImportParams();//这里也要设置,否则会有异常params.setTitleRows(0);params.setHeadRows(1);params.setNeedVerify(true);//这里结合JSR303用不用自定义的,下一案例用自定义的//params.setVerifyHandler(verifyResult);//这里要用importExcelMore方法ExcelImportResult<StudentImportVerifyEntity2>studentImportEntitiesResult=ExcelImportUtil.importExcelMore(file.getInputStream(),StudentImportVerifyEntity2.class,params);//获取失败的数据List<StudentImportVerifyEntity2>failStudentsImport=studentImportEntitiesResult.getFailList();System.out.println(failStudentsImport);List<StudentImportVerifyEntity2>studentImportEntities=studentImportEntitiesResult.getList();//没有失败的if(CollectionUtil.isEmpty(failStudentsImport)){List<Student>students=studentImportEntities.stream().map(e->{Studentstudent=newStudent();student.setName(e.getName());student.setSex(e.getSex());// 创建一个LocalTime实例,例如午夜12点LocalTimelocalTime=LocalTime.MIDNIGHT;LocalDatebirthDayLocalDate=LocalDate.parse(e.getBirthDay(),DateTimeFormatter.ofPattern("yyyy-MM-dd"));//LocalDate转LocalDateTimeLocalDateTimebirthDayLocalDateTime=LocalDateTime.of(birthDayLocalDate,localTime);student.setBirthDay(birthDayLocalDateTime);LocalDateregistrationLocalDate=LocalDate.parse(e.getRegistrationDate(),DateTimeFormatter.ofPattern("yyyy-MM-dd"));LocalDateTimeregistrationLocalDateTime=LocalDateTime.of(registrationLocalDate,localTime);student.setRegistrationDate(registrationLocalDateTime);returnstudent;}).collect(Collectors.toList());studentService.saveBatch(students);return"成功";}return"excel有错误数据";}

StudentImportVerifyEntity2

//这里要实现IExcelModel接口才有errorMsg输出@DatapublicclassStudentImportVerifyEntity2implementsjava.io.Serializable,IExcelModel{/** * 学生姓名 */@Excel(name="学生姓名",orderNum="0")//这里要加上JSR 303校验@NotNull(message="学生姓名不能为空")privateStringname;/** * 学生性别 */@Excel(name="学生性别",replace={"男_1","女_0"},orderNum="1",suffix="生")privateintsex;@Excel(name="出生日期",orderNum="2",importFormat="yyyy-MM-dd")privateStringbirthDay;@Excel(name="进校日期",orderNum="3",importFormat="yyyy-MM-dd")privateStringregistrationDate;privateStringerrorMsg;@OverridepublicStringgetErrorMsg(){returnerrorMsg;}@OverridepublicvoidsetErrorMsg(StringerrorMsg){this.errorMsg=errorMsg;}}

案例二

自定义校验处理器

处理器:

@ServicepublicclassVerifyResultimplementsIExcelVerifyHandler<StudentImportVerifyEntity>{@OverridepublicExcelVerifyHandlerResultverifyHandler(StudentImportVerifyEntitystudentImportVerifyEntity){ExcelVerifyHandlerResultresult=newExcelVerifyHandlerResult(true);if(Objects.isNull(studentImportVerifyEntity.getName())){result.setSuccess(false);result.setMsg("姓名不能为空");returnresult;}result.setSuccess(true);returnresult;}}

Controller层

@ResourceprivateVerifyResultverifyResult;@CrossOrigin@PostMapping("/importStudentVerify")publicStringimportStudentVerify(@RequestParam("file")MultipartFilefile,HttpServletResponseresponse)throwsException{if(file.isEmpty()){thrownewException("error file is empty");}ImportParamsparams=newImportParams();//这里也要设置,否则会有异常params.setTitleRows(0);params.setHeadRows(1);params.setNeedVerify(true);//这里设置处理器params.setVerifyHandler(verifyResult);//注意这里用的entity是StudentImportVerifyEntityExcelImportResult<StudentImportVerifyEntity>studentImportEntitiesResult=ExcelImportUtil.importExcelMore(file.getInputStream(),StudentImportVerifyEntity.class,params);//获取失败的数据List<StudentImportVerifyEntity>failStudentsImport=studentImportEntitiesResult.getFailList();System.out.println(failStudentsImport);List<StudentImportVerifyEntity>studentImportEntities=studentImportEntitiesResult.getList();//没有失败的if(CollectionUtil.isEmpty(failStudentsImport)){List<Student>students=studentImportEntities.stream().map(e->{Studentstudent=newStudent();student.setName(e.getName());student.setSex(e.getSex());// 创建一个LocalTime实例,例如午夜12点LocalTimelocalTime=LocalTime.MIDNIGHT;LocalDatebirthDayLocalDate=LocalDate.parse(e.getBirthDay(),DateTimeFormatter.ofPattern("yyyy-MM-dd"));//LocalDate转LocalDateTimeLocalDateTimebirthDayLocalDateTime=LocalDateTime.of(birthDayLocalDate,localTime);student.setBirthDay(birthDayLocalDateTime);LocalDateregistrationLocalDate=LocalDate.parse(e.getRegistrationDate(),DateTimeFormatter.ofPattern("yyyy-MM-dd"));LocalDateTimeregistrationLocalDateTime=LocalDateTime.of(registrationLocalDate,localTime);student.setRegistrationDate(registrationLocalDateTime);returnstudent;}).collect(Collectors.toList());studentService.saveBatch(students);return"成功";}return"excel有错误数据";}

StudentImportVerifyEntity

@DatapublicclassStudentImportVerifyEntityimplementsIExcelDataModel,IExcelModel,java.io.Serializable{/** * 学生姓名 */@Excel(name="学生姓名",orderNum="0")//JSR 303的注解注掉了走的是自定义处理器//@NotNull(message = "学生姓名不能为空")privateStringname;/** * 学生性别 */@Excel(name="学生性别",replace={"男_1","女_0"},orderNum="1",suffix="生")privateintsex;@Excel(name="出生日期",orderNum="2",importFormat="yyyy-MM-dd")privateStringbirthDay;@Excel(name="进校日期",orderNum="3",importFormat="yyyy-MM-dd")privateStringregistrationDate;/** * 行号 */privateintrowNum;/** * 错误消息 */privateStringerrorMsg;@OverridepublicStringgetErrorMsg(){returnerrorMsg;}@OverridepublicvoidsetErrorMsg(StringerrorMsg){this.errorMsg=errorMsg;}@OverridepublicintgetRowNum(){returnrowNum;}@OverridepublicvoidsetRowNum(inti){this.rowNum=rowNum;}}


pom引用

<dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-base</artifactId><version>4.1.0</version></dependency><dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-web</artifactId><version>4.1.0</version></dependency><dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-annotation</artifactId><version>4.1.0</version></dependency><dependency><groupId>org.hibernate</groupId><artifactId>hibernate-validator</artifactId><version>5.2.4.Final</version></dependency><dependency><groupId>javax.el</groupId><artifactId>javax.el-api</artifactId><version>3.0.0</version></dependency><dependency><groupId>org.glassfish.web</groupId><artifactId>javax.el</artifactId><version>2.2.6</version></dependency>
http://www.cnnetsun.cn/news/9342.html

相关文章:

  • 力扣 22. 括号生成:C++ 实现回溯 + 动态规划双解法,面试高频题必掌握
  • 【开题答辩全过程】以 基于Django的大学生理财及记账系统设计与实现为例,包含答辩的问题和答案
  • Rust的移动语义
  • 生物毒性在线分析仪:监测水体毒性的利器
  • english-13-word-25-12-11 ,get down to business 言归正传 , peripheral devices 从属设备【蓝牙主机host从机Peripheral】
  • 3倍效率!用AI自动修复Vue属性传递问题
  • OpenJob完全指南:如何快速上手高性能分布式任务调度框架
  • 基于密集型复杂城市场景下求解无人机三维路径规划的Q-learning 算法研究附Matlab代码
  • vnpy可视化技术终极指南:从零构建专业K线图表交易界面
  • 降息利好板块
  • SEO网站优化,百度就是不收录自己的网站解决方法
  • Dify 1.7.0发布后,为什么90%的AI工程师都在关注它的音频处理能力?
  • 金融级数据保护,手把手教你用PHP实现RSA加密全流程
  • 企业核心竞争力的评估方法
  • 记录va_list重复使用导致的crash
  • 二十三种设计模式(十)--外观模式
  • FSNotes深度体验:从笔记混乱到高效管理的完美蜕变
  • 【大模型必读书籍】轻松入门Cursor与MCP:AI辅助编程,零基础也能成为编程高手!
  • 【Frida Android】实战篇14:非标准算法场景 Hook 教程
  • sfy recommend
  • Wan2.2-T2V-A14B能否生成核酸检测流程指引动画?公共信息传达
  • 告别盈利迷茫!让光储项目赚钱更有依据
  • 深圳便利店鸡尾酒哪家好?浅醺猫定义Z世代“精品自调“新标准
  • 运维工程师转网安要学什么?有什么好处?
  • Wan2.2-T2V-A14B如何实现烟雾扩散的三维渲染?
  • 揭秘VSCode中Cirq智能补全原理:如何实现毫秒级代码建议响应
  • .NET进阶——深入理解委托(1)委托入门
  • 无状态接口设计指南
  • day11日志
  • swiftui—4