EasyPoi导出 导入(带校验)简单示例 EasyExcel

官方文档 : http://doc.wupaas.com/docs/easypoi

pom的引入:

<!--        easyPoi--><dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-spring-boot-starter</artifactId><version>4.0.0</version></dependency><dependency><groupId>org.hibernate</groupId><artifactId>hibernate-validator</artifactId><version>5.4.1.Final</version></dependency>
<!--        hutool--><dependency><groupId>cn.hutool</groupId><artifactId>hutool-core</artifactId><version>5.7.7</version></dependency>

1.建立一个对象体

@Data
public class EasyPoiEntity {@Excel(name = "姓名")private String name;@Excel(name = "年龄")private int age;@Excel(name = "地址")private String addr;}

2.导出代码

    @GetMapping("/exportExcel")public void test(HttpServletRequest request, HttpServletResponse response)throws IOException {//模拟数据  实际基本查数据EasyPoiEntity easyPoiEntity = new EasyPoiEntity();easyPoiEntity.setName("张三");easyPoiEntity.setAddr("中国");easyPoiEntity.setAge(18);List<EasyPoiEntity> list = new ArrayList<>();list.add(easyPoiEntity);//2.封装成表格//参数1:表格标题,参数2:sheet名称
//        ExportParams exportParams = new ExportParams("学生信息", "1班学生信息");ExportParams exportParams = new ExportParams();exportParams.setSheetName("学生信息");exportParams.setStyle(EasyExcelStyleType.ONE.getCla());//参数1:表格参数  参数2:实体类  参数3:数据Workbook sheets = ExcelExportUtil.exportExcel(exportParams, EasyPoiEntity.class, list);//3.返回表格//设置表格文件名字// 生成时间戳String timestamp = DateUtil.format(LocalDateTime.now(), "yyyyMMddHHmmss");String fileName = "一班学生数据-"+timestamp;fileName = URLEncoder.encode(fileName,"UTF8");//设置返回数据类型response.setContentType("application/vnd.ms-excel;charset=utf-8");response.setHeader("Content-Disposition", "attachment;filename=" + fileName + ".xls");//将表格输出sheets.write(response.getOutputStream());}

导出Excel
在这里插入图片描述

导入例子

1.对象加上校验注解 实现 IExcelDataModel, IExcelModel

@Data
public class EasyPoiEntity implements IExcelDataModel, IExcelModel {@Excel(name = "姓名")@Pattern(regexp = "[\u4E00-\u9FA5]*", message = "不是中文")private String name;@Max(value = 15,message = "max 最大值不能超过15")@Excel(name = "年龄")private int age;@NotNull(message = "地址不能为空")@Excel(name = "地址")private String addr;/*** 行号*/private int rowNum;/*** 错误消息*/private String errorMsg;}

导入代码 params.setVerifyHandler(excelVerifyInfo);看后面

    @PostMapping("/importExcel")@ResponseBodypublic Object importUser(@RequestParam("uploadFile") MultipartFile multipartFile,HttpServletResponse resp) {ImportParams params = new ImportParams();/*** 这里需要注意表头的行数设置一定要正确!否则集合数据将无法读取,* 可以通过WPS或者office查看实际表头所占用的行数,* 一定要区分表头与标题的区别,表头是列名称,标题是表头上面的文字,* 本文示例文件中没有标题,所以setTitleRows为0*/// 设置表头行数params.setHeadRows(1);// 标题行设置为0行,默认是0,可以不设置params.setTitleRows(0);
//        代表导入这里是需要验证的(根据字段上的注解校验)params.setNeedVerify(true);//设及一个自定义校验 (自定义校验名字不可重复)params.setVerifyHandler(excelVerifyInfo);try {ExcelImportResult<EasyPoiEntity> importResult = ExcelImportUtil.importExcelMore(multipartFile.getInputStream(), EasyPoiEntity.class, params);boolean verfiyFail = importResult.isVerfiyFail();System.out.println(verfiyFail);System.out.println(importResult.getFailList().toString());System.out.println(importResult.getList().toString());//验证是否有失败的数据if (importResult.isVerfiyFail()) {ServletOutputStream fos = resp.getOutputStream();//mime类型resp.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");// 生成时间戳String timestamp = DateUtil.format(LocalDateTime.now(), "yyyyMMddHHmmss");resp.setHeader("Content-disposition", "attachment;filename=" + timestamp + "-error.xlsx");importResult.getFailWorkbook().write(fos);fos.close();}return importResult.getList();} catch (Exception e) {e.printStackTrace();}return null;}

导入Excel例子
在这里插入图片描述
返回的异常Excel
在这里插入图片描述
对于想自定义异常的 自己写一个实现类实现 IExcelVerifyHandler<>即可
代码如下:

@Component
public class  ExcelVerifyInfo implements IExcelVerifyHandler<EasyPoiEntity> {private final ThreadLocal<List<EasyPoiEntity>> threadLocal = new ThreadLocal<>();@Overridepublic ExcelVerifyHandlerResult verifyHandler(EasyPoiEntity easyPoiEntity) {StringJoiner joiner = new StringJoiner(",");List<EasyPoiEntity> threadLocalVal = threadLocal.get();if (threadLocalVal == null) {threadLocalVal = new ArrayList<>();}/*** 所有的自定义校验 可以再这里写 比如查数据 比较之类*/
//        if (easyPoiEntity.getName().equals("张三")){
//            joiner.add("eeeeee");
//        }threadLocalVal.forEach(e -> {if (e.getName().equals(easyPoiEntity.getName())) {int lineNumber = e.getRowNum() + 1;joiner.add("名字与" + lineNumber + "行重复");}});// 添加本行数据对象到ThreadLocal中threadLocalVal.add(easyPoiEntity);threadLocal.set(threadLocalVal);if (!Objects.equals(joiner.length(),0)) {return new ExcelVerifyHandlerResult(false, joiner.toString());}return new ExcelVerifyHandlerResult(true);}
}

关于空行问题

Excel经常会有空行但是有格式的行 我们读取的时候 会读到这些行 然后对象就都是空的 这可能会影响到数据的处理 我是在校验类里面做了判断 如下:

@Component
public class  ExcelVerifyInfo implements IExcelVerifyHandler<EasyPoiEntity> {private final ThreadLocal<List<EasyPoiEntity>> threadLocal = new ThreadLocal<>();@Overridepublic ExcelVerifyHandlerResult verifyHandler(EasyPoiEntity easyPoiEntity) {if ( StringUtils.isAllBlank(easyPoiEntity.getName(), easyPoiEntity.getAddr()) && Objects.equals(easyPoiEntity.getAge(),0)) {// 空行数据,返回false表示无效,EasyPoi会过滤掉该行数据return new ExcelVerifyHandlerResult(false);} else {// 非空行数据,返回true表示有效StringJoiner joiner = new StringJoiner(",");List<EasyPoiEntity> threadLocalVal = threadLocal.get();if (threadLocalVal == null) {threadLocalVal = new ArrayList<>();}/*** 所有的自定义校验 可以再这里写 比如查数据 比较之类*/
//        if (easyPoiEntity.getName().equals("张三")){
//            joiner.add("eeeeee");
//        }threadLocalVal.forEach(e -> {if (e.getName().equals(easyPoiEntity.getName())) {int lineNumber = e.getRowNum() + 1;joiner.add("名字与" + lineNumber + "行重复");}});// 添加本行数据对象到ThreadLocal中threadLocalVal.add(easyPoiEntity);threadLocal.set(threadLocalVal);if (!Objects.equals(joiner.length(),0)) {return new ExcelVerifyHandlerResult(false, joiner.toString());}return new ExcelVerifyHandlerResult(true);}}
}

假如你对象属性多 不用全都判断是都空 只要找几个必填属性 然后判断为空就认为是空行就行了

数据翻译

1.简单的方式 直接用replace 会在导出导入进行翻译 比如你导出 一般状态是数字 会翻译成中文 导入则相反

    @Excel(name = "状态",replace = {"进行中_1", "完成_2","结束_3"})private String status;

Excel导入校验并返回异常Excel

    @PostMapping("/importExcel")@ResponseBodypublic void importUser(@RequestParam("uploadFile") MultipartFile multipartFile, HttpServletResponse response) {try {//自己找一个读的utlisList<User> read = EasyExcelUtil.read(multipartFile.getInputStream(), User.class);//拿到数据 校验数据 有问题就set导msg 然后把流写出List<User> errList = new ArrayList<>();for (User user : read) {if (user.getName().equals("张三")){user.setMsg("这是一个错误数据");errList.add(user);}}if (CollectionUtil.isNotEmpty(errList)){// 生成时间戳String timestamp = DateUtil.format(LocalDateTime.now(), "yyyyMMddHHmmss");EasyExcelUtil.write(response,"err_"+timestamp,errList,"test");}System.out.println(read);} catch (IOException e) {throw new RuntimeException(e);}}

对象

@Data
public class User {private String name;private String phone;private String addr;@ContentFontStyle(color = Font.COLOR_RED)@ColumnWidth(value = 25)private String msg;}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/32380.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java基础入门篇——数组初识

一、数组 1.假设某公司有100个员工&#xff0c;需要统计某公司员工的工资情况&#xff0c;首先需要声明100个变量来分别记每个员工的工资&#xff0c;那么如果按照之前的做法&#xff0c;可能定义的结构如下所示&#xff1a; int a1,a2,a3,......a100; 要求你输出这100个员工…

JavaWeb学习|JSTL表达式

1.什么是JSTL表达式&#xff1f; JSTL标签库的使用就是为了弥补HTML标签的不足;它自定义许多标签&#xff0c;可以供我们使用&#xff0c;标签的功能和Java代码一样 在JSP页面文件中使用JSTL表达式&#xff0c;首先需要引入核心标签库 同时&#xff0c;也要把JSTL的jar包在to…

C指针:程序员的神奇箭头,穿越内存的冒险之旅!

目录 &#x1f575;️‍♂️ 引言&#xff1a;指针&#xff0c;那些指向星星的小箭头&#xff01; 一、&#x1f3af; 探索箭头&#xff1a;指针的基础知识 1.1 指针是什么&#xff1f; 1.2 解引用操作符&#xff1a;* 是关键 1.3 指针的比较和运算 1.4 空指针&#xff1a…

深度使用苹果M1 Mac电脑一个月后的发现与问题解决

自从苹果推出M1芯片的Mac电脑后&#xff0c;其强大的性能和高效的能耗管理引起了广泛关注。许多人纷纷购买了这款新一代的Mac电脑&#xff0c;并深度使用了一个月。然而&#xff0c;在长时间使用的过程中&#xff0c;一些问题也逐渐浮现出来。本文将分享在深度使用苹果M1 Mac电…

初始C语言——详细讲解操作符以及操作符的易错点

系列文章目录 第一章 “C“浒传——初识C语言&#xff08;更适合初学者体质哦&#xff01;&#xff09; 第二章 详细认识分支语句和循环语句以及他们的易错点 第三章 初阶C语言——特别详细地介绍函数 第四章 初始C语言——详细地讲解数组的内容以及易错点 第五章 初始C语言—…

20230809在WIN10下使用python3批量将TXT文件转换为SRT文件

20230809在WIN10下使用python3批量将TXT文件转换为SRT文件 2023/8/9 17:30 由于喜欢看纪录片等外文视频&#xff0c;通过剪映/PR2023/AUTOSUB识别字幕之后&#xff0c;可以通过google翻译识别为简体中文的DOCX文档。 DOCX文档转换为TXT文档之后&#xff0c;还需要转换为SRT文档…

CentOS7安装MySQL8(RPM方式)

第一步&#xff1a;解压 tar -xvf mysql-8.0.34-1.el7.x86_64.rpm-bundle.tar -C /usr/local/java/mysql 第二步&#xff1a;按顺序安装rpm包 # rpm -ivh mysql-community-common-8.0.34-1.el7.x86_64.rpm# rpm -ivh mysql-community-client-plugins-8.0.34-1.el7.x86_64.rpm…

【PythonRS】植被显示增强(多光谱、正射、照片等)

很多时候我们需要某个区域的正射图&#xff0c;虽然正射图一般都运用了匀色的算法&#xff0c;整体色彩比较均衡。但如果研究区内有大量的植被&#xff0c;这个时候植被突出显示就很有必要了。所以今天给大家分享一下使用Python对多光谱、正射影像进行植被显示增强的算法。 一、…

【学习FreeRTOS】第2章——FreeRTOS基础知识

1.任务调度 1.1.任务调度简介 调度器就是使用相关的调度算法来决定当前需要执行的哪个任务FreeRTOS 一共支持三种任务调度方式&#xff1a; 抢占式调度&#xff1a;针对优先级不同的任务&#xff0c;每个任务都有一个优先级&#xff0c;优先级高的任务可以抢占优先级低的任务…

【前端】CSS垂直居中的7种方法

文章目录 line-height绝对定位margin:autoflex绝对定位margin:负值定位transformvertical-align:middledisplay:table-cell思维导图 前文&#xff1a;【前端】CSS水平居中的6种方法_karshey的博客-CSDN博客 有很多相似的部分。 line-height 适用于单行的行内元素设置line-he…

模仿火星科技 基于cesium+角度测量+高度测量+可编辑

1. 创建提示窗&#xff1a; 启动Cesium应用&#xff0c;地图场景将打开&#xff0c;欢迎您进入编辑模式。 在屏幕的一角&#xff0c;一个友好的提示窗将呈现&#xff0c;随着您的操作&#xff0c;它会为您提供有用的信息和指导。 2. 绘制面积&#xff1a; 轻轻点击鼠标左键&a…

MySQL之 show profile 相关总结

MySQL之 show profile 相关总结 MySQL官网show profile介绍&#xff1a;https://dev.mysql.com/doc/refman/8.0/en/show-profile.html 1. 简介 show profile 和 show profiles 命令用于展示SQL语句的资源使用情况&#xff0c;包括CPU的使用&#xff0c;CPU上下文切换&#xf…

Docker 数据管理

文章目录 前言1、Dcoker 文件体系2、volume挂载案例2.1、挂载运行一个容器实例方法1方法2 3、volumes-from 案例4、备份/恢复数据卷5、删除数据卷 前言 为什么要有数据管理&#xff1f; 因为&#xff1a; Docker 是不提供持久化的 &#xff0c;容器是不稳定的&#xff1b;一个…

mac ssh连接另一台window虚拟机vm

vmware配置端口映射 编辑(E) > 虚拟网络编辑器(N)... > NAT设置(S)... window防火墙&#xff0c;入站规则添加5555端口 控制面板 > 系统和安全 > Windows 防火墙>高级设置>入站规则>新建规则... tips windows查看端口命令&#xff1a;netstat -ano | f…

java-IDEA MAVEN查看依赖树,解决jar包重复和冲突

如果这里面的依赖关系有红线,就说明有包冲突,一般都是版本不一致,可以在idea里下一个插件Maven Helper,点击install并重启IDEA 打开pom.xml文件&#xff0c;在下方会出现Dependency Analyzer&#xff0c;选择它会出现重复依赖列表&#xff0c;选择对应的依赖&#xff0c;右键红…

BI技巧丨利用Index计算半累计

在实际的业务场景中&#xff0c;特别是财务模块和库存管理模块&#xff0c;经常需要我们针对每个月的期初期末进行相关指标计算&#xff0c;这也是我们之前曾经提到的Calculate基础应用——半累计计算。 现在我们也可以通过微软新推出的Index开窗函数来解决这一问题。 INDEX函…

Mapbox加载天地图CGCS2000矢量瓦片地图

1.背景 最近在做天地图的项目&#xff0c;要基于MapBox添加CGCS2000矢量切片数据&#xff0c;但是 Mapbox 只支持web 墨卡托&#xff08;3857&#xff09;坐标系的数据。Github有专业用户修改了mapbox-gl的相关代码&#xff0c;支持CGCS2000的切片数据加载&#xff0c;并且修改…

手动实现 Spring 底层机制 实现任务阶段一编写自己 Spring 容器-准备篇【2】

&#x1f600;前言 手动实现 Spring 底层机制的第2篇 实现了任务阶段一编写自己 Spring 容器-准备篇【2】 &#x1f3e0;个人主页&#xff1a;尘觉主页 &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是尘觉&#xff0c;希望我的文章可以帮助到大家&#xff0c;您的…

后端进阶之路——深入理解Spring Security配置(二)

前言 「作者主页」&#xff1a;雪碧有白泡泡 「个人网站」&#xff1a;雪碧的个人网站 「推荐专栏」&#xff1a; ★java一站式服务 ★ ★前端炫酷代码分享 ★ ★ uniapp-从构建到提升★ ★ 从0到英雄&#xff0c;vue成神之路★ ★ 解决算法&#xff0c;一个专栏就够了★ ★ 架…

【STM32RT-Thread零基础入门】 2. 新建RT-Thread项目

硬件&#xff1a;STM32F103ZET6、ST-LINK、usb转串口工具 文章目录 前言一、新建RT-Thread项目二、项目结构三、构建项目四、下载程序&#xff08;调试器下载&#xff09;五、终端交互总结 前言 RT-Thread的全称是Real Time Thread&#xff0c;顾名思义&#xff0c;它是一个嵌…