Java?easyExcel的復(fù)雜表頭多級(jí)表頭導(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>> {
/**
* 存儲(chǔ)Key
*/
Map<Integer, String> key = new HashMap<>();
/**
* keuList
*/
List<String> keyList=new ArrayList<>();
public AnalysisEventMonitor() {
}
/**
* 重寫(xiě)invokeHeadMap方法,獲去表頭,如果有需要獲取第一行表頭就重寫(xiě)這個(gè)方法,不需要?jiǎng)t不需要重寫(xiě)
*
* @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表格的時(shí)候攔截表頭
類自己創(chuàng)建 繼承AnalysisEventListener 就可以 然后重寫(xiě)她的invokeHeadMap方法就可以獲取到excel 的一級(jí)表頭了。
下面導(dǎo)入文件一塊的代碼
//加載攔截器 作用于 獲取表頭
AnalysisEventMonitor analysisEventMonitor = new AnalysisEventMonitor ();
//讀取導(dǎo)入的excel 這個(gè)地方容易報(bào)錯(cuò) 0?什么的 這個(gè)時(shí)候就去把excel的文件用高級(jí)版本的excel重新導(dǎo)出 因?yàn)榘姹具^(guò)低的問(wèn)題
List<Map<Integer,Object>> list = EasyExcel.read(file.getInputStream(),analysisEventMonitor ).sheet(0).doReadSync();
//獲取攔截器攔截到的 表頭的Map集合
Map<Integer, String> key = analysisEventMonitor .getKey();
現(xiàn)在 我們拿到了數(shù)據(jù)也拿到了表頭。有的人就會(huì)好奇了,你只是獲取了一級(jí)表頭,那我二級(jí)表頭怎么辦? 別著急 聽(tīng)我慢慢說(shuō)。
上方的代碼塊, 第二行獲取了excel的數(shù)據(jù) 這個(gè)數(shù)據(jù)是去掉了一級(jí)表頭之后的數(shù)據(jù),說(shuō)到這 可能有的人就懂了,有的人還是不懂 ok 我們繼續(xù)說(shuō),第三行代碼 是我們攔截器攔截的表頭的集合 可以看出來(lái) 是以map接收的 map的key是一個(gè)Integer類型,欸 巧了,我們的數(shù)據(jù) list 其中也包了個(gè)map而且 map的key 恰好也是Integer類型,這個(gè)時(shí)候邏輯性好的同學(xué)肯定想到了,這個(gè)integer 可不是瞎寫(xiě)瞎排序的 而是表頭的位置與數(shù)據(jù)遙相呼應(yīng)的。那這個(gè)時(shí)候就簡(jiǎn)單了,我們只需要找到多級(jí)表頭的開(kāi)始位置 即可 下面我會(huì)貼圖 然后再做解答。

看到現(xiàn)在 成績(jī)是合并了的 多級(jí)表頭,這個(gè)時(shí)候 我們獲取到的表頭集合中的1對(duì)應(yīng)姓名 2對(duì)應(yīng)電話 3對(duì)應(yīng)成績(jī) 我們獲取到的數(shù)據(jù)list,代碼寫(xiě) list.get(0); 這個(gè)獲取到的數(shù)據(jù) 就是二級(jí)表頭中的數(shù)據(jù) 這個(gè)時(shí)候又是拿到了一個(gè)map 對(duì)應(yīng)關(guān)系分別是 1=null 2=null 3=英語(yǔ) 4=語(yǔ)文。 這個(gè)時(shí)候又有人說(shuō)了 如果我后面再多一個(gè)多級(jí)表頭怎么辦? 貼圖。

這個(gè)時(shí)候 我們獲取到的表頭數(shù)據(jù)中 1=姓名 2=電話 3=成績(jī) 4=null 5=考核結(jié)果 獲取到的list數(shù)據(jù)中 1=null 2=null 3=英語(yǔ) 4=語(yǔ)文 5=英語(yǔ) 6=語(yǔ)文
到此 多表頭的導(dǎo)入就結(jié)束了,有的人還是不知道怎么把他存入數(shù)據(jù)庫(kù),那你就要想想了,最笨的方法就是記住下標(biāo) 填充到實(shí)體類中,這個(gè)辦法非常不推薦 不靈活! 最好辦的辦法就是用枚舉 匹配 文字 再匹配字段 填充實(shí)體類 再或者 寫(xiě)個(gè)方法 將文字與字段對(duì)應(yīng)上 自動(dòng)轉(zhuǎn)換實(shí)體類。
有的人說(shuō) 如果我是不固定的表頭怎么辦呢?
那更簡(jiǎn)單了,不固定的表頭 但是你不可能沒(méi)有固定的列吧 如果沒(méi)有固定的列 全部都是不固定的表頭 那你就只能做兩個(gè)表 一個(gè)表存字段名稱的中文 一個(gè)表對(duì)應(yīng)其中的數(shù)據(jù),可以自己好好想想。如果是有固定的列 那你就獲取固定列的文字 進(jìn)行判斷 然后再獲取其中不固定的表頭 將其填充。 授人以魚(yú)不如授人以漁 凡事還是多動(dòng)腦筋,辦法已經(jīng)教了 我也不可能面面俱到
總結(jié)
到此這篇關(guān)于Java easyExcel的復(fù)雜表頭多級(jí)表頭導(dǎo)入的文章就介紹到這了,更多相關(guān)Java easyExcel表頭導(dǎo)入內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Java使用easyExcel導(dǎo)出excel數(shù)據(jù)案例
- Java使用EasyExcel動(dòng)態(tài)添加自增序號(hào)列
- Java中Easyexcel?實(shí)現(xiàn)批量插入圖片功能
- Java利用EasyExcel實(shí)現(xiàn)合并單元格
- Java使用EasyExcel進(jìn)行單元格合并的問(wèn)題詳解
- Java利用EasyExcel解析動(dòng)態(tài)表頭及導(dǎo)出實(shí)現(xiàn)過(guò)程
- Java使用EasyExcel實(shí)現(xiàn)Excel的導(dǎo)入導(dǎo)出
- Java EasyExcel實(shí)現(xiàn)導(dǎo)出多sheet并設(shè)置單元格樣式
- Java?EasyExcel實(shí)現(xiàn)合并相同內(nèi)容單元格與動(dòng)態(tài)標(biāo)題功能
- Java實(shí)現(xiàn)讀取Excel文件功能(EasyExcel初使用)
相關(guān)文章
java 中Spark中將對(duì)象序列化存儲(chǔ)到hdfs
這篇文章主要介紹了java 中Spark中將對(duì)象序列化存儲(chǔ)到hdfs的相關(guān)資料,需要的朋友可以參考下2017-06-06
使用Java的Lucene搜索工具對(duì)檢索結(jié)果進(jìn)行分組和分頁(yè)
這篇文章主要介紹了使用Java的搜索工具Lucene對(duì)檢索結(jié)果進(jìn)行分組和分頁(yè)的方法,Luence是Java環(huán)境中的一個(gè)全文檢索引擎工具包,需要的朋友可以參考下2016-03-03
基于Struts2實(shí)現(xiàn)防止表單重復(fù)提交
這篇文章主要介紹了基于Struts2實(shí)現(xiàn)防止表單重復(fù)提交,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-10-10
Java中String判斷值為null或空及地址是否相等的問(wèn)題
這篇文章主要介紹了Java中String判斷值為null或空及地址是否相等的問(wèn)題,文中舉了簡(jiǎn)單的例子對(duì)字符串類型的值和地址問(wèn)題進(jìn)行講解,需要的朋友可以參考下2016-01-01
Spring?Boot提高開(kāi)發(fā)效率必備工具lombok使用
這篇文章主要為大家介紹了Spring?Boot提高開(kāi)發(fā)效率的必備工具lombok使用方法示例及步驟說(shuō)明,有需要的朋友可以借鑒參考下,希望能夠有所幫助2022-03-03
10個(gè)經(jīng)典的Java main方法面試題
這篇文章主要為大家分享了10個(gè)經(jīng)典的Java main方法面試題,與其說(shuō)是Java面試題,其實(shí)也是Java的一些最基礎(chǔ)知識(shí)問(wèn)題,感興趣的小伙伴們可以參考一下2016-01-01

