EasyExcelを利用した汎用インポートユーティリティクラスの実装

EasyExcelによるファイル読み込み

EasyExcelは、com.alibaba.excel.event.AnalysisEventListenerクラスを継承し、その中のinvokeメソッドをコールバックすることで、Excelファイルの各行のデータを取得します。ファイルの各行が読み込まれるたびに、invokeメソッドが呼び出されます。

ユーティリティクラスの作成

以下は、汎用的なExcel読み込みリスナークラスの実装例です。このクラスは、任意の型のオブジェクトをリストに格納する機能を提供します。


package com.example.excel.utils;

import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import lombok.extern.slf4j.Slf4j;

import java.util.ArrayList;
import java.util.List;

/**
 * 汎用的なExcel解析リスナー
 * @param <T> 解析するデータの型
 */
@Slf4j
public class ExcelImportListener<T> extends AnalysisEventListener<T> {

    private final List<T> parsedData = new ArrayList<>();

    /**
     * 解析されたデータのリストを取得します。
     * @return 解析されたデータのリスト
     */
    public List<T> getParsedData() {
        return parsedData;
    }

    /**
     * Excelの1行が読み込まれるたびに呼び出されるメソッド
     * @param rowData 1行のデータ
     * @param context 解析コンテキスト
     */
    @Override
    public void invoke(T rowData, AnalysisContext context) {
        parsedData.add(rowData);
    }

    /**
     * すべての解析が完了した後に呼び出されるメソッド
     * @param context 解析コンテキスト
     */
    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {
        // 解析完了後の後処理(必要に応じて実装)
    }
}

モデルクラスの定義

Excelの表頭に対応するモデルクラスを定義します。各フィールドに@ExcelPropertyアノテーションを使用して、列名とインデックスを指定します。


import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;

@Data
public class UserExcelData {

    @ExcelProperty(value = "氏名", index = 0)
    private String userName;

    @ExcelProperty(value = "年齢", index = 1)
    private Integer userAge;
}

コントローラでの呼び出し

以下は、ファイルアップロードを受け付け、定義したユーティリティクラスを使用してExcelデータをインポートするコントローラの例です。


import com.alibaba.excel.EasyExcel;
import com.example.excel.utils.ExcelImportListener;
import com.example.excel.model.UserExcelData;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;

@RestController
public class UserController {

    @PostMapping("/api/import/users")
    public String importUsers(@RequestParam("file") MultipartFile uploadedFile) throws IOException {
        // リスナーのインスタンスを作成
        ExcelImportListener<UserExcelData> listener = new ExcelImportListener<>();

        // EasyExcelを使用してファイルを読み込み、データを解析
        EasyExcel.read(uploadedFile.getInputStream(), UserExcelData.class, listener)
                .sheet(0) // 最初のシートを対象とする
                .doRead();

        // 解析されたデータを取得
        List<UserExcelData> excelDataList = listener.getParsedData();

        // ここでデータベースへの保存などの処理を実装
        // ...

        return "データのインポートが成功しました。";
    }
}

タグ: EasyExcel Java Excel データインポート Apache POI

7月18日 01:31 投稿