easyexcel文件上传

easyexcel文件上传

前言:功能开发中,难免碰到数据上传下载功能,excel上传常见用于报表上传,绩效上传,考勤上传…

使用步骤:

1,编写业务层:

1,添加easyexcel依赖

 			<dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.2.0</version></dependency>

2,导入模板excel下载
通常有个模版下载功能,在模板里面添加表头,以及数据格式…

3,在导入Excel模版中添加导入数据
4,导入
controller

	@PostMapping("/importxxxRoster")@ApiOperation("导入xxx信息")public void importxxxRoster(MultipartFile file, HttpServletResponse response) {dutyRosterService.importDutyRoster(file, response);}

service

 /*** 导入xxx信息** @param file*            文件* @param response*            响应*/void importxxxRoster(MultipartFile file, HttpServletResponse response);

serviceImpl

 @Overridepublic void importxxxRoster(MultipartFile file, HttpServletResponse response) {try {InputStream is = file.getInputStream();// 监听器不能放在容器里面,要通过构造器的方式,放入监听器使用xxxxRosterDataListener listener = new xxxxRosterDataListener(this.baseMapper);// xxxRosterData 接收导入Excel 实体类EasyExcel.read(is, xxxRosterData.class, listener).doReadAll();// 获取错误信息集合List<xxxRosterErrorData> errorDataList = listener.getErrorDataList();if (!CollectionUtils.isEmpty(errorDataList)) {response.setContentType("application/vnd.ms-excel");response.setCharacterEncoding("utf-8");String fileName = URLEncoder.encode("xxx导入错误详情", "UTF-8");response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");// 导出错误Excel数据EasyExcel.write(response.getOutputStream(), xxxRosterErrorData.class).sheet("错误详情").doWrite(errorDataList);}} catch (IOException e) {log.error("导入xxexcel异常:{}", e);// 编写异常信息}}

接收导入Excel 数据实体
xxxRosterData

package com.xx.xx.xx.entity.excel;import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;/*** @author psd xxx导入excel 接收数据实体**/
@Data
public class xxxRosterData {/*** 值班时间str*/@ExcelProperty(value = "日期",order = 0)private String dutyTimeStr;/*** 人员名称*/@ExcelProperty(value = "人员名称",order = 1)private String person;}

2,编写监听器

package com.xxx.xx.xx.listener;import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.xx.xx.common.result.ResultCodeEnum;
import com.xx.xx.common.utils.DateUtils;
import lombok.Data;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.util.CollectionUtils;import java.util.*;
import java.util.stream.Collectors;/*** @author psd 创建xx信息导入监听器*/
@Data
public class xxxRosterDataListener extends AnalysisEventListener<xxxRosterData> {XXXRosterMapper xxxRosterMapper;/*** 记录批量导入数据*/private List<xxxRosterEntity> batchInsertDutyList = new ArrayList<>();/*** 记录需要更新的数据*/private List<xxxRosterEntity> batchUpdateDutyList = new ArrayList<>();/*** 记录错误的数据*/private List<xxxRosterErrorData> errorDataList = new ArrayList<>();/*** 记录没有问题的数据集合*/private List<xxxxRosterEntity> normalData = new ArrayList<>();// 创建构造器 引入用到的service mapper...public xxRosterDataListener(xxxRosterMapper dutyRosterMapper) {this.xxRosterMapper = xxxRosterMapper;}/*** 每一条数据都会解析* * @param data*            每行数据* @param analysisContext*/@Overridepublic void invoke(xxxRosterData data, AnalysisContext analysisContext) {// 1、添加常见的行数校验// 2、参数校验if (validateData(data)) {// 说明没有问题// 3、编写要导入的数据对象信息放入normalData.add(xxx);}}/*** 常见的数据校验* * @param data*            每一行的数据集* @return 是否异常 true 数据基本判断没有问题,false 说明有异常*/private boolean validateData(xxxxRosterData data) {StringBuffer errorMsg = new StringBuffer();// 清空字符串errorMsg.setLength(ConstantUtils.ZERO);// 添加数据校验if (StringUtils.isBlank(errorMsg)) {// 说明没有问题	return true;} else {// 记录错误信息 errorDataList.add();return false;}}/*** 所有数据执行完才会调用* * @param analysisContext*/@Overridepublic void doAfterAllAnalysed(AnalysisContext analysisContext) {// 1、获取没有问题的数据// 2、判断哪些是新增的 哪些是需要修改的// 3、批量入库。。。}
}

常见遇到的问题:

问题一:

下载模板导入Excel时候明明写了数据,但是错误数据还是为空的问题,或者导入不成功?
原因是:
1,Excel的表头字段名字要和接收的数据Vo对象里面的字段名称一致
比如:
Excel模板中的表头为:

在这里插入图片描述
数据接收对象的字段名称为
在这里插入图片描述
导致接收不到
2,有可能是排序的问题,比如上图日期在第一位,但是数据xxxData实体类接收对象
order = 不是0,也会导致没有接收到数据

问题二:

在监听器添加注解比如@Component … 或者其他注解,使用@Autowired 、或者@Resources注解引入xxxService 、xxxMapper ,引入的service和mapper无法使用
这个是因为监听器不支持这种引入,可以通过构造器方式将数据传递过去,监听器不是放在spring容器中【这点是自己的理解,可能有误】

问题三:

错误信息如何导出?
我们可以在监听器添加@Data注解通过getxxx()方式获取错误数据,可以做成导出Excel功能。

@Data
public class xxxRosterDataListener extends AnalysisEventListener<xxxRosterData> {/*** 记录错误的数据*/private List<xxxRosterErrorData> errorDataList = new ArrayList<>();......
}
 @Overridepublic void importxxxRoster(MultipartFile file, HttpServletResponse response) {try {.....// 获取错误信息集合List<DutyRosterErrorData> errorDataList = listener.getErrorDataList();if (!CollectionUtils.isEmpty(errorDataList)) {// 导出Excel}} catch (IOException e) {// 抛异常 ...}}

喜欢我的文章的话,点个阅读或者点个点赞,是我编写博客的动力,持续更新中 ing…

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

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

相关文章

[Java安全入门]三.URLDNS链

一.前言 在初步学习java的序列化和反序列化之后&#xff0c;这里学习java反序列化漏洞的一个利用链&#xff0c;也是比较基础的一条链。 由于URLDNS不需要依赖第三方的包&#xff0c;同时不限制jdk的版本&#xff0c;所以通常用于检测反序列化的点。 二.代码展开分析 构造链 …

Spring AOP 原理

&#x1f496; AOP 介绍 AOP&#xff0c;也就是 Aspect-oriented Programming&#xff0c;译为面向切面编程。 简单点说&#xff0c;就是把一些业务逻辑中的相同代码抽取到一个独立的模块中&#xff0c;让业务逻辑更加清爽。 举个例子&#xff0c;假如我们现在需要在业务代码…

Error while Deploying HAP

第一个程序就遇到这么恶心的bug&#xff0c;也查了很多类似的问题是什么情况&#xff0c;后来无意中菜解决了这个bug&#xff0c;确实也是devicps下面加一个参数&#xff0c;但是找了半天 这是我遇到这个问题的解决办法。其他解决办法如下&#xff1a; https://blog.51cto.com…

Leetcode 第 387 场周赛题解

Leetcode 第 387 场周赛题解 Leetcode 第 387 场周赛题解题目1&#xff1a;3069. 将元素分配到两个数组中 I思路代码复杂度分析 题目2&#xff1a;3070. 元素和小于等于 k 的子矩阵的数目思路代码复杂度分析 题目3&#xff1a;3071. 在矩阵上写出字母 Y 所需的最少操作次数思路…

linux:线程的控制

个人主页 &#xff1a; 个人主页 个人专栏 &#xff1a; 《数据结构》 《C语言》《C》《Linux》 文章目录 前言一、线程的总结1. 线程的优点2. 线程的缺点3. 线程异常4.线程和进程 二、线程的控制创建线程线程终止线程等待获取返回值 线程分离 总结 前言 本文作为我对于线程的…

[技术杂谈]解决右键没有vscode打开选项的问题

问题&#xff1a; 点击鼠标右键没有‘使用vscode打开’的选项。 原因&#xff1a; 在安装时没有勾选相关选项 解决办法&#xff1a; 新建一个reg文件写入下面文件&#xff0c;注意替换自己真实Code.exe路径 Windows Registry Editor Version 5.00[HKEY_CLASSES_ROOT\*\she…

深入理解Java多线程与线程池:提升程序性能的利器

✨✨谢谢大家捧场&#xff0c;祝屏幕前的小伙伴们每天都有好运相伴左右&#xff0c;一定要天天开心哦&#xff01;✨✨ &#x1f388;&#x1f388;作者主页&#xff1a; 喔的嘛呀&#x1f388;&#x1f388; 目录 引言 一、实现多线程 1.1. 继承Thread类 1.2. 实现Runnab…

深入浅出计算机网络 day.1 概论③ 电路交换、分组交换和报文交换

人无法同时拥有青春和对青春的感受 —— 04.3.9 内容概述 01.电路交换、分组交换和报文交换 02.三种交换方式的对比 一、电路交换、分组交换和报文交换 1.电路交换 计算机之间的数据传送是突发式的&#xff0c;当使用电路交换来传送计算机数据时&#xff0c;其线路的传输效率一…

构建可靠的数据基础:HDFS的架构优势与基本操作

目录 写在前面一、 HDFS概述1.1 HDFS简介1.2 HDFS优缺点1.2.1 优点1.2.2 缺点 1.3 HDFS组成架构1.4 HDFS文件块大小 二、HDFS的Shell操作&#xff08;开发重点&#xff09;2.1 基本语法2.2 命令大全2.3 常用命令实操2.3.1 上传2.3.2 下载2.3.3 HDFS直接操作 三、HDFS的API操作3…

代码随想录算法训练营第四十六天| 139.单词拆分、背包总结

文章目录 1.单词拆分[2.背包总结] 1.单词拆分 给你一个字符串 s 和一个字符串列表 wordDict 作为字典。如果可以利用字典中出现的一个或多个单词拼接出 s 则返回 true。 注意&#xff1a;不要求字典中出现的单词全部都使用&#xff0c;并且字典中的单词可以重复使用。 示例 1…

使用VBA快速梳理多层级族谱(组织架构)

实例需求&#xff1a;族谱&#xff08;或者公司组织架构等&#xff09;都是典型的带有层级关系数据&#xff0c;例如下图中左侧表格所示。 A列为层级&#xff08;准确的讲是B列成员的层级&#xff09;&#xff0c;从一开始递增B列和C列为成员直接的父&#xff08;/母&#xff…

项目解决方案:视频监控接入和录像系统设计方案(下)

目 录 1.概述 2. 建设目标及需求 2.1建设总目标 2.2 需求描述 ​2.3 需求分析 3.设计依据与设计原则 3.1设计依据 3.2 设计原则 4.建设方案设计 4.1系统方案设计 4.2组网说明 5.产品介绍 5.1视频监控综合资源管理平台介绍 5.2视频录像服务器和存储 5.2.…

PostgreSQL中In, Exists在SQL查询中到底有无区别

前言 SQL查询当中&#xff0c;In和Exists子查询到底有无区别&#xff1f;记得很多年以前&#xff0c;确实是有相关的使用戒条的&#xff0c;或者说存在一些使用的惯用法。试图完全抹开两者的区别&#xff0c;就有点过了。 两者的主要区别&#xff1a; 从目的上讲&#xff0c…

数据库create详细用法

数据库版本&#xff1a;KingbaseES V008R006C008B0014 简介 本篇文章主要以kingbase为例介绍创建表的基本语法、使用案例和添加描述等方法&#xff0c;在目录2、目录3再详细介绍数据类型和列级约束。 文章目录如下 1. 基本用法 1.1. 基础语法 1.2. 基础案例 1.3. 添加描述 …

防御保护作业六

实验拓扑图&#xff1a; 配置过程&#xff1a; FW1 自定义服务ike 创建nat策略&#xff0c;让10.0.2.0/24访问192.168.1.0/24的流量不进行nat转换,并将这条策略置于nat策略最上面&#xff0c;优先匹配 FW3 测试

vmware添加新磁盘

文章目录 前言一、新增磁盘二、初始化磁盘1.查看2.初始化3.挂载 总结 前言 虚拟机磁盘空间很散乱&#xff0c;大部分都在/root和/home下不好操作&#xff0c;故考虑新增磁盘、增加挂载点。 一、新增磁盘 右键打开虚拟机设置 二、初始化磁盘 1.查看 fdisk -l2.初始化 …

基于SpringBoot在线考试系统

基于SpringBootHtmlJavascript css 的在线考试系统 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBootMyBatis 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 一、项目背景 现在大家正处于互联网加的时代&#xff0c;这个时代它就是一个信息内…

Java 学习和实践笔记(33):多态详解

多态&#xff08;polymorphism): 不同的对象&#xff0c;调用同一个方法&#xff0c;对象的行为状态可能完全不同&#xff0c;也就是说&#xff0c;有多种状态&#xff0c;这种情况就叫做多态。 以下的例子里&#xff0c;同样都是人吃饭这个方法&#xff0c;但是不同的人使用吃…

【SpringBoot框架篇】36.整合Tess4J搭建提供图片文字识别的Web服务

文章目录 简介文件下载引入依赖main函数中使用基于Springboot搭建OCR Web服务配置traineddata路径枚举用到的语种类型定义接口响应的json数据格式封装OCR服务引擎编写web提供服务的接口启动服务并且测试html demo扩展 项目配套代码 简介 Tess4J是一个基于Tesseract OCR引擎的J…

网上超市系统|基于Springboot的网上超市系统设计与实现(源码+数据库+文档)

网上超市系统目录 目录 基于Springboot的网上超市系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、商品信息管理 2、用户管理 1、 商品信息 2、购物车 四、数据库设计 1、实体ER图 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、…