EasyPoi表格导入添加校验

news/2024/5/22 3:57:47

EasyPoi表格导入添加校验

  • 项目添加maven依赖
    • 实体类
    • 自定义校验
    • controller
    • 测试结果
  • 代码地址

项目添加maven依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.2.4</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>org.example</groupId><artifactId>easypoi-demo</artifactId><version>1.0-SNAPSHOT</version><properties><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><!--easy poi 依赖--><dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-spring-boot-starter</artifactId><version>4.5.0</version></dependency><!--hibernate校验--><dependency><groupId>org.hibernate</groupId><artifactId>hibernate-validator</artifactId><version>5.4.1.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><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.20</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><scope>test</scope></dependency><dependency><groupId>com.alibaba.fastjson2</groupId><artifactId>fastjson2</artifactId><version>2.0.48</version></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>3.1.2</version><configuration><excludes><exclude><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></exclude></excludes></configuration></plugin></plugins></build></project>

实体类

package com.easy.poi.demo.entity;import cn.afterturn.easypoi.excel.annotation.Excel;
import cn.afterturn.easypoi.excel.annotation.ExcelIgnore;
import cn.afterturn.easypoi.handler.inter.IExcelDataModel;
import cn.afterturn.easypoi.handler.inter.IExcelModel;
import lombok.Data;@Data
public class User implements IExcelDataModel, IExcelModel {@Excel(name = "序号", width = 20)private String serialNum;@Excel(name = "姓名", width = 20)private String name;@Excel(name = "性别", width = 20)private String gender;/*** 行号*/@ExcelIgnoreprivate Integer rowNum;/*** 错误信息*/@ExcelIgnoreprivate String errorMsg;
}

自定义校验

package com.easy.poi.demo.util;import cn.afterturn.easypoi.excel.entity.result.ExcelVerifyHandlerResult;
import cn.afterturn.easypoi.handler.inter.IExcelVerifyHandler;
import cn.hutool.core.util.ObjectUtil;
import com.easy.poi.demo.entity.User;
import org.springframework.stereotype.Component;import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;/*** 自定义校验*/
@Component
public class UserVerifyHandler implements IExcelVerifyHandler<User> {@Overridepublic ExcelVerifyHandlerResult verifyHandler(User user) {String[] genders = {"男", "女"};if (ObjectUtil.isEmpty(user.getName()) && ObjectUtil.isEmpty(user.getGender())) {return new ExcelVerifyHandlerResult(true);}List<String> genderList = new ArrayList<>(Arrays.asList(genders));if (!genderList.contains(user.getGender())) {return new ExcelVerifyHandlerResult(false, "性别不合法");}return new ExcelVerifyHandlerResult(true);}
}

controller

