package export import ( "errors" "fmt" "github.com/tealeg/xlsx/v3" "os" ) const sheet_name = "sheet_1" type Export struct { index int count int //总数 row int //当前执行的数据行 limit int //导出限制 path string isNew bool titles []string file *xlsx.File sheet *xlsx.Sheet } func NewExport(path string, limit int) *Export { return &Export{ path: path, limit: limit, } } func (e *Export) Title(titles []string) error { if e.file == nil || e.sheet == nil { return errors.New("没有执行open方法") } if titles != nil { e.titles = titles } if e.titles != nil && e.isNew { row := e.sheet.AddRow() row.WriteSlice(e.titles, -1) } return nil } func (e *Export) fileName() string { return fmt.Sprintf(e.path, e.index) } func (e *Export) slice() { e.row++ if e.row > e.limit { e.row = 0 e.reset() } } func (e *Export) reset() { e.save() e.index++ e.Open() e.Title(nil) e.slice() } func (e Export) Index() int { return e.index } func (e *Export) Export(data Entity) error { if e.file == nil || e.sheet == nil { return errors.New("没有执行open方法") } e.count = e.count + data.Size() for _, order := range data.Data() { e.slice() row := e.sheet.AddRow() row.WriteStruct(order, -1) } return e.save() } func (e *Export) Open() error { path := e.fileName() exist, err := e.isFielExist(path) if err != nil { return err } if exist { e.isNew = false if e.file, err = xlsx.OpenFile(path); err != nil { return err } } else { e.isNew = true e.file = xlsx.NewFile() } var ok bool e.sheet, ok = e.file.Sheet[sheet_name] if !ok { e.sheet, err = e.file.AddSheet(sheet_name) if err != nil { return err } } else { //需要处理偏移数据 e.row = e.sheet.MaxRow - 1 } return nil } func (e *Export) isFielExist(file string) (bool, error) { _, err := os.Stat(file) if err == nil { return true, nil } if os.IsNotExist(err) { return false, nil } return false, err } func (e *Export) save() error { return e.file.Save(e.fileName()) }