go excel导入Demo
package main import ( "fmt" "github.com/360EntSecGroup-Skylar/excelize" "github.com/jinzhu/gorm" _ "github.com/jinzhu/gorm/dialects/mysql" "strconv" "strings" "time" ) var Pdb *gorm.DB type Data struct { Rindex int CountryName string Sort int64 CountryId int64 LineName string LineType string Cname string //公司名称 UnitPrice float64 UnitGtePrice float64 UnitWeight int64 LimitWeight int64 RegFee float64 SpecialFee float64 ElectroFee float64 HasOversizeFee int64 OverlenFee float64 FuleFeeRate float64 //燃油附加费比例 BusyFee float64 Cfee float64 LowWeight int64 ServiceFeeRate float64 TariffFeeRate float64 InsureFeeRate float64 DaiyouFee float64 WeightRate float64 } var DataMap = make(map[int]Data) //线路表 type ZwPackLine struct { Id int64 `json:"id"` Name string `json:"name"` Type string `json:"type"` Spot string `json:"spot"` Process string `json:"process"` CreateTime int64 `json:"create_time"` UpdateTime int64 `json:"update_time"` } type ZwPackCountryLine struct { Id int64 `json:"id"` LineId int64 `json:"line_id"` Sort int64 `json:"sort"` CountryId int64 `json:"country_id"` CreateTime int64 `json:"create_time"` UpdateTime int64 `json:"update_time"` } //线路公司 type ZwPackCompany struct { Id int64 `json:"id"` LineId int64 `json:"line_id"` Cname string `json:"cname"` Score int `gorm:"default:5"` IsRec int `json:"is_rec"` CreateTime int64 `json:"create_time"` UpdateTime int64 `json:"update_time"` } //国家 type ZwCountries struct { Id int64 ChineseName string } //template type ZwPackFareTemplate struct { Id int64 `json:"id"` Name string `json:"name"` UnitPrice float64 `json:"unit_price"` UnitGtePrice float64 `json:"unit_gte_price"` UnitWeight int64 `json:"unit_weight"` } //companyTemplateRelation type ZwPackCtemplate struct { Id int64 `json:"id"` CompanyId int64 `json:"company_id"` TemplateId int64 `json:"template_id"` CreateTime int64 `json:"create_time"` UpdateTime int64 `json:"update_time"` } type ZwPackFareCountry struct { Id int64 `json:"id"` Tid int64 `json:"tid"` CountryId int64 `json:"country_id"` LowWeight int64 `json:"low_weight"` WeightLimit int64 `json:"weight_limit"` UnitPrice float64 `json:"unit_price"` UnitWeight int64 `json:"unit_weight"` UnitGtePrice float64 `json:"unit_gte_price"` Cfee float64 `json:"cfee"` RegFee float64 `json:"reg_fee"` FuleFeeRate float64 `json:"fule_fee_rate"` BusyFee float64 `json:"busy_fee"` SpecialFee float64 `json:"special_fee"` OverlenFee float64 `json:"overlen_fee"` HasOversizeFee int64 `json:"has_oversize_fee"` ElectroFee float64 `json:"electro_fee"` PackageFee float64 `json:"package_fee"` ServiceFeeRate float64 `json:"service_fee_rate"` TariffFeeRate float64 `json:"tariff_fee_rate"` InsureFeeRate float64 `json:"insure_fee_rate"` DaiyouFee float64 `json:"daiyou_fee"` VolumeWeight float64 `json:"volume_weight"` WeightRate float64 `json:"weight_rate"` CreateTime int64 `json:"create_time"` UpdateTime int64 `json:"update_time"` } var typeMap = map[string]string{ "经济": "economic", "快速": "fast", "特快": "express", "特殊": "special", } var countryId = make(map[string]int64) func init() { var err error Pdb, err = gorm.Open("mysql", "root:password@tcp(127.0.0.1:3306)/databaseName?charset=utf8&parseTime=True&loc=Local") if err != nil { panic(err) return } Pdb.SingularTable(true) fmt.Println("链接mysql成功") } func main() { f, err := excelize.OpenFile("/Users/DavidWang/goweb/project/excel/template1.28.xlsx")//excel文件路径 if err != nil { fmt.Println(err) return } // 获取 Sheet1 上所有单元格 rows := f.GetRows("Sheet1") for reindex, row := range rows { newData := Data{} for index, cell := range row { switch index { case 1: _, cid := getCountryId(cell) if cid == 0 { break } newData.CountryName = cell newData.CountryId = cid case 2: val, ok := typeMap[strings.Replace(cell, " ", "", -1)] if !ok { break } newData.LineType = val case 3: newData.Sort = decimalInt(cell) case 4: newData.LineName = cell case 5: newData.Cname = cell case 6: newData.UnitPrice = decimalFloat(cell) case 7: newData.UnitGtePrice = decimalFloat(cell) case 8: newData.UnitWeight = decimalInt(cell) case 9: //清关费 newData.RegFee = decimalFloat(cell) case 10: newData.SpecialFee = decimalFloat(cell) case 11: newData.ElectroFee = decimalFloat(cell) case 12: newData.HasOversizeFee = decimalInt(cell) case 13: if len(cell) == 0 { newData.OverlenFee = 0 } else { newData.OverlenFee = decimalFloat(cell) } case 14: newData.FuleFeeRate = decimalFloat(cell) case 15: newData.BusyFee = decimalFloat(cell) case 16: newData.Cfee = decimalFloat(cell) case 17: newData.LowWeight = decimalInt(cell) case 18: newData.ServiceFeeRate = decimalFloat(cell) case 19: newData.TariffFeeRate = decimalFloat(cell) case 20: newData.InsureFeeRate = decimalFloat(cell) case 21: newData.DaiyouFee = decimalFloat(cell) case 22: rate := decimalFloat(cell) if rate <= 0 { rate = 1 } newData.WeightRate = rate case 23: newData.LimitWeight = decimalInt(cell) } } newData.Rindex = reindex DataMap[reindex] = newData }
//todo:这里可以使用协程 for _, data := range DataMap { if data.LineName == "" { continue } if data.CountryId == 0 { continue } tx := Pdb.Begin() err, lineId := insertLine(tx, data.LineName, data.LineType) if err != nil { fmt.Println("写入线路表失败", data.LineName, data.LineType, err) tx.Rollback() continue } //国家线路表 err, _ = insertCountryLine(tx, data.CountryId, lineId, data.Sort) if err != nil { fmt.Println("写入国家线路表失败", data.LineName, data.CountryId, err) tx.Rollback() continue } fmt.Println("写入线路表成功", data.LineName) err, companyId := insertCompany(tx, lineId, data.Cname) if err != nil { fmt.Println("写入公司表失败表失败", data.LineName, data.LineType, err) tx.Rollback() continue } fmt.Println("写入公司表成功", data.Cname) err, templateId := insertTemplate(tx, data.CountryName+data.LineName+data.Cname, data.UnitPrice, data.UnitGtePrice, data.UnitWeight) if err != nil { fmt.Println("写入模板表失败表失败", data.Cname, data.LineName, err) tx.Rollback() continue } fmt.Println("写入模板表成功", data.Cname) err1, _ := insertCtemplate(tx, companyId, templateId) if err1 != nil { fmt.Println("写入公司模板关联表失败", companyId, templateId, err1) tx.Rollback() continue } fmt.Println("写入公司模板关联表成功", data.Cname, templateId) err2, _ := insertFareCountry(tx, templateId, data) if err2 != nil { fmt.Println("运费模板关联国家失败", countryId, templateId, err2) tx.Rollback() continue } tx.Commit() fmt.Println("恭喜你成功啦", data.LineName) } return //todo excelize根据指定单元格获取值会有问题(取不到),不建议使用 //var cellTop = []string{"B", "C", "D", "E", "F", "G", "H", "I", "L", "J", "K", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V"} //// 获取工作表中指定单元格的值 //var startPos int64 = 4 //for { // if startPos == 691 { // break // } // newData := Data{} // for _, cell := range cellTop { // index := fmt.Sprintf("%s%d", "C", 265) // cellVal := f.GetCellValue("Sheet1", index) // fmt.Println(index, cellVal) // return // switch cell { // case "B": // _, cid := getCountryId(cellVal) // newData.CountryId = cid // case "C": // val, ok := typeMap[strings.Replace(cellVal, " ", "", -1)] // if !ok { // fmt.Println("cellVal", cellVal, startPos) // return // continue // } // newData.LineType = val // } // // //println(cellVal) // } // startPos++ // println("startPos", startPos) // DataMap[startPos] = newData //} //for index, data := range DataMap { // fmt.Println("index,", index) // fmt.Println("LineType,", data.LineType) // fmt.Println("CountryId,", data.CountryId) //} //return // //cell := f.GetCellValue("Sheet1", "B5") //println(cell) //println(strings.Replace("你 好啊 哈 哈", " ", "", -1)) //countryId["美国"] = 1 //countryId["英国"] = 2 //cid, ok := countryId["英国"] //if !ok { // println("not found ", ok) // return //} //println("cid=", cid) //tx := Pdb.Begin() // //tx.Commit() // //return } func insertFareCountry(tx *gorm.DB, templateId int64, newData Data) (error, int64) { if newData.LimitWeight == 0 { newData.LimitWeight = 1000000 } fareCountry := ZwPackFareCountry{ Tid: templateId, CountryId: newData.CountryId, LowWeight: newData.LowWeight, WeightLimit: newData.LimitWeight, UnitPrice: newData.UnitPrice, UnitWeight: newData.UnitWeight, UnitGtePrice: newData.UnitGtePrice, Cfee: newData.Cfee, RegFee: newData.RegFee, FuleFeeRate: newData.FuleFeeRate, BusyFee: newData.BusyFee, SpecialFee: newData.SpecialFee, OverlenFee: newData.OverlenFee, HasOversizeFee: newData.HasOversizeFee, ElectroFee: newData.ElectroFee, PackageFee: 8, ServiceFeeRate: newData.ServiceFeeRate, TariffFeeRate: newData.TariffFeeRate, InsureFeeRate: newData.InsureFeeRate, DaiyouFee: newData.DaiyouFee, VolumeWeight: 1.1, WeightRate: newData.WeightRate, CreateTime: time.Now().Unix(), UpdateTime: time.Now().Unix(), } existFare := ZwPackFareCountry{ Tid: templateId, CountryId: newData.CountryId, } Pdb.Where("tid= ? and country_id = ?", templateId, newData.CountryId).First(&existFare) if existFare.Id > 0 { fareCountry.Id = existFare.Id } err := tx.Table("zw_pack_fare_country").Save(&fareCountry).Error if err != nil { return err, 0 } return nil, fareCountry.Id } func insertCtemplate(tx *gorm.DB, companyId int64, TemplateId int64) (error, int64) { ctemplate := ZwPackCtemplate{ CompanyId: companyId, TemplateId: TemplateId, CreateTime: time.Now().Unix(), UpdateTime: time.Now().Unix(), } Pdb.Where("company_id= ? and template_id = ?", companyId, TemplateId).First(&ctemplate) if ctemplate.Id > 0 { return nil, ctemplate.Id } err := tx.Table("zw_pack_ctemplate").Create(&ctemplate).Error if err != nil { return err, 0 } return nil, ctemplate.Id } func insertCountryLine(tx *gorm.DB, countryId int64, LineId int64, sort int64) (error, int64) { cline := ZwPackCountryLine{ LineId: LineId, CountryId: countryId, Sort: sort, CreateTime: time.Now().Unix(), UpdateTime: time.Now().Unix(), } existLine := ZwPackCountryLine{ LineId: LineId, CountryId: countryId, } Pdb.Where("country_id= ? and line_id = ?", countryId, LineId).First(&existLine) if existLine.Id > 0 { cline.Id = existLine.Id } err := tx.Table("zw_pack_country_line").Save(&cline).Error if err != nil { return err, 0 } return nil, cline.Id } func insertLine(tx *gorm.DB, name string, lineTypeStr string) (error, int64) { line := ZwPackLine{ Name: name, Type: lineTypeStr, Spot: "运输时效快,运费低", Process: "20-30天", CreateTime: time.Now().Unix(), } Pdb.Where("name = ?", name).First(&line) if line.Id > 0 { return nil, line.Id } err := tx.Table("zw_pack_line").Create(&line).Error if err != nil { return err, 0 } return nil, line.Id } func insertCompany(tx *gorm.DB, lineId int64, cname string) (error, int64) { company := ZwPackCompany{ LineId: lineId, Cname: cname, Score: 5, IsRec: 0, CreateTime: time.Now().Unix(), UpdateTime: time.Now().Unix(), } Pdb.Where("line_id= ? and cname = ?", lineId, cname).First(&company) if company.Id > 0 { return nil, company.Id } err := tx.Table("zw_pack_company").Create(&company).Error if err != nil { return err, 0 } return nil, company.Id } func insertTemplate(tx *gorm.DB, tName string, unitPrice float64, UnitGtePrice float64, UnitWeight int64) (error, int64) { template := ZwPackFareTemplate{ Name: tName, UnitPrice: unitPrice, UnitGtePrice: UnitGtePrice, UnitWeight: UnitWeight, } Pdb.Where("name= ?", tName).First(&template) if template.Id > 0 { return nil, template.Id } err := tx.Table("zw_pack_fare_template").Create(&template).Error if err != nil { return err, 0 } return nil, template.Id } /** **根据国家名称获取国家对应的id */ func getCountryId(countryName string) (error, int64) { var country []ZwCountries err := Pdb.Raw("SELECT id,name FROM zw_countries WHERE chinese_name=?", countryName).First(&country).Error if err != nil { return err, 0 } if len(country) == 0 { return err, 0 } return nil, country[0].Id } func decimalFloat(value string) float64 { f, _ := strconv.ParseFloat(value, 64) val, _ := strconv.ParseFloat(fmt.Sprintf("%.2f", f), 64) return val } func decimalInt(value string) int64 { i, _ := strconv.ParseInt(value, 10, 64) return i }