package main import ( "fmt" "strconv" //"pkg/mod/github.com/360!ent!sec!group-!skylar/excelize@v1.4.1" "github.com/360EntSecGroup-Skylar/excelize" _ "github.com/go-sql-driver/mysql" "github.com/jinzhu/gorm" "log" ) var DB1 *gorm.DB type User struct { Rechargedate string `json:"rechargedate"` Rechargetime string `json:"rechargetime"` Rechargezone string `json:"rechargezone"` Rechargechannel string `json:"rechargechannel"` Rechargemoney string `json:"rechargemoney"` Rechargepeople string `json:"rechargepeople"` } //初始化并保持链接 func init() { var err error //DB, err = gorm.Open("mysql", "backupinfo:backupinfo123123@tcp(127.0.0.1:xxxxx)/test?charset=utf8&parseTime=True&loc=Local") //DB, err = gorm.Open("mysql", "backupinfo:backupinfo123123@tcp(xxxxx:xxxx)/test?charset=utf8&parseTime=True&loc=Local") DB1, err = gorm.Open("mysql", "xx:xxx@tcp(xxx63994)/xxx?charset=utf8&parseTime=True&loc=Local") // DB.LogMode(true)//打印sql语句 if err != nil { log.Fatalf("database11 connect is err:%s", err.Error()) } else { log.Print("connect database11 is success") } err = DB1.DB().Ping() if err != nil { DB1.DB().Close() log.Fatalf("Error on opening database11 connection: %s", err.Error()) } } func GetRoleList1() (userlist []User, err error) { //err = DB1.Find(&rolelist,"id < ?",10000).Error //err = DB.Find(&rolelist,20).Error //fmt.Println(rolelist) //var userlist []User //DB1.Raw("select id,publish_id from users limit 10").Find(&userlist) //DB1.Raw("select id,publish_id from users limit 10").Find(&userlist) DB1.Raw("SELECT DATE(updated_at) as rechargedate ,DATE_FORMAT(updated_at,'%H') as rechargetime ,server_id as rechargezone,channel_id as rechargechannel ,SUM(amount)/100 as rechargemoney,COUNT(DISTINCT(open_id)) as rechargepeople FROM orders fmt.Println("sql执行结果!!!!") fmt.Println(userlist) return userlist, err } func main() { //var user User //var userlists []User userlist,_ := GetRoleList1() fmt.Println("打印数据:") var userlists []map[string]interface{} for i := 0; i < len(userlist); i++ { userdic := make(map[string]interface{}) userdic["rechargedate"] = userlist[i].Rechargedate userdic["rechargetime"] = userlist[i].Rechargetime userdic["rechargezone"] = userlist[i].Rechargezone userdic["rechargechannel"] = userlist[i].Rechargechannel userdic["rechargemoney"] = userlist[i].Rechargemoney userdic["rechargepeople"] = userlist[i].Rechargepeople userlists = append(userlists, userdic) } fmt.Println(userlist) fmt.Println(userlists) // 列标题 //titles := []string{ // "姓名","年龄","sex", //} //新的列标题 titles := []string{ "充值日期","充值时间","充值区服","充值渠道","实付金额","充值人数", } //数据源 //data := []map[string]interface{}{ // map[string]interface{}{"name":"jack","age":18,"sex":1}, // map[string]interface{}{"name":"mary","age":28,"sex":2}, //} //fmt.Println(data) f := excelize.NewFile() // Create a new sheet. index := f.NewSheet("Sheet1") for clumnNum,v := range titles { sheetPosition := Div(clumnNum+1)+"1" fmt.Print(sheetPosition) f.SetCellValue("Sheet1", sheetPosition,v) } for lineNum,dic := range userlists { clumnNum := 0 fmt.Println(lineNum,dic) for k,_ := range dic{ clumnNum++; Anewposition := "A" + strconv.Itoa(lineNum+2) Bnewposition := "B" + strconv.Itoa(lineNum+2) Cnewposition := "C" + strconv.Itoa(lineNum+2) Dnewposition := "D" + strconv.Itoa(lineNum+2) Enewposition := "E" + strconv.Itoa(lineNum+2) Fnewposition := "F" + strconv.Itoa(lineNum+2) switch k { case "rechargedate": fmt.Println("name的值是:",dic["name"]) f.SetCellValue("Sheet1", Anewposition,dic["rechargedate"]) break case "rechargetime": f.SetCellValue("Sheet1", Bnewposition,dic["rechargetime"]) break case "rechargezone": f.SetCellValue("Sheet1", Cnewposition,dic["rechargezone"]) break case "rechargechannel": f.SetCellValue("Sheet1", Dnewposition,dic["rechargechannel"]) break case "rechargemoney": f.SetCellValue("Sheet1", Enewposition,dic["rechargemoney"]) break case "rechargepeople": f.SetCellValue("Sheet1", Fnewposition,dic["rechargepeople"]) break } } } // Set active sheet of the workbook. f.SetActiveSheet(index) //生成图形 if err := f.AddChart("Sheet1", "M1", `{"type":"col3DClustered","series":[{"name":"Sheet1!$C$2","categories":"Sheet1!$B$2:$B$61","values":"Sheet1!$E$2:$E$61"},{"name":"Sheet1!$C$13","categories":"Sheet1!$B$2:$B$61","values":"Sheet1!$E$2:$E$61"},{"name":"Sheet1!$C$32","categories":"Sheet1!$B$2:$B$61","values":"Sheet1!$E$2:$E$61"}],"title":{"name":"Fruit 3D Clustered Column Chart"}}`); err != nil { fmt.Println(err) return } // Save xlsx file by the given path. if err := f.SaveAs("Book2.xlsx"); err != nil { println(err.Error()) } } // Div 数字转字母 func Div(Num int) string{ var( Str string = "" k int temp []int //保存转化后每一位数据的值,而后经过索引的方式匹配A-Z ) //用来匹配的字符A-Z Slice := []string{"","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O", "P","Q","R","S","T","U","V","W","X","Y","Z"} if Num >26 { //数据大于26须要进行拆分 for { k = Num % 26 //从个位开始拆分,若是求余为0,说明末尾为26,也就是Z,若是是转化为26进制数,则末尾是能够为0的,这里必须为A-Z中的一个 if k == 0 { temp = append(temp, 26) k = 26 } else { temp = append(temp, k) } Num = (Num - k) / 26 //减去Num最后一位数的值,由于已经记录在temp中 if Num <= 26{ //小于等于26直接进行匹配,不须要进行数据拆分 temp = append(temp, Num) break } } }else{ return Slice[Num] } for _,value := range temp{ Str = Slice[value] + Str //由于数据切分后存储顺序是反的,因此Str要放在后面 } return Str }