記事ディレクトリ
イージーエクセル
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でファイル形式を設定します。
アップロードするテストファイルを選択します
完了後、データベースを確認する
と、インポートは成功しています。