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.rhkb.cn/news/85098.html

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

相关文章

Java培训班出来能找到工作吗?有没有想详细了解的呢

参加Java培训班可以提升你的编程技能和就业竞争力&#xff0c;但能否找到工作还取决于多个因素&#xff0c;如个人能力、市场需求、就业竞争等。参加Java培训班可以帮助你获得系统的Java编程知识和实践经验&#xff0c;了解行业最佳实践和流行的技术框架。这有助于你在面试时展…

谷粒商城第十天-分组新增级联显示商品分类分组修改级联回显商品分类

目录 一、总述 二、前端实现 三、后端实现 四、总结 一、总述 本次就是一个小的优化。 就是分组新增或者是修改的时候&#xff0c;直接显示商品分类的id可读性不高&#xff0c;新增的时候需要填写对商品分类的id&#xff0c;修改的时候&#xff0c;就只是给你一个商品分类…

CelebA-HQ数据集下载【详细明了版】分辨率包括【64,128,256,512,1024】

CelebA-HQ数据集下载&#xff0c;分辨率包括【64&#xff0c;128&#xff0c;256&#xff0c;512&#xff0c;1024】 前言下载&处理1.下载合并解压img_celeba.7z2.下载list_landmarks_celeba.txt3.获取h5tool.py4.mkdir5. 下载.dat数据 配置环境生成数据集 前言 CelebA-HQ …

vue插槽slots

一、默认插槽&#xff1a; vue组件能够接收任意类型的 JavaScript 值作为 props&#xff0c;也可以为子组件传递一些模板片段&#xff0c;让子组件在它们的组件中渲染这些片段。 例如&#xff1a;有一个<FancyButton>组件 在父组件中引用 最终渲染出来的dom 插槽内容可…

配置中心替换测试设计分享

一、背景 项目后端服务开始一直使用Apollo配置中心(携程开发)进行配置管理&#xff0c;由于公司自研了配置中心B&#xff0c;为了后续方便管理和降本增效&#xff0c;后端服务使用的配置需要由Apollo配置中心切换到自研配置中心B。后续不再使用Apollo配置。 替换前架构&#x…

刷新缓冲区(标准IO)

标准IO是带缓冲的&#xff0c;输入和输出函数属于行缓冲&#xff0c;stdin、stdin、printf、scanf 1.换行符刷新 2.缓冲区满刷新 3.fflush函数强制刷新 4.程序正常结束

【云原生】K8S集群

目录 一、调度约束1.1 POT的创建过程1.1调度过程 二、指定节点调度2.1 通过标签选择节点 三、亲和性3.1requiredDuringSchedulingIgnoredDuringExecution&#xff1a;硬策略3.1 preferredDuringSchedulingIgnoredDuringExecution&#xff1a;软策略3.3Pod亲和性与反亲和性3.4使…

【CSS】文本效果

文本溢出、整字换行、换行规则以及书写模式 代码&#xff1a; <style> p.test1 {white-space: nowrap; width: 200px; border: 1px solid #000000;overflow: hidden;text-overflow: clip; }p.test2 {white-space: nowrap; width: 200px; border: 1px solid #000000;ove…

Android侧滑栏(一)可缩放可一起移动的侧滑栏

在实际的各类App开发中&#xff0c;经常会需要做一个左侧的侧滑栏&#xff0c;类似于QQ这种。 今天这篇文章总结下自己在开发中遇到的这类可以跟随移动且可以缩放的侧滑栏。 一、实现原理 使用 HorizontalScrollView 实现一个水平方向的可滑动的View&#xff0c;左布局为侧滑…

arcgis pro 3.0.2 安装及 geemap

arcgis pro 3.0.2 安装及 geemap arcgis pro 3.0.2 安装 arcgis pro 3 版本已经很多了&#xff0c;在网上找到资源就可以进行安装 需要注意的是&#xff1a;有的文件破解文件缺少&#xff0c;导致破解不成功。 能够新建地图就是成功了&#xff01; geemap安装 1.需要进行环…

VsCode美化 - VsCode自定义 - VsCode自定义背景图

