|
|
package csv
|
|
|
|
|
|
import (
|
|
|
"context"
|
|
|
"joybuywork/internal/plugins/export"
|
|
|
"encoding/csv"
|
|
|
"fmt"
|
|
|
"os"
|
|
|
)
|
|
|
|
|
|
type Export struct {
|
|
|
export.BaseExport
|
|
|
fields []string //表头对应的字段key []string{"key1", "key2"}
|
|
|
header []string //表头数据 []string{"表头1", “表头2”}
|
|
|
file *os.File //文件资源
|
|
|
w *csv.Writer //csv文件写入资源
|
|
|
}
|
|
|
|
|
|
// NewExport 实例化csv导出对象
|
|
|
func NewExport(ctx context.Context, header export.HeaderField, total int64, opts ...export.Option) *Export {
|
|
|
ept := new(Export)
|
|
|
{
|
|
|
ept.Init(ctx, header, total, opts...)
|
|
|
}
|
|
|
|
|
|
//初始化头部信息和字段key信息
|
|
|
for _, v := range ept.Header {
|
|
|
ept.header = append(ept.header, v.Title)
|
|
|
ept.fields = append(ept.fields, v.Field)
|
|
|
}
|
|
|
|
|
|
//设置文件名称
|
|
|
ept.SetFilename(ept)
|
|
|
|
|
|
return ept
|
|
|
}
|
|
|
|
|
|
// ExportFile 直接导出数据
|
|
|
func (e *Export) ExportFile(data []export.RowData) (err error) {
|
|
|
defer e.file.Close()
|
|
|
|
|
|
err = e.initFile()
|
|
|
if err != nil {
|
|
|
return
|
|
|
}
|
|
|
|
|
|
list := e.getList(data)
|
|
|
|
|
|
//写入数据
|
|
|
err = e.w.WriteAll(list)
|
|
|
if err != nil {
|
|
|
return err
|
|
|
}
|
|
|
|
|
|
return
|
|
|
}
|
|
|
|
|
|
// 初始化csv文件对象
|
|
|
func (e *Export) initFile() (err error) {
|
|
|
// 不存在则创建;存在则追加;读写模式;
|
|
|
file, err := os.OpenFile(e.GetFullPath(), os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0666)
|
|
|
if err != nil {
|
|
|
return
|
|
|
}
|
|
|
|
|
|
//自定义文件
|
|
|
if e.IsCustomerFile() {
|
|
|
e.w = csv.NewWriter(file)
|
|
|
return
|
|
|
}
|
|
|
|
|
|
// 写入UTF-8 BOM,防止中文乱码
|
|
|
_, err = file.WriteString("\xEF\xBB\xBF")
|
|
|
if err != nil {
|
|
|
return
|
|
|
}
|
|
|
|
|
|
//实例csv写入数据
|
|
|
w := csv.NewWriter(file)
|
|
|
|
|
|
//写把头写到数据里面
|
|
|
err = w.Write(e.header)
|
|
|
if err != nil {
|
|
|
return
|
|
|
}
|
|
|
w.Flush()
|
|
|
|
|
|
e.w = w
|
|
|
e.file = file
|
|
|
|
|
|
return
|
|
|
}
|
|
|
|
|
|
// 获取每行输出的数据
|
|
|
func (e *Export) getList(data []export.RowData) [][]string {
|
|
|
var list [][]string
|
|
|
for _, row := range data {
|
|
|
var one []string
|
|
|
for _, field := range e.fields {
|
|
|
v, ok := row[field]
|
|
|
if ok {
|
|
|
one = append(one, fmt.Sprintf("%v", v))
|
|
|
} else {
|
|
|
one = append(one, "")
|
|
|
}
|
|
|
}
|
|
|
list = append(list, one)
|
|
|
}
|
|
|
|
|
|
return list
|
|
|
}
|
|
|
|
|
|
// FileSuffix 文件后缀
|
|
|
func (e *Export) FileSuffix() string {
|
|
|
return "csv"
|
|
|
}
|