Java easyExcel的復雜表頭多級表頭導入

首先要瞭解

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每行解析的數據為Map<Integer, String>類型,Integer是Excel的列索引,String為Excel的單元格值
     * @param context context能獲取一些東西,比如context.readRowHolder().getRowIndex()為Excel的行索引,表頭的行索引為0,0之後的都解析成數據
     */
    @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表格的時候攔截表頭

類自己創建 繼承AnalysisEventListener 就可以 然後重寫她的invokeHeadMap方法就可以獲取到excel 的一級表頭瞭。

下面導入文件一塊的代碼

//加載攔截器 作用於 獲取表頭
            AnalysisEventMonitor analysisEventMonitor = new AnalysisEventMonitor ();
            //讀取導入的excel 這個地方容易報錯 0✖什麼的 這個時候就去把excel的文件用高級版本的excel重新導出 因為版本過低的問題
            List<Map<Integer,Object>> list = EasyExcel.read(file.getInputStream(),analysisEventMonitor ).sheet(0).doReadSync();
            //獲取攔截器攔截到的 表頭的Map集合
            Map<Integer, String> key = analysisEventMonitor .getKey();
            

現在 我們拿到瞭數據也拿到瞭表頭。有的人就會好奇瞭,你隻是獲取瞭一級表頭,那我二級表頭怎麼辦? 別著急 聽我慢慢說。

上方的代碼塊, 第二行獲取瞭excel的數據 這個數據是去掉瞭一級表頭之後的數據,說到這 可能有的人就懂瞭,有的人還是不懂 ok 我們繼續說,第三行代碼 是我們攔截器攔截的表頭的集合 可以看出來 是以map接收的 map的key是一個Integer類型,欸 巧瞭,我們的數據 list 其中也包瞭個map而且 map的key 恰好也是Integer類型,這個時候邏輯性好的同學肯定想到瞭,這個integer 可不是瞎寫瞎排序的 而是表頭的位置與數據遙相呼應的。那這個時候就簡單瞭,我們隻需要找到多級表頭的開始位置 即可 下面我會貼圖 然後再做解答。

看到現在 成績是合並瞭的 多級表頭,這個時候 我們獲取到的表頭集合中的1對應姓名 2對應電話 3對應成績 我們獲取到的數據list,代碼寫 list.get(0); 這個獲取到的數據 就是二級表頭中的數據 這個時候又是拿到瞭一個map 對應關系分別是 1=null 2=null 3=英語 4=語文。 這個時候又有人說瞭 如果我後面再多一個多級表頭怎麼辦? 貼圖。

這個時候 我們獲取到的表頭數據中 1=姓名 2=電話 3=成績 4=null 5=考核結果 獲取到的list數據中 1=null 2=null 3=英語 4=語文 5=英語 6=語文
到此 多表頭的導入就結束瞭,有的人還是不知道怎麼把他存入數據庫,那你就要想想瞭,最笨的方法就是記住下標 填充到實體類中,這個辦法非常不推薦 不靈活! 最好辦的辦法就是用枚舉 匹配 文字 再匹配字段 填充實體類 再或者 寫個方法 將文字與字段對應上 自動轉換實體類。

有的人說 如果我是不固定的表頭怎麼辦呢?

那更簡單瞭,不固定的表頭 但是你不可能沒有固定的列吧 如果沒有固定的列 全部都是不固定的表頭 那你就隻能做兩個表 一個表存字段名稱的中文 一個表對應其中的數據,可以自己好好想想。如果是有固定的列 那你就獲取固定列的文字 進行判斷 然後再獲取其中不固定的表頭 將其填充。 授人以魚不如授人以漁 凡事還是多動腦筋,辦法已經教瞭 我也不可能面面俱到

總結

到此這篇關於Java easyExcel的復雜表頭多級表頭導入的文章就介紹到這瞭,更多相關Java easyExcel表頭導入內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: