【工具類】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.pswp.cn/news/210431.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/210431.shtml
英文地址,請注明出處:http://en.pswp.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;物業管理人員可…