@@ -0,0 +1,79 @@
|
||||
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 "未知"
|
||||
}
|
||||
Reference in New Issue
Block a user