package main import ( "fmt" "github.com/spf13/viper" "github.com/wcc4869/common_utils" "github.com/xuri/excelize/v2" "go.uber.org/zap" "jygit.jydev.jianyu360.cn/data_processing/common_utils/log" "jygit.jydev.jianyu360.cn/data_processing/common_utils/mongodb" "os" "path/filepath" "strconv" "sync" "time" ) var ( MgoS *mongodb.MongodbSim GF GlobalConf ) func Init() { InitLog() err := InitConfig() if err != nil { } MgoS = &mongodb.MongodbSim{ MongodbAddr: GF.MongoS.Host, DbName: GF.MongoS.DB, Size: GF.MongoS.Size, UserName: GF.MongoS.Username, Password: GF.MongoS.Password, } MgoS.InitPool() } func InitConfig() (err error) { viper.SetConfigFile("config.toml") // 指定配置文件路径 viper.SetConfigName("config") // 配置文件名称(无扩展名) viper.SetConfigType("toml") // 如果配置文件的名称中没有扩展名,则需要配置此项 viper.AddConfigPath("./") viper.AddConfigPath("./conf/") // 还可以在工作目录中查找配置 viper.AddConfigPath("../conf/") // 还可以在工作目录中查找配置 err = viper.ReadInConfig() // 查找并读取配置文件 if err != nil { // 处理读取配置文件的错误 return } err = viper.Unmarshal(&GF) return err } func InitLog() { err := log.InitLog( //log.Path("./logs/log.out"), log.Path(""), log.Level("info"), log.Compress(true), log.MaxSize(10), log.MaxBackups(10), log.MaxAge(7), log.Format("json"), ) if err != nil { fmt.Printf("InitLog failed: %v\n", err) os.Exit(1) } } func main() { Init() export() } func export() { var xlsx *excelize.File currentPwd, _ := os.Getwd() path := filepath.Join(currentPwd, "导出数据") ex, _ := common_utils.FileExist(path) if !ex { os.MkdirAll(path, 0777) } exportFile := filepath.Join(path, fmt.Sprintf("%v-%v.xlsx", "惠普数据", time.Now().Format("2006.01.02 15.04.05"))) exists, _ := common_utils.FileExist(exportFile) // 设置文件 if exists { xlsx, _ = excelize.OpenFile(exportFile) } else { xlsx = excelize.NewFile() } styleOne, _ := xlsx.NewStyle( &excelize.Style{ Alignment: &excelize.Alignment{ Horizontal: "left", Vertical: "left", }, }, ) if GF.Env.Buyer > 0 { xlsx.NewSheet("采购单位") xlsx.SetSheetRow("采购单位", fmt.Sprintf("%s%d", "A", 1), &[]interface{}{"采购单位", "联系人", "联系电话", "发布时间"}) } if GF.Env.Winner > 0 { xlsx.NewSheet("中标单位") xlsx.SetSheetRow("中标单位", fmt.Sprintf("%s%d", "A", 1), &[]interface{}{"中标单位", "联系人", "联系电话", "发布时间"}) } if GF.Env.Agency > 0 { xlsx.NewSheet("代理机关") xlsx.SetSheetRow("代理机关", fmt.Sprintf("%s%d", "A", 1), &[]interface{}{"代理机关", "联系人", "联系电话", "发布时间"}) } sess := MgoS.GetMgoConn() defer MgoS.DestoryMongoConn(sess) count := 0 line := 1 winnerLine := 1 agencyLine := 1 ch := make(chan bool, 18) wg := &sync.WaitGroup{} query := sess.DB(MgoS.DbName).C(GF.MongoS.Coll).Find(nil).Select(nil).Iter() for tmp := make(map[string]interface{}); query.Next(tmp); count++ { if count%100 == 0 { fmt.Println(fmt.Sprintf("dealTmp current --- %d", count)) } var winner interface{} if tmp["company_name"] != nil { winner = tmp["company_name"] } //1.采购单位数据 if GF.Env.Buyer > 0 { if tmp["buyer_contacts"] != nil { if contacts, ok := tmp["buyer_contacts"].([]interface{}); ok { log.Info("export", zap.Any("开始导采购单位", winner)) for _, v := range contacts { line++ ch <- true wg.Add(1) go writeToExcel(xlsx, "采购单位", winner, line, v, styleOne, wg, ch) //if data, ok := v.(map[string]interface{}); ok { // datas := make([]interface{}, 0) // datas = append(datas, winner, data["contact_person"], data["phone"], data["publishtime"]) // xlsx.SetSheetRow("采购单位", fmt.Sprintf("%s%d", "A", line), &datas) // _ = xlsx.SetCellStyle("采购单位", fmt.Sprintf("%s%d", "A", line), "H"+strconv.Itoa(line), styleOne) // _ = xlsx.SetColWidth("采购单位", "A", "E", 25) //} } log.Info("export", zap.String("结束 ---", "采购单位数据导出")) } } } //2.中标单位 if GF.Env.Winner > 0 { if tmp["winner_contacts"] != nil { if contacts, ok := tmp["winner_contacts"].([]interface{}); ok { log.Info("export", zap.Any("开始导出中标单位", winner)) for _, v := range contacts { winnerLine++ ch <- true wg.Add(1) go writeToExcel(xlsx, "中标单位", winner, winnerLine, v, styleOne, wg, ch) //if data, ok := v.(map[string]interface{}); ok { // datas := make([]interface{}, 0) // datas = append(datas, winner, data["contact_person"], data["phone"], data["publishtime"]) // xlsx.SetSheetRow("中标单位", fmt.Sprintf("%s%d", "A", line), &datas) // _ = xlsx.SetCellStyle("中标单位", fmt.Sprintf("%s%d", "A", line), "H"+strconv.Itoa(line), styleOne) // _ = xlsx.SetColWidth("中标单位", "A", "E", 25) //} } log.Info("export", zap.String("结束 ---", "中标单位数据导出")) } } } //3.代理机关 if GF.Env.Agency > 0 { if tmp["agency_contacts"] != nil { if contacts, ok := tmp["agency_contacts"].([]interface{}); ok { log.Info("export", zap.Any("开始导出代理机关", winner)) for _, v := range contacts { agencyLine++ ch <- true wg.Add(1) writeToExcel(xlsx, "代理机关", winner, agencyLine, v, styleOne, wg, ch) //if data, ok := v.(map[string]interface{}); ok { // datas := make([]interface{}, 0) // datas = append(datas, winner, data["contact_person"], data["phone"], data["publishtime"]) // xlsx.SetSheetRow("代理机关", fmt.Sprintf("%s%d", "A", line), &datas) // _ = xlsx.SetCellStyle("代理机关", fmt.Sprintf("%s%d", "A", line), "H"+strconv.Itoa(line), styleOne) // _ = xlsx.SetColWidth("代理机关", "A", "E", 25) //} } log.Info("export", zap.String("结束 ---", "代理机关数据导出")) } } } } wg.Wait() xlsx.Path = exportFile xlsx.DeleteSheet("Sheet1") xlsx.Save() log.Info("export", zap.String("所有数据导出", "结束 !!!")) } // writeToExcel 写入Excel func writeToExcel(xlsx *excelize.File, sheetName string, winner interface{}, line int, data interface{}, style int, wg *sync.WaitGroup, ch chan bool) { defer func() { <-ch wg.Done() }() if dataMap, ok := data.(map[string]interface{}); ok { datas := make([]interface{}, 0) datas = append(datas, winner, dataMap["contact_person"], dataMap["phone"], dataMap["publishtime"]) xlsx.SetSheetRow(sheetName, fmt.Sprintf("%s%d", "A", line), &datas) _ = xlsx.SetCellStyle(sheetName, fmt.Sprintf("%s%d", "A", line), "H"+strconv.Itoa(line), style) _ = xlsx.SetColWidth(sheetName, "A", "E", 25) } }