# excelimporter **Repository Path**: licdjdli/excelimporter ## Basic Information - **Project Name**: excelimporter - **Description**: 我们使用EasyExcel进行流式读取,使用MyBatis的批量插入,同时使用线程池进行异步处理,来实现一个完整的百万级Excel数据导入案例。 - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-01-06 - **Last Updated**: 2026-01-08 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 百万数据Excel导入 #### 介绍 我们使用EasyExcel进行流式读取,使用MyBatis的批量插入,同时使用线程池进行异步处理,来实现一个完整的百万级Excel数据导入案例。 #### 案例结构 ``` ├── config #配置包 ├── ThreadPoolConfig #线程池配置 ├── controller #控制层 ├── ExcelImportController #测试导入接口入口 └── domain #实体包 ├── UserData #实体类 ├── dto #导入模板包 ├── UserDataDTO #导入模板类 ├── listener #事件监听包 ├── ExcelDataListener #excel监听器 EasyExcel中的AnalysisEventListener是一个事件监听器,用于在读取Excel时处理每一行数据。它允许我们在读取Excel的过程中,对每一行数据进行自定义的处理,而不需要将整个Excel文件加载到内存中。 这样可以大大减少内存消耗,特别适用于处理大文件。AnalysisEventListener是一个抽象类,我们需要继承它并实现其抽象方法invoke()和doAfterAllAnalysed()。 主要方法: invoke(T data, AnalysisContext context): 每读取一行数据,就会调用一次这个方法。我们可以在这个方法里对当前行的数据进行处理。 参数data就是当前行的数据,会被映射成我们指定的类型(如果使用了泛型)。 doAfterAllAnalysed(AnalysisContext context): 当整个Excel文件读取完成后,会调用这个方法。可以在这里进行一些收尾工作,比如资源关闭等。 除了这两个抽象方法,还有一些其他方法可以重写,比如: invokeHeadMap(Map headMap, AnalysisContext context): 读取到表头时触发。 onException(Exception exception, AnalysisContext context): 在读取过程中发生异常时触发。 ├── mapper #mapper层 ├── UserDataMapper #实体类的mapper接口 ├── service #service层 ├── BatchInsertService # 批量插入服务,负责和数据库交互,批量将内存中的数据插入数据库 ├── FileProcessor # 文件处理服务,处理文件的临时存储,分片,合并,清理 ├── ProgressService # 文件导入进度服务 ├── UserDataServiceImpl # 文件导入 ```