EasyExcel导入及自定义导入

1.maven

        <!-- Excel --><dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.3.1</version></dependency>

2.默认使用

            List<CrmInvestmentImport> crmInvestmentImportList = EasyExcel.read(FileConfig.Path + importJobAvg.getFilePath()).head(CrmInvestmentImport.class).sheet("Sheet1").doReadSync();

         指定导入excel中指定列名对应字段

@Data
public class CrmInvestmentImport {@ExcelProperty("来源")private String client_source;@ExcelProperty("省")private String province;
}

3.自定导入-匹配注解标签中指定的任意一个

        当有多个导入模板时,一个字段title对应多个excel中的列名,比如模板1中的标题,模板2中的故障代码,模板3中的测试项目;这种方式默认是不支持的,需要自定义匹配标签中的任意一个.

@Data
public class QualityIssuesImport {//region 标准部分@ExcelProperty("行号(必填)")private String line_no;@ExcelProperty("单据类型")private String order_type;//单据类型,客诉/实验室品质/制程品质/售后品质@ExcelProperty({"标题(必填)", "故障代码", "测试项目"})private String title;//问题
}

        自定义监听器EasyExcelCustomListener

package mis.shared.config;import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.excel.exception.ExcelAnalysisException;
import org.springframework.util.StringUtils;import java.lang.reflect.Field;
import java.util.*;public class EasyExcelCustomListener extends AnalysisEventListener<Map<Integer, String>> {private Map<String, Integer> fieldValue = new HashMap<>();public List<Object> list = new ArrayList<>();private Map<Integer, String> headMap;public Class<?> classType;public EasyExcelCustomListener() {}public EasyExcelCustomListener(Class<?> classType) {this.classType = classType;}/*** 数据表头获取,表头位置对应*/@Overridepublic void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {this.headMap = headMap;fieldValue.putAll(fieldValueSet(headMap, classType));super.invokeHeadMap(headMap, context);}/*** 数据一条一条解析*/@Overridepublic void invoke(Map<Integer, String> data, AnalysisContext analysisContext) {if (fieldValue.isEmpty()) {throw new ExcelAnalysisException("模板错误");}Object obj = null;try {obj = classType.newInstance();} catch (InstantiationException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();}setFieldValue(data, fieldValue, obj);list.add(obj);}@Overridepublic void doAfterAllAnalysed(AnalysisContext context) {}/*** 根据表头获取列所在位置* 匹配注解ExcelProperty指定的任意一个,原生的不支持** @param headMap 表头map* @param cla     对应解析类*/public static Map<String, Integer> fieldValueSet(Map<Integer, String> headMap, Class<?> cla) {Map<String, Integer> fieldValue = new HashMap<>();Field[] fields = cla.getDeclaredFields();for (Field field : fields) {//遍历每个属性if (field.isAnnotationPresent(ExcelProperty.class)) {ExcelProperty excelProperty = field.getAnnotation(ExcelProperty.class);for (Map.Entry<Integer, String> entry : headMap.entrySet()) {if (entry == null || !StringUtils.hasLength(entry.getValue())) {continue;}String headValue = entry.getValue();//兼容阿里巴巴全部匹配,原始数据if (Arrays.asList(excelProperty.value()).contains(headValue)) {fieldValue.put(field.getName(), entry.getKey());break;}//去掉空格、换行符后再匹配headValue = entry.getValue().replace(" ", "").replace("\n", "");if (Arrays.asList(excelProperty.value()).contains(headValue)) {fieldValue.put(field.getName(), entry.getKey());break;}}}}return fieldValue;}/*** 字段值赋值** @param valueMap   值对应所在位置* @param obj        实体类* @param fieldValue 表头对应所在位置*/public static void setFieldValue(Map<Integer, String> valueMap, Map<String, Integer> fieldValue, Object obj) {Field[] fields = obj.getClass().getDeclaredFields();for (Field field : fields) {//遍历每个属性if (field.isAnnotationPresent(ExcelProperty.class) && fieldValue.containsKey(field.getName())) {field.setAccessible(true);try {Class<?> fieldType = field.getType();String value = valueMap.get(fieldValue.get(field.getName()));field.set(obj, stringToTarget(value, fieldType));} catch (Exception e) {e.printStackTrace();}}}}//String转换为指定类型public static Object stringToTarget(String string, Class<?> t) throws Exception {boolean nullOrEmpty = !StringUtils.hasLength(string);if (String.class.equals(t)) {return string;}if (double.class.equals(t)) {return nullOrEmpty ? 0 : Double.parseDouble(string);} else if (long.class.equals(t)) {return nullOrEmpty ? 0 : Long.parseLong(string);} else if (int.class.equals(t)) {return nullOrEmpty ? 0 : Integer.parseInt(string);} else if (float.class.equals(t)) {return nullOrEmpty ? 0 : Float.parseFloat(string);} else if (short.class.equals(t)) {return nullOrEmpty ? 0 : Short.parseShort(string);} else if (boolean.class.equals(t)) {return nullOrEmpty ? 0 : Boolean.parseBoolean(string);} else if (Number.class.isAssignableFrom(t)) {return t.getConstructor(String.class).newInstance(nullOrEmpty ? "0" : string);} else {return nullOrEmpty ? "" : t.getConstructor(String.class).newInstance(string);}}public List<Object> getList() {return list;}public Map<Integer, String> getHeadMap() {return this.headMap;}
}

        兼容多种模板的自定义导入主代码

           EasyExcelCustomListener easyExcelCustomListener = new EasyExcelCustomListener(QualityIssuesImport.class);ExcelReader excelReader = EasyExcel.read(FileConfig.Path + importJobAvg.getFilePath()).build();ReadSheet readSheet = EasyExcel.readSheet("Sheet1").registerReadListener(easyExcelCustomListener).build();excelReader.read(readSheet);excelReader.finish();excelReader.close();List<Object> qualityIssuesList = easyExcelCustomListener.getList();

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

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

相关文章

触控板窗口管理软件Swish mac中文版

Swish mac是一款触控板窗口管理工具&#xff0c;它允许用户通过简单的手势来控制窗口。Swish利用MacBook的触控板&#xff0c;使得用户可以更加便捷地管理窗口。它支持多种手势&#xff0c;例如捏合、拖动、放大和缩小等&#xff0c;使得用户可以轻松地实现窗口的切换、最小化、…

Milvus入门手册1.0

一、window环境搭建&#xff08;单机&#xff09; 1、docker安装 略 2、milvus安装 参考文档&#xff1a;https://milvus.io/docs/install_standalone-docker.md tips: &#xff08;1&#xff09;compose.yaml下载比较慢&#xff0c;可以在网络上找一份。 &#xff08;2&…

VScode集成python开发环境和基本插件下载配置

VSCode开发工具 下载VSCode VSCode官方首页&#xff1a;Visual Studio Code - Code Editing. Redefined 点击Download for Windows下载 安装过程一路下一步即可&#xff0c;其中建议勾选 将"通过Code打开"操作添加到Windows资源管理器目录上下文菜单方便我们直接通过…

虹科Pico汽车示波器 | 汽车免拆检修 | 2016款东风悦达起亚K5车发动机怠速抖动严重、加速无力

一、故障现象 一辆2016款东风悦达起亚K5车&#xff0c;搭载G4FJ发动机&#xff0c;累计行驶里程约为8.2万km。该车发动机怠速抖动严重、加速无力&#xff0c;同时发动机故障灯异常点亮&#xff0c;为此在其他维修厂更换了所有点火线圈和火花塞&#xff0c;故障依旧&#xff0c;…

309.最佳卖股票的时机包含冷冻期

一、题目分析 给定一个整数数组prices&#xff0c;其中第 prices[i] 表示第 i 天的股票价格 。​ 设计一个算法计算出最大利润。在满足以下约束条件下&#xff0c;你可以尽可能地完成更多的交易&#xff08;多次买卖一支股票&#xff09;: 卖出股票后&#xff0c;你无法在第二…

Nacos源码本地搭建流程及目录结构解读

下载地址 https://github.com/alibaba/nacos 目录结构 本地单机启动 首先maven编译完成之后在console下面找到Nacos 这个就是主启动类 然后再vm中配置参数-Dnacos.standalonetrue表示单机启动 当控制台没有报错 访问 http://localhost:8848/nacos 控制台界面登录进来之后显…

Linux—进程状态、僵尸进程、孤独进程、优先级

&#x1f4d8;北尘_&#xff1a;个人主页 &#x1f30e;个人专栏:《Linux操作系统》《经典算法试题 》《C》 《数据结构与算法》 ☀️走在路上&#xff0c;不忘来时的初心 文章目录 一、进程状态二、僵尸进程、孤儿进程1、Z(zombie)-僵尸进程2、僵尸进程危害3、孤儿进程 三、进…

C++——vector基本概念,构造函数,赋值操作与容量和大小

一.vector基本概念 功能:vector数据结构和数组非常类似,也称为单端数组 vector与普通数组的区别:不同之处在于数组是静态空间,而vectors可以动态扩展 动态扩展:并不是在原空间之后继续接新空间,而是找更大的内存空间,然后将原有数据拷贝新空间,释放原有空间 vector容器内部结…

String类讲解(1)

&#x1f435;本篇文章将讲解String类及其包含的方法 一、介绍String类 String属于引用类型&#xff0c;String类是Java的一个内置类&#xff0c;用于表示字符串&#xff0c;String类中具有许多方法&#xff0c;可以用来操作和处理字符串 二、字符串的构造 下面介绍三种构造字…

蓝桥杯每日一题2023.11.27

题目描述 星系炸弹 - 蓝桥云课 (lanqiao.cn) 题目分析 对于此题目一一枚举即可 #include<bits/stdc.h> using namespace std; bool is_r(int n) {if((n % 4 0 && n % 100 ! 0)|| n % 400 0)return true;return false; } int mm[13] {0, 31, 28, 31, 30, 3…

万字详解,和你用RAG+LangChain实现chatpdf

像chatgpt这样的大语言模型(LLM)可以回答很多类型的问题,但是,如果只依赖LLM,它只知道训练过的内容,不知道你的私有数据:如公司内部没有联网的企业文档,或者在LLM训练完成后新产生的数据。(即使是最新的GPT-4 Turbo,训练的数据集也只更新到2023年4月)所以,如果我们…

Docker入门教程

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

微服务--02--Nacos注册中心

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 服务注册和发现手动发送Http请求的方式存在问题注册中心原理 Nacos注册中心配置服务注册服务发现小结&#xff1a; 服务注册和发现 手动发送Http请求的方式存在问题…

Android使用WebView展示本地html网页

Android使用WebView展示本地html网页 1、在assets目录下新建html文件 新建agreement.html文件&#xff0c;内容如下&#xff1a; <html> <head><title>用户协议</title> </head> <body> <h1>用户协议</h1> </body> &…

Compensated Summation/Kahan‘s Summation的理解

阅读《Efficient Generation of Error-Inducing Floating-Point Inputs via Symbolic Execution》这篇论文时&#xff0c;文中提到的Commpensated Summation没看太懂&#xff0c;代码如下&#xff1a; 查阅资料发现Compensated Summation也叫Kahan’s Summation&#xff0c;该…

Termius 一款优秀的跨平台 SSH 客户端工具

&#x1f525;&#x1f525;&#x1f525; 作为程序员或者运维管理人员&#xff0c;我们经常需要使用终端工具来进行服务器管理及各种操作&#xff0c;比如部署项目、调试代码、查看/优化服务、管理服务器等。 而实现远程服务器连接需要借助 SSH 协议来进行&#xff0c;SSH&am…

青少年CTF之PHP特性练习(1-5)

青少年CTF-PHP特性练习 文章目录 青少年CTF-PHP特性练习PHP特性01PHP特性02PHP特性03PHP特性04PHP特性05 PHP特性01 看给出的源码&#xff0c;两个变量的值加密后的MD5相同 <?php$s1 "%af%13%76%70%82%a0%a6%58%cb%3e%23%38%c4%c6%db%8b%60%2c%bb%90%68%a0%2d%e9%47…

使用Pytorch从零开始构建Energy-based Model

知识回顾: [1] 生成式建模概述 [2] Transformer I&#xff0c;Transformer II [3] 变分自编码器 [4] 生成对抗网络&#xff0c;高级生成对抗网络 I&#xff0c;高级生成对抗网络 II [5] 自回归模型 [6] 归一化流模型 [7] 基于能量的模型 [8] 扩散模型 I, 扩散模型 II 在本教程中…

Intel Software Guard Extensions简介

文章目录 前言一、新的基于硬件的控件实现数据安全二、机密计算的挑战三、用于机密计算的增强安全功能四、Enclave验证和数据密封五、数据中心认证参考资料 前言 最近开始研究Intel SGX硬件特性&#xff0c;记录下研究过程。 参考文档&#xff1a;product-brief-SGX 一、新的…

CF 1901B Chip and Ribbon 学习笔记

链接 传送门 代码 #include<bits/stdc.h> using namespace std;typedef long long LL;const int N2e510; LL a[N],c[N];int main() {int t;scanf("%d",&t);while(t--){int n;scanf("%d",&n);LL sum0;for(int i1;i<n;i){scanf("%l…