80 lines
1.9 KiB
Go
80 lines
1.9 KiB
Go
package export
|
|
|
|
import (
|
|
"path/filepath"
|
|
"reflect"
|
|
"strconv"
|
|
"time"
|
|
|
|
"github.com/tealeg/xlsx"
|
|
"go.mongodb.org/mongo-driver/bson/primitive"
|
|
)
|
|
|
|
func ExportFilePath(fileName string) string {
|
|
var path, _ = filepath.Abs("temp")
|
|
return path + "/" + fileName
|
|
}
|
|
|
|
func ExportExcel(sheeters []ExcelSheeter, filePath string) error {
|
|
f := xlsx.NewFile()
|
|
for _, sheeter := range sheeters {
|
|
sheet, _ := f.AddSheet(sheeter.GetSheetName())
|
|
for _, rower := range sheeter.GetRows() {
|
|
row := sheet.AddRow()
|
|
for _, cell := range rower.GetCells() {
|
|
c := row.AddCell()
|
|
c.Value = getValue(reflect.TypeOf(cell).Kind(), reflect.ValueOf(cell))
|
|
}
|
|
}
|
|
}
|
|
return f.Save(filePath)
|
|
}
|
|
|
|
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:
|
|
if timeV, ok := value.Interface().(time.Time); 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 ""
|
|
}
|
|
return id.Hex()
|
|
}
|
|
}
|
|
return "未知"
|
|
}
|