excel-export/cmd/cmd/csv.go

128 lines
2.4 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package cmd
import (
"excel_export/biz/config"
"excel_export/biz/db"
"excel_export/biz/export"
"fmt"
"os"
"strconv"
"sync"
"time"
)
type Csv struct {
conf *config.Config
dirTemp string
}
func NewCsv(conf *config.Config) *Csv {
return &Csv{
conf: conf,
}
}
func (e *Csv) Export(sysName, jobName string, begin, end time.Time, batch int) error {
job, dbStr, err := config.GetJob(e.conf, sysName, jobName)
if err != nil {
return err
}
d, err := db.NewDb(dbStr)
if err != nil {
return err
}
return e.JobHandler(job, d, map[string]interface{}{
"begin": begin,
"end": end,
"last": 0,
}, batch)
}
func (e *Csv) JobHandler(job config.Job, d export.DataFetcher, params map[string]interface{}, batch int) error {
for i, task := range job.Tasks {
fmt.Printf("执行导出任务:%d\n", i+1)
params["task"] = i
if err := e.TaskExport(d, task, params, batch, job.GetFileName(params)); err != nil {
return err
}
}
return nil
}
func (e *Csv) TaskExport(d export.DataFetcher, t config.Task, params map[string]interface{}, batch int, fileName string) error {
var i int
var wg sync.WaitGroup
for i = 0; i < 1000; i++ {
f, err := e.getCsvFile(i)
if err != nil {
return err
}
sql := t.GetSql(params)
e := export.NewCsvExporter(d, f)
e.(*export.CsvExporter).WaitGroup(&wg)
wg.Add(1)
e.Export(sql+" limit "+strconv.Itoa(batch), t.PK)
count, last := e.Last()
fmt.Printf("已导出 %d 条数据\n", batch*i+count)
if count == 0 {
return nil
}
if count < batch {
break
}
params["last"] = last
time.Sleep(time.Microsecond * 30)
}
wg.Wait()
//fmt.Println("tempDir", e.dirTemp)
//todo 合并csv文件并删除 临时目录
err := e.mergeCsvToExcel(e.dirTemp, i, fileName)
fmt.Println(err)
//重置临时路径
e.dirTemp = ""
return nil
}
func (e *Csv) getCsvFile(index int) (*export.Csv, error) {
if e.dirTemp == "" {
path, err := os.MkdirTemp(os.TempDir(), "")
if err != nil {
return nil, err
}
e.dirTemp = path
}
filename := e.dirTemp + "/data_{index}.csv"
f := export.NewCsv(filename, map[string]string{
"index": strconv.Itoa(index),
})
return f, nil
}
func (e *Csv) mergeCsvToExcel(path string, max int, out string) error {
m := NewMerge(
Reader{Path: path, Index: max},
Writer{File: out, Limit: 1000000},
)
if err := m.Merge(); err != nil {
return err
}
return m.Clear()
}