l-export-async/README.md

3.6 KiB
Raw Blame History

安装

$ go get  gitea.cdlsxd.cn/self-tools/l-export-async

使用

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 接口)。

  1. 并发处理
  • CSV 导出:将数据分页写入多个 CSV 文件。
  • Excel (XLSX) 导出:将多个 CSV 文件合并为多个 Excel 文件(支持流式处理,避免内存溢出)。
  • ZIP 打包:将生成的 Excel 文件打包为 ZIP 文件。

  1. 数据分页与批量处理
  • 支持分页查询数据batchSize 控制每页大小)
  • 支持限制每个 Excel 文件的最大行数maxRowPerFile
  • 支持 CSV 转 Excel 时的批量写入缓冲区大小csvToExcelBatch

  1. 文件上传
  • 支持将生成的 ZIP 文件上传到指定服务器(通过 Uploader 配置)。
  • 上传后生成可访问的 URL通过 GeneratePreviewPrivateUrl 生成预览链接)。

  1. 日志记录
  • 通过 LogTool 接口记录任务执行过程中的日志(如进度、错误信息等)。

  1. 临时文件管理
  • 自动创建临时目录(/csv/、/xlsx/、/zip/)并清理。
  • 支持自定义文件扩展名extension、Sheet 名称sheetName等。

  1. 可扩展性
  • 通过 ExportOption 函数式选项模式支持灵活配置(如自定义上传器、日志工具、工作协程数等)。
  • 通过接口DataProviderFn、TaskSaveTool、LogTool支持自定义实现。

亮点

  1. 高性能与低内存占用
  • 使用流式处理csv.Writer 和 zip.Writer避免一次性加载所有数据到内存。
  • 通过分页查询和并发处理减少数据库压力。
  • 使用 sync.Pool 复用 ExportAsync 实例,减少内存分配。

  1. 进度跟踪与任务状态管理
  • 支持任务状态持久化(如存储到 Redis方便前端查询进度

  1. 灵活的配置
  • 支持通过函数式选项ExportOption动态配置导出任务如自定义上传器、日志工具、工作协程数等
  • 默认配置合理(如 batchSize=10000、maxRowPerFile=10000同时支持覆盖。

  1. 支持大数据量导出
  • 通过分页和并发处理支持导出千万级数据。
  • 支持限制每个 Excel 文件的行数,避免单个文件过大。

适用场景

  • 需要导出大量数据(如报表、日志、用户数据等)到 Excel 或 CSV 的场景。
  • 需要支持异步导出(避免阻塞主流程)的场景。
  • 需要将导出的文件上传到服务器(如 OSS、FTP 等)的场景。
  • 需要进度跟踪和任务状态管理的场景。