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