# async-excel
一个基于easyexcel大数据量数据导入导出异步处理组件,如果你觉得对你有帮助,请点击右上角的star,支持下
## asyncexcel介绍
+ 1、asyncexcel基于阿里的easyexcel包装,抽取异步骨架,不改变easyexcel的特性
支持的功能列表:
+ 支持线程池外部声明,可传入SystemContext;
+ 仅支持单行表头
+ 支持表头校验
+ 支持格式转换错误校验出错写入错误文件
+ 支持业务错误写出错误文件
+ 支持行数限制
+ 支持不分页事务
+ 支持查看进度
+ 支持异步分批次导入导出,分页大小可自定义
+ 支持动态表头导出
+ 支持多租户隔离
+ 支持多模块隔离
+ 支持用户权限隔离
+ 支持自定义存储,如果不设置默认使用本地存储,存储路径/tmp/upload 如果自定义只要实现接口IStorageService 实现String write(String name, InputStream data)方法即可 声明成bean即可
### 快速开始
引入starter
```xml
<dependency>
<groupId>com.asyncexcel</groupId>
<artifactId>async-excel-springboot-starter</artifactId>
<version>1.0.0</version>
</dependency>
<!--mybatis-plus-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.2</version>
</dependency>
<!--mysql驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.29</version>
</dependency>
```
导入数据库
```sql
drop table if exists excel_task;
CREATE TABLE `excel_task` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键id',
`type` tinyint(2) NOT NULL COMMENT '类型:1-导入,2-导出',
`status` tinyint(2) NOT NULL DEFAULT 0 COMMENT '状态:0-初始,1-进行中,2-完成,3-失败',
`estimate_count` bigint(20) NOT NULL DEFAULT 0 COMMENT '预估总记录数',
`total_count` bigint(20) NOT NULL DEFAULT 0 COMMENT '实际总记录数',
`success_count` bigint(20) NOT NULL DEFAULT 0 COMMENT '成功记录数',
`failed_count` bigint(20) NOT NULL DEFAULT 0 COMMENT '失败记录数',
`file_name` varchar(200) DEFAULT NULL COMMENT '文件名',
`file_url` varchar(500) DEFAULT NULL COMMENT '文件路径',
`failed_file_url` varchar(500) DEFAULT NULL COMMENT '失败文件路径',
`failed_message` varchar(255) DEFAULT NULL COMMENT '失败消息',
`start_time` datetime DEFAULT NULL COMMENT '开始时间',
`end_time` datetime DEFAULT NULL COMMENT '结束时间',
`tenant_code` varchar(50) default NULL COMMENT '租户编码',
`create_user_code` varchar(50) default NULL COMMENT '用户编码',
`business_code` varchar(50) default NULL COMMENT '业务编码',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='导入导出任务';
```
配置数据源(此处为多数据源,使用了spring 父子容器技术,所以不影响你原本的数据源)
```properties
#asyncexcel 数据源
spring.excel.datasource.url=jdbc:mysql://localhost:3306/async-excel?serverTimezone=GMT%2B8&autoReconnect=true&allowMultiQueries=true&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&&useCursorFetch=true&&rewriteBatchedStatements=true
spring.excel.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.excel.datasource.password=root
spring.excel.datasource.username=root
#业务数据源
spring.datasource.url=jdbc:mysql://localhost:3306/async-excel-sample?serverTimezone=GMT%2B8&autoReconnect=true&allowMultiQueries=true&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&&useCursorFetch=true&&rewriteBatchedStatements=true
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.password=root
spring.datasource.username=root
```
使用@EnableAsyncExcel注解启用配置
```java
@SpringBootApplication
@EnableAsyncExcel
@MapperScan({"com.asyncexcel.sample.mapper"})
public class AsyncExcelSampleApplication {
public static void main(String[] args) {
SpringApplication.run(AsyncExcelSampleApplication.class, args);
}
}
```
编写极简示例 [示例项目 async-excel-sample](https://github.com/2229499815/async-excel-sample) 欢迎添加使用示例
```java
@RestController
@RequestMapping("/user")
public class UserController {
@Resource
ExcelService excelService;
//导入最简示例
@PostMapping("/imports")
public Long imports(@RequestBody MultipartFile file) throws Exception{
DataImportParam dataImportParam = new DataImportParam()
.setStream(file.getInputStream())
.setModel(UserImportModel.class)
.setBatchSize(3)
.setFilename("用户导入");
Long taskId = excelService.doImport(UserImportHandler.class, dataImportParam);
return taskId;
}
//导出最简示例
@PostMapping("/exports")
public Long exports(){
DataExportParam dataExportParam=new DataExportParam()
.setExportFileName("用户导出")
.setLimit(5)
.setHeadClass(UserExportModel.class);
return excelService.doExport(UserExportHandler.class,dataExportParam);
}
}
```
导入导出model
```java
@Data
public class UserExportModel extends ExportRow {
@ExcelProperty("用户编码")
private String userCode;
@ExcelProperty("用户姓名")
private String userName;
@ExcelProperty("手机号")
private String mobile;
@ExcelProperty("备注")
private String remarks;
}
```
```java
@Data
public class UserImportModel extends ImportRow {
@ExcelProperty("用户编码")
private String userCode;
@ExcelProperty("用户姓名")
private String userName;
@ExcelProperty("手机号")
private String mobile;
@ExcelProperty("备注")
private String remarks;
}
```
编写导入导出处理类
```java
@ExcelHandle
public class UserExportHandler implements ExportHandler<UserExportModel> {
@Autowired
IUserService userService;
@Override
public ExportPage<UserExportModel> exportData(int startPage, int limit, DataExportParam dataExportParam) {
IPage<User> iPage = new Page<>(startPage, limit);
IPage page = userService.page(iPage);
List<UserExportModel> list = ExportListUtil.transform(page.getRecords(), UserExportModel.class);
ExportPage<UserExportModel> result = new ExportPage<>();
result.setTotal(page.getTotal());
result.setCurrent(page.getCurrent());
result.setSize(page.getSize());
result.setRecords(list);
return result;
}
}
```
```java
@ExcelHandle
public class UserImportHandler implements ImportHandler<UserImportModel> {
@Autowired
IUserService userService;
@Override
public List<ErrorMsg> importData(List<UserImportModel> list, DataImportParam dataImportParam)
throws Exception {
List<ErrorMsg> errorList=new ArrayList<>();
List<User> saveUsers=new ArrayList<>();
for (UserImportModel userImportModel : list) {
if (userImportModel.getMobile().contains("00000000")){
ErrorMsg msg = new ErrorMsg(userImportModel.getRow(), "手机号包含太多0");
errorList.add(msg);
}else{
BeanCopier beanCopier = BeanCopier.create(UserImportModel.class, User.class, false);
User user = new User();
beanCopier.copy(userImportModel,user,null);
saveUsers.add(user);
}
}
userService.saveBatch(saveUsers);
return errorList;
}
}
```
编写前端页面
![按钮](https://github.com/2229499815/async-excel/blob/master/doc/main.png)
![查看任务](https://github.com/2229499815/async-excel/blob/master/doc/viewtask.png)
### 高级功能
#### 自定义存储
假如你已经对接好了第三方的存储比如oss、cos,七牛云存储等
你只需要在你的项目中实现IStorageService 接口
赵闪闪168
- 粉丝: 1726
- 资源: 6943
最新资源
- HEVC多视图编码多层次复杂度优化:运动估计与并行处理技术的应用
- 电源Simplis开关电源及电路仿真案例 单 多相控制buck仿真电路 4 8 phase COT D-CAP+ 架构仿真模型, 1-8phase PWM buck仿真模型, 峰值电流模式,D-C
- ExchangeServer2003邮件安全指南PDF版最新版本
- 线性参变(LPV)+输出反馈鲁棒模型预测控制(OFRMPC)+路径跟踪(PTC),目前能实现20-25m s的变速单移线,更多工况可自行调试 考虑速度和侧偏刚度变化,以及质心侧偏角的鲁棒估计,基于二
- 红帽企业Linux3(安全、安装、系统)指南CHM版最新版本
- adaline神经网络辨识永磁同步电机参数
- 基于机器学习的快速CU划分方法减少HEVC复杂度的研究
- UNIX系统安全工具PDF版最新版本
- 储能参与调峰调频联合优化模型 关键词:储能 调频 调峰 充放电优化 联合运行 matlab运行 参考文档:Using Battery Storage for Peak Shaving and Fr
- 基于感知模型的高效视频编码实时率失真优化(HEVC)
- OTFS仿真 MIMO-OTFS MP检测算法(详细注释),ZF均衡,低复杂度lu分解和误差纠正mmse均衡检测 omp及基本信道估计,MRC检测,结合索引调制IM,空间调制SM,正交空间调制,SM
- COMSOL二维三维岩石裂隙开度及裂隙渗透率变化模型 流固与热流固耦合均有
- 2017年暑假参加电赛在ROS平台上完成的四旋翼无人机飞行控制代码以及视觉识别部分。.zip
- APP基于DJI Mobile SDK,实现了获取和释放遥控器的控制权限、模拟遥控器的飞行控制操作、.zip
- Kendryte K210人工智能芯片应用程序集合,包括人脸检测、颜色检测、目标检测和分类、二维码和.zip
- ROS中集成各类无人机应用,并全部工程部署至Nvidia Xavier NX2,算法包括:Yolo系.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