package com.easy.poi.demo.controller;import cn.afterturn.easypoi.excel.ExcelImportUtil;
import cn.afterturn.easypoi.excel.entity.ImportParams;
import cn.afterturn.easypoi.excel.entity.result.ExcelImportResult;
import com.easy.poi.demo.entity.User;
import com.easy.poi.demo.util.UserVerifyHandler;
import jakarta.annotation.Resource;
import org.apache.poi.ss.usermodel.Workbook;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.util.List;@RestController
public class UserController {/*** 注入自定义处理器*/@Resourceprivate UserVerifyHandler userVerifyHandler;@PostMapping(value = "/excel/import")public List<User> excelImport(@RequestParam("file") MultipartFile file) throws Exception {ImportParams params = new ImportParams();params.setHeadRows(1);// 代表导入这里是需要验证的params.setNeedVerify(true);// 校验处理接口params.setVerifyHandler(userVerifyHandler);ExcelImportResult<User> importResult = ExcelImportUtil.importExcelMore(file.getInputStream(), User.class, params);List<User> userList = importResult.getList();// isVerifyFail:是否存在校验失败,true为校验失败,false为校验成功if (importResult.isVerifyFail() || userList.isEmpty()) {// 校验失败或者导入的数据为空,输出错误记录的表格Workbook workbook = importResult.getFailWorkbook();// 当前项目目录String currentWorkingDir = System.getProperty("user.dir");String projectDir = "easypoi-demo";String dirPath = currentWorkingDir + File.separator + projectDir + File.separator + "excel";File dir = new File(dirPath);if (!dir.exists()) {// 目录不存在,创建目录dir.mkdir();}String path = dirPath + File.separator + "error.xlsx";OutputStream outputStream = new FileOutputStream(path, true);workbook.write(outputStream);// 关闭输出流workbook.close();outputStream.close();}return userList;}
}

测试结果

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

生成错误表格内容如下
在这里插入图片描述

代码地址

https://gitee.com/BAIXUEQIAN/java-study/tree/develop/easypoi-demo


http://www.mrgr.cn/p/23146362

相关文章

IfcDoorPanelOperationEnum

IfcDoorPanelOperationEnum 类型定义该列举定义了各个门板的基本操作方式,如图所示。EnumeratorIllustrationSwinging DoubleActing Sliding Folding Revolving Rollingup FixedPanel UserDefinedNotDefinedFigure — Door operations 门板的打开方向由IfcDoor的局部位置决定。…

Python案例:输出公元后到目前为止全部回文日期

一、回文日期 一个日期,如果顺读和倒读都一样,那么就称之为回文日期,比如今天:20211202,就是一个神奇的回文日期。 二、提出任务输出公元后的全部回文日期 要求每行输出五个回文日期 统计总共有多少个回文日期三、完成任务 (一)涉及知识点 1、time模块time模块有两个常用…

面相对象

找东西来解决的过程就叫做面相对象 java就是学习获取已有对象来使用从而解决问题,如果要解决的事情是没有对象能解决的,就要自己设计对象并使用可以设计类来获取对象 工具类不需要创建对象,只要调用类名即可

【文献分享】PCCP:机器学习 + 分子动力学 + 第一性原理 + 热学性质 + 微观结构

分享一篇关于机器学习 分子动力学 第一性原理 热学性质&#xff08;密度、粘度、扩散系数&#xff09; 微观结构的文章。 感谢论文的原作者&#xff01; 关键词&#xff1a; 1. Machine learning, 2. Deep potential, 3. Molecular dynamics 4. Molten salt, 5. Thermo…

vscode remote-x11 ssh 连接时Another All configured authentication methods failed like #10 报错修复

错误 remote-x11-ssh插件使用ssh2扩展 出现以下错误 https://github.com/joelspadin/vscode-remote-x11/issues/75 Error: All configured authentication methods failed 原因 https://github.com/mscdex/ssh2/issues/989 解决 换成ed25519 并修改配置

【uniapp】vscode安装插件、ts校验、允许json文件注释

1、vscode安装的插件&#xff1a; uni-create-viewuni-hlperuniapp小程序扩展 2、ts校验 安装插件&#xff1a; pnpm i -D types/wechat-miniprogram uni-helper/uni-app-types配置tsconfig.json {"extends": "vue/tsconfig/tsconfig.json","compi…

机器人码垛机的技术特点与应用

随着科技的飞速发展&#xff0c;机器人技术正逐渐渗透到各个行业领域&#xff0c;其中&#xff0c;机器人码垛机在物流行业的应用尤为引人瞩目。它不仅提高了物流效率&#xff0c;降低了成本&#xff0c;更在改变传统物流模式的同时&#xff0c;为行业发展带来了重大的变革。 一…

Java并发(二十五)----异步模式之生产者/消费者

1. 定义 要点与Java并发(二十二)----同步模式之保护性暂停中的保护性暂停中的 GuardObject 不同,不需要产生结果和消费结果的线程一一对应这样的好处是消费队列可以用来平衡生产和消费的线程资源生产者仅负责产生结果数据,不关心数据该如何处理,而消费者专心处理结果数据消息…

Chrome免安装绿色版制作教程

chrome离线安装包 https://downzen.com/en/windows/google-chrome/versions/?page=1 方法一: 1) 下载最新版Google Chrome离线安装包文件1. Stable版(稳定版、正式版)下载:http://www.google.com/chrome/eula.html?standalone=1注:Stable 似乎只有最新稳定版可以从官方下…

UML学习

UML(Unified Modeling Language)&#xff1a;统一建模语言&#xff0c;提供了一套符号和规则来帮助分析师和设计师表达系统的架构、行为和交互 类图&#xff1a;描绘类、接口之间的关系(继承、实现、关联、依赖等)以及类的内部结构(属性和方法)&#xff0c;直观展现系统的静态…

独一无二:探索单例模式在现代编程中的奥秘与实践

设计模式在软件开发中扮演着至关重要的角色&#xff0c;它们是解决特定问题的经典方法。在众多设计模式中&#xff0c;单例模式因其独特的应用场景和简洁的实现而广受欢迎。本文将从多个角度详细介绍单例模式&#xff0c;帮助你理解它的定义、实现、应用以及潜在的限制。 1. 什…

打造心灵栖息地:YY日记App——原型设计分享

YY日记App是一个专为年轻人打造的心灵日记应用,旨在提供一个私密、个性化的日记记录平台。在本篇博客中,我将分享我对YY日记App的原型设计思路和实现过程。一、用户研究在设计YY日记App的原型之前,我进行了深入的用户研究,明确了目标用户群体为年轻人,他们希望有一个简洁易…

cpu scheduling

基本概念多道程序设计的目的将CPU的利用率最大化 多个进程同时存在于内存(并发),当一个进程暂不使用cpu时,系统调用另一个进程占用cpu。 cpu调度程序whenever the cpu becomes idle(空闲) the operating system must select one of the processes in the ready queue to be…

毕业设计4.17

后台返回数据在安卓端列表化显示,数据处理出错

从入门到精通C++之类和对象(续)

目录 初始化列表构造函数&#xff1f;拷贝构造&#xff1f;浅谈explicit关键字友元 内部类static成员总结 初始化列表 引入初始化列表&#xff1a;简化代码&#xff0c;提高效率 在编程中&#xff0c;初始化列表是一种用于在创建对象时初始化成员变量的快捷方式。通过初始化列…

第十五届蓝桥杯大赛软件赛省赛 C/C++ 大学 B 组(基础题)

试题 C: 好数 时间限制 : 1.0s 内存限制: 256.0MB 本题总分&#xff1a;10 分 【问题描述】 一个整数如果按从低位到高位的顺序&#xff0c;奇数位&#xff08;个位、百位、万位 &#xff09;上 的数字是奇数&#xff0c;偶数位&#xff08;十位、千位、十万位 &…

NGINX Ingress Controller 设置未配置过的域名增加默认路由

背景 k8s 集群对应的公网 slb ip 经常被人绑定域名,监控侧经常会收集到 502 相关状态码的异常告警,着手处理这种bad case策略 1. 所有没有在ingress 配置过的域名要进行处理,即不是公司的、非法绑定到slb 上的域名要加上一条策略 2. NGINX Ingress Controller 设置未配置过…

基于达梦数据库开发-Java篇

文章目录 前言一、示例展示1.环境准备2.采用基础的jdbc调用3.采用扩展的mybatis调用 二、注意事项1.使用路径注解2.数据库对象的准确引用 三、可能异常1.无效的表或视图名2.无效的表或视图名3.网络通信异常 总结 前言 达梦提供了JDBC方式的驱动以便进行Java开发。默认情况下相…

web安全学习笔记(9)

记一下第十三课的内容。 准备工作&#xff1a;在根目录下创建template目录&#xff0c;将login.html放入其中&#xff0c;在该目录下新建一个reg.html。在根目录下创建一个function.php 一、函数声明与传参 PHP中的函数定义和其他语言基本上是相同的。我们编辑function.php …

基于RAM的几何变换——平移

基于RAM的几何变换——平移 一、平移的基本概念平移的概念很好理解,但是在具体操作中可能会涉及到两个问题:平移量有正数也有负数,涉及到Verilog语法中的有符号数处理 平移会导致部分像素超出我们的显示范围,对这部分的像素应当做丢弃处理二、MATLAB实现实现代码和实验结果…