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 "未知" }