432 lines
10 KiB
Go
432 lines
10 KiB
Go
package exportser
|
|
|
|
import (
|
|
"container/list"
|
|
"errors"
|
|
"fmt"
|
|
"path/filepath"
|
|
"reflect"
|
|
"strconv"
|
|
"time"
|
|
|
|
"91porn-server/common/constant"
|
|
"91porn-server/common/file"
|
|
"91porn-server/common/log"
|
|
"91porn-server/models/s/statordermod"
|
|
"91porn-server/models/s/statvidmod"
|
|
"91porn-server/models/v/exchcodemod"
|
|
"91porn-server/models/v/rchgordmod"
|
|
"91porn-server/models/v/txnmod"
|
|
"91porn-server/models/v/usermod"
|
|
"91porn-server/models/v/wdordmod"
|
|
|
|
"github.com/tealeg/xlsx"
|
|
"go.mongodb.org/mongo-driver/bson/primitive"
|
|
)
|
|
|
|
// Import 读取文件
|
|
func Import(inFile string) (data *list.List, errr error) {
|
|
// 打开文件
|
|
xlFile, err := xlsx.OpenFile(inFile)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
l := list.New()
|
|
// 遍历sheet页读取
|
|
for _, sheet := range xlFile.Sheets {
|
|
fmt.Println("sheet name: ", sheet.Name)
|
|
//遍历行读取
|
|
for _, row := range sheet.Rows {
|
|
var rowCell []string
|
|
// 遍历每行的列读取
|
|
for _, cell := range row.Cells {
|
|
text := cell.String()
|
|
rowCell = append(rowCell, text)
|
|
}
|
|
l.PushBack(rowCell)
|
|
}
|
|
}
|
|
return l, nil
|
|
}
|
|
|
|
type Student struct {
|
|
Name string
|
|
age int
|
|
Phone string
|
|
Gender string
|
|
Mail string
|
|
}
|
|
|
|
// Export 导出xlsx文件
|
|
func Export(typeFile int64) (string, error) {
|
|
switch typeFile {
|
|
case constant.ChannelLogTypeFile:
|
|
return ExampleExport()
|
|
default:
|
|
return "", errors.New("not this type of excel")
|
|
}
|
|
}
|
|
|
|
func ExampleExport() (string, error) {
|
|
var fileName = "导出excel案列文件.xlsx"
|
|
f := xlsx.NewFile()
|
|
sheet, err := f.AddSheet("导出excel案列")
|
|
if err != nil {
|
|
fmt.Println(err.Error())
|
|
return "", err
|
|
}
|
|
data := getStudents()
|
|
//add data
|
|
for _, stu := range data {
|
|
row := sheet.AddRow()
|
|
nameCell := row.AddCell()
|
|
nameCell.Value = stu.Name
|
|
ageCell := row.AddCell()
|
|
ageCell.Value = strconv.Itoa(stu.age)
|
|
phoneCell := row.AddCell()
|
|
phoneCell.Value = stu.Phone
|
|
genderCell := row.AddCell()
|
|
genderCell.Value = stu.Gender
|
|
mailCell := row.AddCell()
|
|
mailCell.Value = stu.Mail
|
|
}
|
|
var path, _ = filepath.Abs("temp")
|
|
if err = file.MakeDir(path); err != nil {
|
|
log.Warn("can't make fs dir", log.E(err))
|
|
}
|
|
fpath := path + "/" + fileName
|
|
fmt.Println(fpath)
|
|
if err = f.Save(fpath); err != nil {
|
|
fmt.Println(err.Error())
|
|
return "", err
|
|
}
|
|
fmt.Println("\n\nexport success")
|
|
return fpath, nil
|
|
}
|
|
|
|
func StructToTitle(s *xlsx.Sheet, obj interface{}) {
|
|
t := reflect.TypeOf(obj)
|
|
row := s.AddRow()
|
|
for i := 0; i < t.NumField(); i++ {
|
|
k, _ := t.Field(i).Tag.Lookup("json")
|
|
c := row.AddCell()
|
|
c.Value = k
|
|
}
|
|
}
|
|
|
|
func StructToTitle2(s *xlsx.Sheet, obj interface{}, lableMap map[string]string) {
|
|
t := reflect.TypeOf(obj)
|
|
v := reflect.ValueOf(obj)
|
|
row := s.AddRow()
|
|
for i := 0; i < t.NumField(); i++ {
|
|
vv := v.Field(i)
|
|
fv := vv.Type()
|
|
switch fv.Kind() {
|
|
case reflect.Struct:
|
|
}
|
|
k, _ := t.Field(i).Tag.Lookup("json")
|
|
lable, ok := lableMap[k]
|
|
if !ok {
|
|
lable = k
|
|
}
|
|
row.AddCell().Value = lable
|
|
}
|
|
}
|
|
|
|
func getValue(kind reflect.Kind, value reflect.Value) string {
|
|
switch kind {
|
|
case reflect.String:
|
|
return value.String()
|
|
case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
|
|
return strconv.FormatInt(value.Int(), 10)
|
|
case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
|
|
return strconv.FormatUint(value.Uint(), 10)
|
|
case reflect.Bool:
|
|
return strconv.FormatBool(value.Bool())
|
|
case reflect.Float32, reflect.Float64:
|
|
return strconv.FormatFloat(value.Float(), 'f', 2, 64)
|
|
case reflect.Struct:
|
|
timeV, ok := value.Interface().(time.Time)
|
|
if ok {
|
|
return timeV.String()
|
|
}
|
|
if oid, ok := value.Interface().(primitive.ObjectID); ok {
|
|
return oid.Hex()
|
|
}
|
|
return ""
|
|
case reflect.Interface:
|
|
if timeV, ok := value.Interface().(time.Time); ok {
|
|
return timeV.String()
|
|
}
|
|
return ""
|
|
case reflect.Ptr:
|
|
if value.IsNil() {
|
|
return ""
|
|
}
|
|
value = value.Elem()
|
|
if value.Interface() != nil {
|
|
if timeV, ok := value.Interface().(time.Time); ok {
|
|
return timeV.String()
|
|
}
|
|
} else {
|
|
return ""
|
|
}
|
|
case reflect.Array:
|
|
if id, ok := value.Interface().(primitive.ObjectID); ok {
|
|
if id.IsZero() {
|
|
return ""
|
|
} else {
|
|
return id.Hex()
|
|
}
|
|
}
|
|
}
|
|
return "未知"
|
|
}
|
|
|
|
func StructToRow(row *xlsx.Row, obj interface{}) error {
|
|
t := reflect.TypeOf(obj)
|
|
v := reflect.ValueOf(obj)
|
|
for i := 0; i < t.NumField(); i++ {
|
|
fv := v.Field(i).Type()
|
|
vv := v.Field(i)
|
|
c := row.AddCell()
|
|
c.Value = getValue(fv.Kind(), vv)
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func UserListExport(path string, index int, users []usermod.ExportUser) (string, error) {
|
|
var fileName = fmt.Sprintf("用户列表_%v.xlsx", index)
|
|
f := xlsx.NewFile()
|
|
sheet, err := f.AddSheet("用户列表")
|
|
if err != nil {
|
|
fmt.Println(err.Error())
|
|
return "", err
|
|
}
|
|
StructToTitle(sheet, usermod.ExportUser{})
|
|
//add data
|
|
for _, u := range users {
|
|
row := sheet.AddRow()
|
|
_ = StructToRow(row, u)
|
|
}
|
|
if err = file.MakeDir(path); err != nil {
|
|
log.Warn("can't make fs dir", log.E(err))
|
|
}
|
|
fpath := path + "/" + fileName
|
|
fmt.Println(fpath)
|
|
err = f.Save(fpath)
|
|
if err != nil {
|
|
fmt.Println(err.Error())
|
|
return "", err
|
|
}
|
|
fmt.Println("\n\nexport success")
|
|
return fpath, nil
|
|
}
|
|
|
|
func getStudents() []Student {
|
|
students := make([]Student, 10)
|
|
for i := 0; i < 10; i++ {
|
|
stu := Student{}
|
|
stu.Name = "name" + strconv.Itoa(i+1)
|
|
stu.Mail = stu.Name + "@chairis.cn"
|
|
stu.Phone = "1380013800" + strconv.Itoa(i)
|
|
stu.age = 20
|
|
stu.Gender = "男"
|
|
students[i] = stu
|
|
}
|
|
return students
|
|
}
|
|
|
|
// RechargeOrderExport 充值订单存xlsx
|
|
func RechargeOrderExport(orders []*rchgordmod.RchargeOrderExport) (string, error) {
|
|
var fileName = "充值订单.xlsx"
|
|
f := xlsx.NewFile()
|
|
sheet, err := f.AddSheet("充值订单")
|
|
if err != nil {
|
|
fmt.Println(err.Error())
|
|
return "", err
|
|
}
|
|
StructToTitle(sheet, rchgordmod.RchargeOrderExport{})
|
|
//add data
|
|
for _, o := range orders {
|
|
row := sheet.AddRow()
|
|
_ = StructToRow(row, *o)
|
|
}
|
|
var path, _ = filepath.Abs("temp")
|
|
if err = file.MakeDir(path); err != nil {
|
|
log.Warn("can't make fs dir", log.E(err))
|
|
}
|
|
fpath := path + "/" + fileName
|
|
if err = f.Save(fpath); err != nil {
|
|
return "", err
|
|
}
|
|
return fpath, nil
|
|
}
|
|
|
|
// WithdrawOrderExport 提现订单存xlsx
|
|
func WithdrawOrderExport(orders []*wdordmod.WithdrawOrder) (string, error) {
|
|
var fileName = "提现订单.xlsx"
|
|
f := xlsx.NewFile()
|
|
sheet, err := f.AddSheet("提现订单")
|
|
if err != nil {
|
|
fmt.Println(err.Error())
|
|
return "", err
|
|
}
|
|
StructToTitle(sheet, wdordmod.WithdrawOrder{})
|
|
//add data
|
|
for _, o := range orders {
|
|
row := sheet.AddRow()
|
|
_ = StructToRow(row, *o)
|
|
}
|
|
var path, _ = filepath.Abs("temp")
|
|
if err = file.MakeDir(path); err != nil {
|
|
log.Warn("can't make fs dir", log.E(err))
|
|
}
|
|
fpath := path + "/" + fileName
|
|
if err = f.Save(fpath); err != nil {
|
|
return "", err
|
|
}
|
|
return fpath, nil
|
|
}
|
|
|
|
// GoldTurnoverExport 金币流水存xlsx
|
|
func GoldTurnoverExport(turnover []*txnmod.TransactionLog) (string, error) {
|
|
var fileName = "金币流水.xlsx"
|
|
f := xlsx.NewFile()
|
|
sheet, err := f.AddSheet("金币流水")
|
|
if err != nil {
|
|
fmt.Println(err.Error())
|
|
return "", err
|
|
}
|
|
StructToTitle(sheet, txnmod.TransactionLog{})
|
|
//add data
|
|
for _, t := range turnover {
|
|
row := sheet.AddRow()
|
|
_ = StructToRow(row, *t)
|
|
}
|
|
var path, _ = filepath.Abs("temp")
|
|
if err = file.MakeDir(path); err != nil {
|
|
log.Warn("can't make fs dir", log.E(err))
|
|
}
|
|
fpath := path + "/" + fileName
|
|
if err = f.Save(fpath); err != nil {
|
|
return "", err
|
|
}
|
|
return fpath, nil
|
|
}
|
|
|
|
func changeVideoStatRecord(incomes []statvidmod.VideoStatRecord) []statvidmod.VideoStatExport {
|
|
infos := make([]statvidmod.VideoStatExport, len(incomes))
|
|
for i, v := range incomes {
|
|
vs := statvidmod.VideoStatExport{}
|
|
if v.SumDate != nil {
|
|
vs.SumDate = *v.SumDate
|
|
}
|
|
if v.Video.ID != nil {
|
|
vs.ID = *v.Video.ID
|
|
}
|
|
if v.Video.Title != nil {
|
|
vs.Title = *v.Video.Title
|
|
}
|
|
if v.Video.PublisherID != nil {
|
|
vs.PublisherID = *v.Video.PublisherID
|
|
}
|
|
if v.Video.Coins != nil {
|
|
vs.Coins = *v.Video.Coins
|
|
}
|
|
if v.Income != nil {
|
|
vs.Income = *v.Income
|
|
}
|
|
if v.Tax != nil {
|
|
vs.Tax = *v.Tax
|
|
}
|
|
if v.PayCount != nil {
|
|
vs.PayCount = *v.PayCount
|
|
}
|
|
if v.CreatedAt != nil {
|
|
vs.CreatedAt = *v.CreatedAt
|
|
}
|
|
infos[i] = vs
|
|
}
|
|
return infos
|
|
}
|
|
|
|
// VideoIncomeExport 视频收入存xlsx
|
|
func VideoIncomeExport(incomes []statvidmod.VideoStatRecord) (string, error) {
|
|
infos := changeVideoStatRecord(incomes)
|
|
var fileName = "视频收入.xlsx"
|
|
f := xlsx.NewFile()
|
|
sheet, err := f.AddSheet("视频收入")
|
|
if err != nil {
|
|
fmt.Println(err.Error())
|
|
return "", err
|
|
}
|
|
StructToTitle(sheet, statvidmod.VideoStatExport{})
|
|
//add data
|
|
for _, i := range infos {
|
|
row := sheet.AddRow()
|
|
_ = StructToRow(row, i)
|
|
}
|
|
var path, _ = filepath.Abs("temp")
|
|
if err = file.MakeDir(path); err != nil {
|
|
log.Warn("can't make fs dir", log.E(err))
|
|
}
|
|
fpath := path + "/" + fileName
|
|
if err = f.Save(fpath); err != nil {
|
|
return "", err
|
|
}
|
|
return fpath, nil
|
|
}
|
|
|
|
// OrderStatExport 订单统计存xlsx
|
|
func OrderStatExport(orders []statordermod.OrderState) (string, error) {
|
|
var fileName = "订单统计.xlsx"
|
|
f := xlsx.NewFile()
|
|
sheet, err := f.AddSheet("订单统计")
|
|
if err != nil {
|
|
fmt.Println(err.Error())
|
|
return "", err
|
|
}
|
|
StructToTitle(sheet, statordermod.OrderState{})
|
|
//add data
|
|
for _, o := range orders {
|
|
row := sheet.AddRow()
|
|
_ = StructToRow(row, o)
|
|
}
|
|
var path, _ = filepath.Abs("temp")
|
|
if err = file.MakeDir(path); err != nil {
|
|
log.Warn("can't make fs dir", log.E(err))
|
|
}
|
|
fpath := path + "/" + fileName
|
|
if err = f.Save(fpath); err != nil {
|
|
return "", err
|
|
}
|
|
return fpath, nil
|
|
}
|
|
|
|
// ExchangeCodeExport 兑换码导出
|
|
func ExchangeCodeExport(codes []exchcodemod.RespList) (string, error) {
|
|
var fileName = "兑换码.xlsx"
|
|
f := xlsx.NewFile()
|
|
sheet, err := f.AddSheet("兑换码")
|
|
if err != nil {
|
|
fmt.Println(err.Error())
|
|
return "", err
|
|
}
|
|
StructToTitle(sheet, exchcodemod.RespList{})
|
|
//add data
|
|
for _, c := range codes {
|
|
row := sheet.AddRow()
|
|
_ = StructToRow(row, c)
|
|
}
|
|
var path, _ = filepath.Abs("temp")
|
|
if err = file.MakeDir(path); err != nil {
|
|
log.Warn("can't make fs dir", log.E(err))
|
|
}
|
|
fpath := path + "/" + fileName
|
|
if err = f.Save(fpath); err != nil {
|
|
return "", err
|
|
}
|
|
return fpath, nil
|
|
}
|