ホームページ  >  記事  >  Java  >  Java easyExcel でマルチレベルヘッダーをインポートする方法

Java easyExcel でマルチレベルヘッダーをインポートする方法

WBOY
WBOY転載
2023-05-07 13:18:123365ブラウズ

まず第一に、理解する必要があります

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 を読み取るときにヘッダーをインターセプトするために使用されます。 table

自分でクラスを作成して AnalysisEventListener を継承し、その invokeHeadMap メソッドを書き換えて Excel の第 1 レベルのヘッダーを取得します。

ファイルをインポートするための次のコード

//加载拦截器 作用于 获取表头
            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();

これで、データとテーブル ヘッダーが完成しました。興味がある人もいるでしょう。あなたは第 1 レベルのヘッダーしか取得できていないのに、第 2 レベルのヘッダーはどうなるのでしょうか?心配しないで、ゆっくり聞いてください。

上記のコードブロック、2行目でExcelデータを取得します このデータは、第1階層のヘッダーを削除した後のデータです これに関しては、分かる人もいるかもしれませんが、まだ分からない人もいます理解できません。OK 続けましょう。コードの 3 行目は、インターセプターによってインターセプトされたテーブル ヘッダーのコレクションです。map によって受信されたマップのキーが整数型であることがわかります。偶然にも、データ リストには次の内容も含まれていますマップとマップ たまたまキーが整数型だったので、論理の得意な学生ならこのとき、この整数がランダムに書き込まれてソートされているのではなく、ヘッダーの位置がデータに対応していると思ったはずです。では、今回は簡単です、多段ヘッダーの開始位置を見つけるだけですので、下の写真を載せて回答します。

Java easyExcel でマルチレベルヘッダーをインポートする方法

結果が複数レベルのヘッダーにマージされたことを確認してください。この時点で、取得したヘッダー セットでは、1 が名前に対応し、2 が電話番号に対応します。 , 3がスコアに相当 取得したデータのリストをlist.get(0)に記述する; 取得したデータは2次ヘッダのデータとなる このとき、別のマップを取得する 対応関係は 1=null 2 =null 3=英語 4=言語。このとき、誰かが私にもう一度尋ねました。「後でマルチレベルのヘッダーがある場合はどうすればよいですか?」ステッカー。

Java easyExcel でマルチレベルヘッダーをインポートする方法

今回取得したヘッダーデータでは、評価結果から取得したリストデータの 1=名前 2=電話番号 3=スコア 4=null 5=となっており、 1=null 2=null 3=英語 4=中国語 5=英語 6=中国語
これで複数のヘッダーのインポートは終了します。データベースに保存する方法がまだわからない人もいるでしょう。最も愚かな方法は、エンティティ クラスに添字を忘れずに入力することです。この方法はお勧めできず、柔軟性に欠けます。最善の方法は、列挙を使用してテキストを照合し、次にフィールドを照合するか、エンティティ クラスに入力するか、テキストとフィールドを照合してエンティティ クラスを自動的に変換するメソッドを作成することです。

以上がJava easyExcel でマルチレベルヘッダーをインポートする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。