excel-export/biz/export/excel.go

116 lines
1.8 KiB
Go

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()
}