116 lines
1.8 KiB
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()
|
|
}
|