zoukankan      html  css  js  c++  java
  • 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 }

      

  • 相关阅读:
    [NOI2004] 郁闷的出纳员
    对象内部套嵌多个对象
    函数
    匿名函数、对象
    函数部分
    Html部分
    搜索二叉树的应用
    二叉树的线索化
    搜索结构搜索二叉树
    堆与最优级队列
  • 原文地址:https://www.cnblogs.com/ruanqin/p/14356508.html
Copyright © 2011-2022 走看看