3.5 KiB
3.5 KiB
安装
$ go get gitea.cdlsxd.cn/self-tools/l-export-async
使用
task, err := export_async.NewExportAsync(
fmt.Sprintf("%s%s", "供应商结算交易流水", time.Now().Format("20060102150405")),
supplierOrderTransRecordsFields(),
s.c.Rpc.GetAttachmentDomain(),
func(ctx context.Context, pageNum, limit int) ([][]interface{}, error) {
req.Page = &api.PageReq{
Page: int32(pageNum),
PageSize: int32(limit),
}
list, err := s.GetSupplierOrderTransRecordList(ctx, req)
if err != nil {
return nil, err
}
if list == nil {
return nil, nil
}
return supplierOrderTransRecordsToCollect(list.List), nil
},
export_async.NewRedisTaskStore(s.d.Rdb),
export_async.WithLogPrint(s.log),
export_async.WithProcess(count),
export_async.WithMaxRowPerFile(1000000),
).Run(ctx)
return nil, myerr.ErrorParamError("导出失败,请稍后重试:" + err.Error())
}
return &api.TaskReply{Task: task}, nil
主要功能
- 异步导出任务管理
- 使用 context.Context 支持上下文取消和超时控制。
- 通过 Task 结构体跟踪任务状态(ID、进度、错误信息、数据量等)。
- 支持任务进度更新和持久化存储(通过 TaskSaveTool 接口)。
- 并发处理
- CSV 导出:将数据分页写入多个 CSV 文件。
- Excel (XLSX) 导出:将多个 CSV 文件合并为多个 Excel 文件(支持流式处理,避免内存溢出)。
- ZIP 打包:将生成的 Excel 文件打包为 ZIP 文件。
- 数据分页与批量处理
- 支持分页查询数据(batchSize 控制每页大小)
- 支持限制每个 Excel 文件的最大行数(maxRowPerFile)。
- 支持 CSV 转 Excel 时的批量写入缓冲区大小(csvToExcelBatch)。
- 文件上传
- 支持将生成的 ZIP 文件上传到指定服务器(通过 Uploader 配置)。
- 上传后生成可访问的 URL(通过 GeneratePreviewPrivateUrl 生成预览链接)。
- 日志记录
- 通过 LogTool 接口记录任务执行过程中的日志(如进度、错误信息等)。
- 临时文件管理
- 自动创建临时目录(/csv/、/xlsx/、/zip/)并清理。
- 支持自定义文件扩展名(extension)、Sheet 名称(sheetName)等。
- 可扩展性
- 通过 ExportOption 函数式选项模式支持灵活配置(如自定义上传器、日志工具、工作协程数等)。
- 通过接口(DataProviderFn、TaskSaveTool、LogTool)支持自定义实现。
亮点
- 高性能与低内存占用
- 使用流式处理(csv.Writer 和 zip.Writer)避免一次性加载所有数据到内存。
- 通过分页查询和并发处理减少数据库压力。
- 使用 sync.Pool 复用 ExportAsync 实例,减少内存分配。
- 进度跟踪与任务状态管理
- 支持任务状态持久化(如存储到 Redis),方便前端查询进度
- 灵活的配置
- 支持通过函数式选项(ExportOption)动态配置导出任务(如自定义上传器、日志工具、工作协程数等)。
- 默认配置合理(如 batchSize=10000、maxRowPerFile=10000),同时支持覆盖。
- 支持大数据量导出
- 通过分页和并发处理支持导出千万级数据。
- 支持限制每个 Excel 文件的行数,避免单个文件过大。
适用场景
- 需要导出大量数据(如报表、日志、用户数据等)到 Excel 或 CSV 的场景。
- 需要支持异步导出(避免阻塞主流程)的场景。
- 需要将导出的文件上传到服务器(如 OSS、FTP 等)的场景。
- 需要进度跟踪和任务状态管理的场景。