package main
import (
"fmt"
"github.com/xuri/excelize"
"log"
"reflect"
"strconv"
"time"
)
type ExcelData interface {
CreateMap(arr []string) map[string]interface{}
ChangeTime(source string) time.Time
}
type ExcelStrcut struct {
temp [][]string
Model interface{}
Info []map[string]string
}
type CacrmCaCrmUserHelper struct {
JobCode string
Password string
Code string
Name string
TypeName string
Type string
BackCode string
}
var file *excelize.File
func (excel *ExcelStrcut) ReadExcel(stringArray [][]string) *ExcelStrcut {
excel.temp = stringArray
return excel
}
func (excel *ExcelStrcut) CreateMap() *ExcelStrcut {
//利用反射得到字段名
for _, v := range excel.temp {
var info = make(map[string]string)
for i := 0; i < reflect.ValueOf(excel.Model).NumField(); i++ {
obj := reflect.TypeOf(excel.Model).Field(i)
//fmt.Printf("key:%s--val:%s\n",obj.Name,v[i])
info[obj.Name] = v[i]
}
excel.Info = append(excel.Info, info)
}
return excel
}
func (excel *ExcelStrcut) ChangeTime(source string) time.Time {
ChangeAfter, err := time.Parse("2006-01-02", source)
if err != nil {
log.Fatalf("转换时间错误:%s", err)
}
return ChangeAfter
}
func main() {
f, err := excelize.OpenFile("test.xlsx")
if err != nil {
fmt.Println(err)
return
}
excel_map:=f.GetSheetMap()
for i,k:=range excel_map{
rows, err := f.GetRows(k)
if err != nil {
fmt.Println(err)
return
}
e:=ExcelStrcut{}
temp := CacrmCaCrmUserHelper{}
e.Model=temp
e.ReadExcel(rows).CreateMap().SaveDb(i,&temp)
}
}
func (excel *ExcelStrcut)SaveDb(j int,temp *CacrmCaCrmUserHelper) *ExcelStrcut{
//忽略标题行
for i:=1 ;i<len(excel.Info);i++{
t:=reflect.ValueOf(temp).Elem()
for k,v:=range excel.Info[i]{
fmt.Println("666666666666666",excel.Info[i])
//fmt.Println(t.FieldByName(k).t.FieldByName(k).Kind())
//fmt.Println("key:%v---val:%v",t.FieldByName(k),t.FieldByName(k).Kind())
switch t.FieldByName(k).Kind(){
case reflect.String:
t.FieldByName(k).Set(reflect.ValueOf(v))
case reflect.Float64:
tempV,err:= strconv.ParseFloat(v,64)
if err != nil{
log.Printf("string to float64 err:%v",err)
}
t.FieldByName(k).Set(reflect.ValueOf(tempV))
case reflect.Uint64:
reflect.ValueOf(v)
tempV, err := strconv.ParseUint(v, 0, 64)
if err != nil{
log.Printf("string to uint64 err:%v",err)
}
t.FieldByName(k).Set(reflect.ValueOf(tempV))
case reflect.Struct:
tempV,err:=time.Parse("2006-01-02", v)
if err!=nil {
log.Fatalf("string to time err:%v",err)
}
t.FieldByName(k).Set(reflect.ValueOf(tempV))
default:
fmt.Println(t.FieldByName(k).Kind())
}
}
fmt.Println("5555555555555555")
DB,ok:=NewDb()
if ok!=nil{
fmt.Println("6666666",ok)
}
DB.SingularTable(true)
if j<3{
temp.Name=temp.Code
temp.Code=""
temp.BackCode=temp.Type
temp.Type=""
}
err:=DB.Debug().Create(&temp).Error
if err != nil{
log.Fatalf("save temp table err:%v",err)
}
}
return excel
}
db
package main
import (
"encoding/json"
"fmt"
"github.com/go-sql-driver/mysql"
"github.com/jinzhu/gorm"
"io/ioutil"
"log"
"os"
)
type Config struct {
Db struct {
Host string `json:"host"`
Port string `json:"port"`
User string `json:"user"`
Password string `json:"password"`
Name string `json:"name"`
Prefix string `json:"prefix"`
MaxOpenConn int `json:"max_open_conn"`
Params map[string]string `json:"params"`
Debug bool `json:"debug"`
} `json:"db"`
}
var instanceDb *gorm.DB
var DefaultConfig *Config
func NewDb()(*gorm.DB, error){
if instanceDb==nil{
config:=NewConfig("test.json")
fmt.Println(config)
mysqlConfig := mysql.NewConfig()
mysqlConfig.User = config.Db.User
mysqlConfig.DBName = config.Db.Name
mysqlConfig.Passwd = config.Db.Password
mysqlConfig.Params = config.Db.Params
mysqlConfig.Net = "tcp"
mysqlConfig.Addr = config.Db.Host + ":" + config.Db.Port
db, err := gorm.Open("mysql", mysqlConfig.FormatDSN())
db.DB().SetMaxOpenConns(config.Db.MaxOpenConn)
db.SingularTable(true)
instanceDb = db
return instanceDb, err
}
return instanceDb, nil
}
func NewConfig(file string) *Config {
if DefaultConfig==nil{
configText,err:=ioutil.ReadFile(file)
if err!=nil{
log.Println("配置文件读取错误,启动默认配置:", err.Error())
os.Exit(1)
}
err=json.Unmarshal(configText,&DefaultConfig)
return DefaultConfig
}
return DefaultConfig
}