【工具类】Excel 多 Sheet 导入工具类

使用反射封装,实现统一读取

import cn.afterturn.easypoi.excel.annotation.Excel;
import cn.afterturn.easypoi.excel.annotation.ExcelTarget;
import cn.hutool.core.annotation.AnnotationUtil;
import cn.hutool.core.io.IoUtil;
import cn.hutool.core.util.ReflectUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.poi.excel.ExcelReader;
import cn.hutool.poi.excel.ExcelUtil;import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.lang.reflect.Field;
import java.util.*;
import java.util.stream.Collectors;/*** 【工具类】Excel 多 Sheet 导入工具类** @author jason*/
public class ExcelSheetUtil {/*** 获取 Sheet 名字*/public static <T> String getSheetName(Class<T> clazz) {return AnnotationUtil.getAnnotationValue(clazz, ExcelTarget.class, "value");}/*** 读取多个sheet** @param inputStream* @param classList* @return*/public static Map<String, List<?>> readExcelList(InputStream inputStream, List<Class<?>> classList) {Map<String, List<?>> sheetMap = new HashMap<>();// 解决 InputStream 流只能读一次的问题,复制一个 ByteArrayOutputStreamByteArrayOutputStream cacheInputStream = new ByteArrayOutputStream();IoUtil.write(cacheInputStream, true, IoUtil.readBytes(inputStream));classList.forEach(tClass -> {String sheetName = AnnotationUtil.getAnnotationValue(tClass, ExcelTarget.class, "value");InputStream inputStreamSingleton = new ByteArrayInputStream(cacheInputStream.toByteArray());List<?> excelData3List = readExcelList(sheetName, inputStreamSingleton, tClass);sheetMap.put(sheetName, excelData3List);});return sheetMap;}/*** 读取单个sheet** @param sheetName* @param inputStream* @param clazz* @param <T>* @return*/public static <T> List<T> readExcelList(String sheetName, InputStream inputStream, Class<T> clazz) {ExcelReader excelReader = ExcelUtil.getReader(inputStream, sheetName);List<Map<String, Object>> mapList = excelReader.read(0, 0, Integer.MAX_VALUE);excelReader.close();return Optional.ofNullable(mapList).orElse(new ArrayList<>()).stream().map(itemMap -> {T excelData = ReflectUtil.newInstance(clazz);Field[] fields = ReflectUtil.getFields(clazz);for (Field field : fields) {String key = AnnotationUtil.getAnnotationValue(field, Excel.class, "name");String value = StrUtil.toStringOrNull(itemMap.get(key));ReflectUtil.setFieldValue(excelData, field, value);}return excelData;}).collect(Collectors.toList());}}

使用

import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.io.FileUtil;
import com.excel.tool.putuo.excel.ExcelData0;
import com.excel.tool.putuo.excel.ExcelData1;
import com.excel.tool.putuo.excel.ExcelData2;
import com.excel.tool.putuo.excel.ExcelData3;
import com.excel.tool.putuo.util.ExcelSheetUtil;
import lombok.SneakyThrows;import java.io.File;
import java.io.InputStream;
import java.util.List;
import java.util.Map;public class TestMain {public static void main(String[] args) {File xlsx = FileUtil.file("数据11.21.xlsx");TestMain.startExcel(FileUtil.getInputStream(xlsx));}@SneakyThrowspublic static <T> void startExcel(InputStream inputStream) {List<Class<?>> classList = CollectionUtil.newArrayList(ExcelData0.class,ExcelData1.class,ExcelData2.class,ExcelData3.class);Map<String, List<?>> sheetMap = ExcelSheetUtil.readExcelList(inputStream, classList);List<ExcelData0> excelData0List = (List<ExcelData0>) sheetMap.get(ExcelSheetUtil.getSheetName(ExcelData0.class));List<ExcelData1> excelData1List = (List<ExcelData1>) sheetMap.get(ExcelSheetUtil.getSheetName(ExcelData1.class));List<ExcelData2> excelData2List = (List<ExcelData2>) sheetMap.get(ExcelSheetUtil.getSheetName(ExcelData2.class));List<ExcelData3> excelData3List = (List<ExcelData3>) sheetMap.get(ExcelSheetUtil.getSheetName(ExcelData3.class));System.out.println();}}

实体定义

import cn.afterturn.easypoi.excel.annotation.Excel;
import cn.afterturn.easypoi.excel.annotation.ExcelTarget;
import lombok.Data;
import lombok.experimental.Accessors;@Data
@Accessors(chain = true)
@ExcelTarget(value = "整表")
public class ExcelData0 {@Excel(name = "序号")private String num;@Excel(name = "来源")private String mediaType;@Excel(name = "发布时间")private String publishTime;@Excel(name = "作者")private String author;@Excel(name = "标题")private String title;@Excel(name = "摘要")private String digest;@Excel(name = "原文链接")private String link;}

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

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

相关文章

创建个人网站(一)从零开始配置环境,搭建项目

目录 前言配置环境前端后端遇到的问题1.安装了nvm和node&#xff0c;vscode没反应2.安装完脚手架之后vue指令不存在 前言 从刚开始学前端的html直到现在前后端都有在开发&#xff0c;我一直都有一个想法&#xff0c;就是创建自己的网站&#xff0c;我相信大家都有这个想法&…

uni-app 设置当前page界面进入直接变为横屏模式

首先 我们打开项目的 manifest.json 在左侧导航栏中找到 源码视图 然后找到 app-plus 配置 在下面加上 "orientation": [//竖屏正方向"portrait-primary",//竖屏反方向"portrait-secondary",//横屏正方向"landscape-primary",//横屏…

99、NeRF ray space

CG相机模型 在图形学中最常用的相机模型的原理和小孔成像是类似的。 不同之处在于&#xff0c;如上图&#xff0c;小孔成像得到的图像是倒立的&#xff0c;但是我们希望得到的图像是正向的&#xff0c;因此&#xff0c;我们选择小孔前成像。 从 3D 到 2D 的投影&#xff0c;…

Grad-CAM原理

这篇是我对哔哩哔哩up主 霹雳吧啦Wz 的视频的文字版学习笔记 感谢他对知识的分享 只要大家一提到深度学习 缺乏一定的解释性 比如说在我们之前讲的分类网络当中 网络它为什么要这么预测 它针对每个类别所关注的点在哪里呢 在great cam这篇论文当中呢 就完美的解决了在cam这篇论…

java多线程(常用方法、实现方式、线程安全问题、生命周期、线程池)

多线程相关的三组概念 程序和进程 程序&#xff08;program&#xff09;&#xff1a;一个固定的运行逻辑和数据的集合&#xff0c;是一个静态的状态&#xff0c;一般存储在硬盘中。简单来说就是我们编写的代码 进程&#xff08;process&#xff09;&#xff1a;一个正在运行的…

Python 中的 queue 模块队列详解;队列如何使用——如何处理信息在多个线程间安全交换的多线程程序?

queue 模块即队列&#xff0c;特别适合处理信息在多个线程间安全交换的多线程程序中。下面我们对 queue 模块进行一个详细的使用介绍。 1 queue 模块定义的类和异常 queue 模块定义了以下四种不同类型的队列&#xff0c;它们之间的区别在于数据入队列之后出队列的顺序不同。 …

cmake编译数据库

在使用CMake进行编译时&#xff0c;如果你想生成编译数据库&#xff0c;你可以定义CMAKE_EXPORT_COMPILE_COMMANDS选项。具体的命令如下&#xff1a; cmake -DCMAKE_EXPORT_COMPILE_COMMANDS1或者在CMakeLists.txt显示的使能配置 set(CMAKE_EXPORT_COMPILE_COMMANDS ON)这将会…

游戏玩家升级不伤手之选,光威龙武系列超强性能

得益于国产存储芯片的崛起&#xff0c;现在的内存条价格太香了。要放在前几年&#xff0c;购买内存条时都会优先考虑国际一线品牌。随着内存条行业发生巨变&#xff0c;国产品牌光威GLOWAY&#xff0c;是全球前三的内存模组厂商嘉合劲威旗下品牌&#xff0c;它推出的内存条产品…

Zebec 推出由 Visa、万事达网络支持的即时支付卡,加密支付新征程

“Zebec现已推出全新的加密支付卡&#xff0c;该卡由Visa、万事达网络支持&#xff0c;具备即时、多链、非托管、无需KYC、免费等特性&#xff0c;其能够通过加密钱包与多条主流公链链接并直接调用支付&#xff0c;这将是加密支付领域的里程碑事件。” 在2023年的12月8日&#…

C++中的string容器的substr()函数

一、作用 用来截取某段字符串。 二、头文件 #include<string> 三、参数与用法 形式&#xff1a;s.substr(pos, len) 第一个参数是想要截取的字符串初始位置&#xff0c;第二个参数是截取字符串长度。 直接来说&#xff0c;就是从s[pos]开始截一个长度为len的子串。…

【python交互界面】实现动态观察图像在给定HSV范围的区域显示

HSV颜色空间 与RGB颜色空间相比&#xff0c;HSV颜色空间更适合进行颜色分析和提取特定颜色的目标。在HSV空间中&#xff0c;颜色信息被分布在不同的通道上&#xff0c;使我们能够更准确地定义颜色的范围&#xff0c;并使用阈值操作轻松地分离出我们感兴趣的区域部分。 HSV三个通…

二叉树查找值为x的结点(C语言)

目录 前言 查找值为x的结点 返回值为指针 返回值为布尔类型 整体代码 前言 在二叉树结点个数、叶子结点个数、树的高度、第k层结点个数的计算&#xff08;C语言&#xff09;中&#xff0c;我们解决了关于二叉树的部分问题&#xff0c;但是还有一个问题我们放在本篇解决。 …

数据集成和人工智能驱动的见解

数字时代使数据成为人们关注的焦点&#xff0c;将其从单纯的二进制序列转变为有价值的组织资产。随着企业越来越多地转向数据驱动战略&#xff0c;数据管理的复杂性也随之增加。当前的任务不仅仅是存储甚至收集数据&#xff0c;而是将其转化为可操作的情报。本博客旨在剖析寻求…

Python中的selenium安装的步骤(浏览器自动化测试框架)

一、前言 我们今天要安装的selenium 就是浏览器自动化测试框架&#xff0c;是一个用于Web应用程序的测试工具&#xff0c;就是模拟用户操作。支持的浏览器包括Chrome&#xff0c;IE&#xff0c;Mozilla Firefox&#xff0c;Safari&#xff0c;Opera等。今天我们以Chrome为例讲…

STM32单片机项目实例:基于TouchGFX的智能手表设计(2)UI交互逻辑的设计

STM32单片机项目实例&#xff1a;基于TouchGFX的智能手表设计&#xff08;2&#xff09;UI交互逻辑的设计 目录 一、UI交互逻辑的设计 1.1 硬件平台的资源 1.2 界面切换功能 ​​​​​​​1.3 表盘界面 1.4 运动界面 ​​​​​​​1.6 设置界面 ​​​​​​​1.7 应…

不一样的年会彩瞳推荐,绮芙莉多款彩瞳彰显个性

临近年底&#xff0c;各种公司年会、跨年晚会活动也逐渐排上日程&#xff0c;出席这种正式场合&#xff0c;每个人都有自己的“杀手锏”&#xff0c;从发型妆容到穿搭都是变美小细节&#xff0c;作为心灵之窗的双眸&#xff0c;更需要一副彩瞳来提升我们的眼妆质感&#xff0c;…

微前端 ---- wujie-vue3 原理

目录 前言 设置子应用​ 预加载​ 启动子应用​ 封装 1.创建文件 2.安装依赖 3.编写组件 4.配置打包规则 5.执行打包命令 swc技术 SWC Babel Babel VS SWC 更改使用 swc 解析 使用swc 完成 esm 模式 &#xff08;export--import&#xff09; 发布到npm 更改p…

【SpringBoot】解析Springboot事件机制,事件发布和监听

解析Springboot事件机制&#xff0c;事件发布和监听 一、Spring的事件是什么二、使用步骤2.1 依赖处理2.2 定义事件实体类2.3 定义事件监听类2.4 事件发布 三、异步调用3.1 启用异步调用3.2 监听器方法上添加 Async 注解 一、Spring的事件是什么 Spring的事件监听&#xff08;…

持续集成交付CICD:使用Jenkins插件上传Nexus制品

目录 一、实验 1.使用Jenkins插件上传Nexus制品 一、实验 1.使用Jenkins插件上传Nexus制品 &#xff08;1&#xff09;Jenkins安装插件Nexus Artifact Uploader &#xff08;2&#xff09;添加凭据 &#xff08;3&#xff09;使用片段生成器生成DSL &#xff08;4&#xf…

基于Java物业管理系统

基于Java物业管理系统 功能需求 1、房产信息管理&#xff1a;系统需要提供房产信息管理功能&#xff0c;包括房产的基本信息、租赁状态、业主信息等。 2、报修管理&#xff1a;系统需要提供报修管理功能&#xff0c;业主可以通过系统提交报修申请&#xff0c;物业管理人员可…