VsCode美化 - VsCode自定义 - VsCode自定义背景图&#xff1a;添加二次元老婆图到VsCode 前言 作为一个二刺螈&#xff0c;VsCode用久了&#xff0c;总觉得少了些什么。是啊&#xff0c;高效的代码生产工具中怎么能没有老婆呢&#xff1f; 那就安装一个VsCode插件把老婆添加…

Byzer-LLM环境安装

1.Byzer-LLM简介 Byzer-LLM 是基于 Byzer 的一个扩展&#xff0c;让用户可以端到端的完成业务数据获取&#xff0c;处理&#xff0c;finetune大模型&#xff0c;多场景部署大模型等全流程。 该扩展的目标也是为了让企业更好的将业务数据注入到私有大模型&#xff08;开源或者商…

学生公寓一进四出智能电表的功能介绍

学生公寓一进四出智能电表石家庄光大远通电气有限公司模块时间控制功能&#xff1a;可设定每个宿舍自动断电和供电的时间&#xff1b;也可以设定某时间段内为小功率输出,设定时间后自动恢复正常供电。权限管理&#xff1a;管理者可对操作人员设定不同操作权限&#xff1b; 软件…

Android T 窗口层级其一 —— 容器类

窗口在App端是以PhoneWindow的形式存在&#xff0c;承载了一个Activity的View层级结构。这里我们探讨一下WMS端窗口的形式。 可以通过adb shell dumpsys activity containers 来看窗口显示的层级 窗口容器类 —— WindowContainer类 /*** Defines common functionality for c…

Linux下 时间戳的转化

Linux下一般用date 记录当前时间&#xff0c;尤其是我们需要保存测试log的时候&#xff0c;或者设计一个跑多长时间的脚本都需要时间戳。下面看一下平时最常用的几种写法 1 date “%Y-%m-%d %H:%M” 显示具体时间 2 修改时间 date -s 3 date %s :当前时间的时间戳 显示具体时…

去了字节跳动,才知道年薪40W的测试有这么多?

今年大环境不好&#xff0c;内卷的厉害&#xff0c;薪资待遇好的工作机会更是难得。最近脉脉职言区有一条讨论火了 哪家互联网公司薪资最‘厉害’&#xff1f; 下面的评论多为字节跳动&#xff0c;还炸出了很多年薪40W的测试工程师 我只想问一句&#xff0c;现在的测试都这么有…

Opencv-C++笔记 (16) : 几何变换 (图像的翻转(镜像),平移,旋转,仿射,透视变换)

文章目录 一、图像平移二、图像旋转2.1 求旋转矩阵2.2 求旋转后图像的尺寸2.3手工实现图像旋转2.4 opencv函数实现图像旋转 三、图像翻转3.1左右翻转3.2、上下翻转3.3 上下颠倒&#xff0c;左右相反 4、错切变换4.1 实现错切变换 5、仿射变换5.1 求解仿射变换5.2 OpenCV实现仿射…

Floyd算法

正如我们所知道的&#xff0c;Floyd算法用于求最短路径。Floyd算法可以说是Warshall算法的扩展&#xff0c;三个for循环就可以解决问题&#xff0c;所以它的时间复杂度为O(n^3)。 Floyd算法的基本思想如下&#xff1a;从任意节点A到任意节点B的最短路径不外乎2种可能&#xff…

SpringCloud实用篇2——Nacos配置管理 Feign远程调用 Gateway服务网关

目录 1 Nacos配置管理1.1 统一配置管理1.1.1 在nacos中添加配置文件1.1.2 从微服务拉取配置 1.2 配置热更新1.2.1 方式一1.2.2 方式二&#xff08;推荐&#xff09; 1.3.配置共享 2 搭建Nacos集群2.1 集群结构图2.2 搭建集群2.2.1 初始化数据库2.2.2 下载nacos2.2.3 配置Nacos2…

JavaSE 【类和对象】(3)(重点:内部类)

一、内部类 将一个类定义在另一个类或者一个方法的内部&#xff0c; 前者称为内部类&#xff0c;后者称为外部类 。内部类也是封装的一种体现 在外部类中&#xff0c;内部类定义位置与外部类成员所处的位置相同&#xff0c;因此称为成员内部类。 public class OutClass { c…