Java?easyExcel的復(fù)雜表頭多級表頭導(dǎo)入
首先要了解
easyExcel怎么獲取表頭 直接貼代碼就不廢話了
import com.alibaba.excel.context.AnalysisContext; import com.alibaba.excel.event.AnalysisEventListener; import lombok.Data; import java.util.*; @Data public class AnalysisEventMonitor extends AnalysisEventListener<Map<Integer, String>> { /** * 存儲Key */ Map<Integer, String> key = new HashMap<>(); /** * keuList */ List<String> keyList=new ArrayList<>(); public AnalysisEventMonitor() { } /** * 重寫invokeHeadMap方法,獲去表頭,如果有需要獲取第一行表頭就重寫這個方法,不需要則不需要重寫 * * @param headMap Excel每行解析的數(shù)據(jù)為Map<Integer, String>類型,Integer是Excel的列索引,String為Excel的單元格值 * @param context context能獲取一些東西,比如context.readRowHolder().getRowIndex()為Excel的行索引,表頭的行索引為0,0之后的都解析成數(shù)據(jù) */ @Override public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) { Set<Integer> integerSet = headMap.keySet(); for (Integer integer : integerSet) { keyList.add(headMap.get(integer)); } key.putAll(headMap); } @Override public void doAfterAllAnalysed(AnalysisContext context) { } @Override public void invoke(Map<Integer, String> integerStringMap, AnalysisContext analysisContext) { } }
這塊代碼就是用于easyExcel讀取excel表格的時候攔截表頭
類自己創(chuàng)建 繼承AnalysisEventListener 就可以 然后重寫她的invokeHeadMap方法就可以獲取到excel 的一級表頭了。
下面導(dǎo)入文件一塊的代碼
//加載攔截器 作用于 獲取表頭 AnalysisEventMonitor analysisEventMonitor = new AnalysisEventMonitor (); //讀取導(dǎo)入的excel 這個地方容易報錯 0?什么的 這個時候就去把excel的文件用高級版本的excel重新導(dǎo)出 因為版本過低的問題 List<Map<Integer,Object>> list = EasyExcel.read(file.getInputStream(),analysisEventMonitor ).sheet(0).doReadSync(); //獲取攔截器攔截到的 表頭的Map集合 Map<Integer, String> key = analysisEventMonitor .getKey();
現(xiàn)在 我們拿到了數(shù)據(jù)也拿到了表頭。有的人就會好奇了,你只是獲取了一級表頭,那我二級表頭怎么辦? 別著急 聽我慢慢說。
上方的代碼塊, 第二行獲取了excel的數(shù)據(jù) 這個數(shù)據(jù)是去掉了一級表頭之后的數(shù)據(jù),說到這 可能有的人就懂了,有的人還是不懂 ok 我們繼續(xù)說,第三行代碼 是我們攔截器攔截的表頭的集合 可以看出來 是以map接收的 map的key是一個Integer類型,欸 巧了,我們的數(shù)據(jù) list 其中也包了個map而且 map的key 恰好也是Integer類型,這個時候邏輯性好的同學(xué)肯定想到了,這個integer 可不是瞎寫瞎排序的 而是表頭的位置與數(shù)據(jù)遙相呼應(yīng)的。那這個時候就簡單了,我們只需要找到多級表頭的開始位置 即可 下面我會貼圖 然后再做解答。
看到現(xiàn)在 成績是合并了的 多級表頭,這個時候 我們獲取到的表頭集合中的1對應(yīng)姓名 2對應(yīng)電話 3對應(yīng)成績 我們獲取到的數(shù)據(jù)list,代碼寫 list.get(0); 這個獲取到的數(shù)據(jù) 就是二級表頭中的數(shù)據(jù) 這個時候又是拿到了一個map 對應(yīng)關(guān)系分別是 1=null 2=null 3=英語 4=語文。 這個時候又有人說了 如果我后面再多一個多級表頭怎么辦? 貼圖。
這個時候 我們獲取到的表頭數(shù)據(jù)中 1=姓名 2=電話 3=成績 4=null 5=考核結(jié)果 獲取到的list數(shù)據(jù)中 1=null 2=null 3=英語 4=語文 5=英語 6=語文
到此 多表頭的導(dǎo)入就結(jié)束了,有的人還是不知道怎么把他存入數(shù)據(jù)庫,那你就要想想了,最笨的方法就是記住下標(biāo) 填充到實體類中,這個辦法非常不推薦 不靈活! 最好辦的辦法就是用枚舉 匹配 文字 再匹配字段 填充實體類 再或者 寫個方法 將文字與字段對應(yīng)上 自動轉(zhuǎn)換實體類。
有的人說 如果我是不固定的表頭怎么辦呢?
那更簡單了,不固定的表頭 但是你不可能沒有固定的列吧 如果沒有固定的列 全部都是不固定的表頭 那你就只能做兩個表 一個表存字段名稱的中文 一個表對應(yīng)其中的數(shù)據(jù),可以自己好好想想。如果是有固定的列 那你就獲取固定列的文字 進(jìn)行判斷 然后再獲取其中不固定的表頭 將其填充。 授人以魚不如授人以漁 凡事還是多動腦筋,辦法已經(jīng)教了 我也不可能面面俱到
總結(jié)
到此這篇關(guān)于Java easyExcel的復(fù)雜表頭多級表頭導(dǎo)入的文章就介紹到這了,更多相關(guān)Java easyExcel表頭導(dǎo)入內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Java使用easyExcel導(dǎo)出excel數(shù)據(jù)案例
- Java使用EasyExcel動態(tài)添加自增序號列
- Java中Easyexcel?實現(xiàn)批量插入圖片功能
- Java利用EasyExcel實現(xiàn)合并單元格
- Java使用EasyExcel進(jìn)行單元格合并的問題詳解
- Java利用EasyExcel解析動態(tài)表頭及導(dǎo)出實現(xiàn)過程
- Java使用EasyExcel實現(xiàn)Excel的導(dǎo)入導(dǎo)出
- Java EasyExcel實現(xiàn)導(dǎo)出多sheet并設(shè)置單元格樣式
- Java?EasyExcel實現(xiàn)合并相同內(nèi)容單元格與動態(tài)標(biāo)題功能
- Java實現(xiàn)讀取Excel文件功能(EasyExcel初使用)
相關(guān)文章
SpringCloud+Redis實現(xiàn)Api接口限流防止惡意刷接口
接口限流是為了保護(hù)系統(tǒng)和服務(wù),防止因為過多的請求而崩潰,本文主要介紹了SpringCloud+Redis實現(xiàn)Api接口限流防止惡意刷接口,具有一定的參考價值,感興趣的可以了解一下2024-03-03JAVA實現(xiàn)Excel和PDF上下標(biāo)的操作代碼
這篇文章主要介紹了JAVA實現(xiàn)Excel和PDF上下標(biāo),本文通過示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-09-09Spring?Boot?內(nèi)置工具類ReflectionUtils的實現(xiàn)
ReflectionUtils是一個反射工具類,它封裝了Java反射的操作,使得我們能夠更輕松地操作和訪問類的方法、字段,本文主要介紹了Spring?Boot?內(nèi)置工具類ReflectionUtils的實現(xiàn),感興趣的可以了解一下2023-11-11springboot+vue制作后臺管理系統(tǒng)項目
本文詳細(xì)介紹了后臺管理使用springboot+vue制作,以分步驟、圖文的形式詳細(xì)講解,大家有需要的可以參考參考2021-08-08