package export import ( "errors" "github.com/tealeg/xlsx/v3" "reflect" ) const Sheet_Name = "sheet_1" type Excel struct { f *File count int //总数 isNew bool titles []string file *xlsx.File sheet *xlsx.Sheet } func NewExcel(fileName string, limit int, param map[string]string) *Excel { return &Excel{ f: NewFile(fileName, limit, param), } } func (e *Excel) slice() { if e.f.slice() { e.reset() } } func (e *Excel) reset() { e.save() e.f.NextFile() e.Open() e.WriteTitle(nil) e.slice() } func (e *Excel) Open() error { var err error if e.f.IsFileExist() { e.file, err = xlsx.OpenFile(e.f.FileName()) if 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.f.SetRow(e.sheet.MaxRow) } return nil } func (e *Excel) save() error { return e.file.Save(e.f.FileName()) } func (e *Excel) WriteTitle(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 { e.Write(e.titles) e.isNew = false } return nil } func (e *Excel) Write(data interface{}) error { if e.f.slice() { e.reset() } row := e.sheet.AddRow() v := reflect.ValueOf(data) if v.Kind() == reflect.Ptr { v = v.Elem() } if v.Kind() != reflect.Slice { return errors.New("数据无效,不是切片类型") } switch val := data.(type) { case []string: row.WriteSlice(val, -1) case []interface{}: for _, i := range data.([]interface{}) { cell := row.AddCell() cell.SetValue(i) } } return nil } func (e *Excel) Close() error { return e.save() }