EasyExcel はファイルのインポートをバッチで実装します

イージーエクセル

EasyExcel は、大きなファイルのメモリ オーバーフローを解決する、Java ベースの高速かつ簡潔な Excel 処理ツールです。
これにより、パフォーマンス、メモリ、その他の要因を考慮することなく、Excel の読み取り、書き込み、その他の機能を迅速に完了できます。

依存関係を導入する

 	<dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>easyexcel</artifactId>
        <version>3.1.3</version> 
    </dependency>

後続のオブジェクト間の型変換のために dozermapper 依存関係を導入する

    <dependency>
        <groupId>com.github.dozermapper</groupId>
        <artifactId>dozer-spring-boot-starter</artifactId>
        <version>6.5.0</version>
    </dependency>

テーブル構造

学生テーブル

CREATE TABLE `student`  (
  `id` bigint UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '学生表ID',
  `sname` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '学生姓名',
  `sno` bigint NOT NULL COMMENT '学号',
  `sex` char(2) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '性别',
  `age` int NOT NULL COMMENT '年龄',
  `is_deleted` tinyint UNSIGNED NOT NULL DEFAULT 0 COMMENT '是否删除',
  PRIMARY KEY (`id`)
);

ここに画像の説明を挿入します

プロジェクトの構造

ここに画像の説明を挿入します

DozerUtils ツール クラス

public class DozerUtils {
    
    
    public static <T,S> List<T> mapList(final Mapper mapper, List<S> sourceList, Class<T> targetObjectClass){
    
    
        List<T> targetList=new ArrayList<T>();
        for(S s:sourceList){
    
    
            targetList.add(mapper.map(s,targetObjectClass));
        }
        return targetList;
    }
}

エンティティクラス Student

@ExcelProperty(value = "Excel のこのフィールドのヘッダー名")
@ExcelIgnore: 解析時にこのフィールドを無視します

@Data
public class Student {
    
    

    /**主键ID**/
    @ExcelIgnore
    private Long id;
    /**学生姓名**/
    @ExcelProperty(value = "姓名")
    private String sname;
    /**学号**/
    @ExcelProperty(value = "学号")
    private Long sno;
    /**性别**/
    @ExcelProperty(value = "性别")
    private String sex;
    /**年龄**/
    @ExcelProperty(value = "年龄")
    private Integer age;
    /**是否删除**/
    @ExcelIgnore
    private Integer isDeleted;

}

コントローラ

@RestController
@RequestMapping("/easyExcel")
public class EasyExcelController {
    
    

    @Resource
    private IStudentService studentService;

    @PostMapping("/studentInput")
    public void studentInput(MultipartFile file){
    
    
        studentService.studentInput(file);
    }

}

モニタリングクラス

今回は一括インポートのデータ数を1000件に設定していますが、実際の状況に応じて3000件以内で調整できます。
このインポートではインポートロジックの設定はしません。ロジックの設定が必要な場合はサービスメソッドを呼び出してください。リスニング クラスの saveDate メソッドのロジックに従って追加されます。

@Data
public class StudentListener extends AnalysisEventListener<Student> {
    
    
    /**
     *单次缓存量为1000
     */
    private final int BATCH_SIZE = 1000;

    /**
     * 临时存储List
     */
    List<Student> cacheData = new ArrayList<Student>();
    private IStudentService studentService;
    private Mapper dozerMapper;

    public StudentListener(IStudentService studentService, Mapper dozerMapper){
    
    
        this.studentService = studentService;
        this.dozerMapper = dozerMapper;
    }
    @Override
    public void invoke(Student data, AnalysisContext analysisContext) {
    
    
        cacheData.add(data);
        if (cacheData.size() >= BATCH_SIZE){
    
    
            saveData();
            //每批存储完成后清空list
            cacheData.clear();
        }
    }

    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
    
    
        if (cacheData.size() > 0){
    
    
            saveData();
        }
    }

    /**
     * 加入数据库
     */
    private void saveData(){
    
    
        List<Student> students = DozerUtils.mapList(dozerMapper,cacheData,Student.class);
        studentService.saveBatch(students);
    }
}

サービス

public interface IStudentService extends IService<Student> {
    
    
    void studentInput(MultipartFile file);
}

サービス実装

@Service
public class StudentServiceImpl extends ServiceImpl<StudentMapper, Student> implements IStudentService {
    
    
    
    @Resource
    private IStudentService studentService;
    @Resource
    private Mapper dozerMapper;
    
    @Override
    @Transactional(rollbackFor = Throwable.class)
    public void studentInput(MultipartFile file) {
    
    
        try {
    
    
            InputStream inputStream = file.getInputStream();
            EasyExcel.read(inputStream, Student.class,
                    new StudentListener(studentService, dozerMapper)).sheet().doRead();
        }catch (Exception e){
    
    
            e.printStackTrace();
        }
    }
}

マッパー

public interface StudentMapper extends BaseMapper<Student> {
    
    
}

スタートアッププロジェクト

ここに画像の説明を挿入します

テスト

テストデータ

列名のテキストは、エンティティ クラスの対応するフィールド アノテーションのテキストと同じであることに注意してください。
ここに画像の説明を挿入します

ポストマンテスト

form-dataでファイル形式を設定します。
ここに画像の説明を挿入します

アップロードするテストファイルを選択します
ここに画像の説明を挿入します

完了後、データベースを確認する
ここに画像の説明を挿入します
と、インポートは成功しています。

おすすめ

転載: blog.csdn.net/m0_68681879/article/details/131779885