134 lines
2.0 KiB
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())
|
|
}
|