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 "データのインポートが成功しました。";
}
}