excel-export/export/excel.go

134 lines
2.0 KiB
Go

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