当前位置: 首页 > 后端技术 > PHP

GolangGin实践连载十四实现Excel导出导入

时间:2023-03-30 02:15:33 PHP

鍘熸枃鍦板潃锛欸in瀹炶返杩炶浇14瀹炵幇瀵煎嚭瀵煎叆Excel椤圭洰鍦板潃锛歨ttps://github.com/EDDYCJY/go...濡傛灉瀵逛綘鏈夊府鍔╋紝娆㈣繋鐐逛釜鏄燄煈嶅墠瑷€鏈妭鎴戜滑灏嗗疄鐜版爣绛句俊鎭殑瀵煎嚭瀵煎叆鍔熻兘涓烘爣閰嶅姛鑳姐€傚笇鏈涗綘鑳芥帉鎻″熀鏈殑鐢ㄦ硶銆傛澶栵紝鍦ㄦ湰鏂囦腑锛屾垜浠娇鐢ㄤ簡涓や釜Excel鍖呫€俥xcelize鏈€鍒濈殑XML鏍煎紡鏂囦欢鐨勪竴浜涚粨鏋勬槸閫氳繃tealeg/xlsx鏍煎紡鏂囦欢鐨勭粨鏋勬紨鍖栬€屾潵鐨勶紝鎵€浠ョ壒鍦板湪杩欓噷灞曠ず銆傚ぇ瀹跺彲浠ユ牴鎹嚜宸辩殑鍦烘櫙鍜屽枩濂芥潵浣跨敤閰嶇疆銆傞鍏堟寚瀹氬鍑虹殑Excel鏂囦欢鐨勫瓨鏀捐矾寰勶紝鍦╝pp.ini涓坊鍔犻厤缃細[app]...ExportSavePath=export/Modifysetting.go鐨凙ppstruct:typeAppstruct{JwtSecretstringPageSizeintPrefixUrlstringRuntimeRootPathstringImageSavePathstringImageMaxSizeintImageAllowExts[]stringExportSavePathstringLogSavePathstringLogSaveNamestringLogTimematFortStringstring}杩欓噷闇€瑕佹坊鍔燛xportSavePath閰嶇疆椤癸紝鍙﹀锛屽皢涔嬪墠鐨処magePrefixUrl鏀逛负PrefixUrl锛屼互鏀寔涓よ€呯殑HOST鑾峰彇锛堟敞鎰廏etImageFullUrl鏂规硶image.go鐨勮淇敼锛塸kg鏂板缓涓€涓猵kg/export/excel.go鏂囦欢锛屽涓嬶細杩斿洖setting.AppSetting.PrefixUrl+"/"+GetExcelPath()+name}funcGetExcelPath()string{returnsetting.AppSetting.ExportSavePath}funcGetExcelFullPath()string{returnsetting.AppSetting.RuntimeRootPath+GetExcelPath()}杩欓噷鍐欎簡涓€浜涘父鐢ㄧ殑鏂规硶銆傚唴閮ㄤ唬鐮佹病闂锛屽鐣屾槸鐪嬩笉鍒扮殑銆傝瘯璇曟爣鍑嗗簱f,err:=os.Create(export.GetExcelFullPath()+"test.csv")iferr!=nil{panic(err)}deferf.Close()f.WriteString("\xEF\xBB\xBF")w:=csv.NewWriter(f)data:=[][]string{{"1","test1","test1-1"},{"2","test2","test2-1"},{"3","test3","test3-1"},}w.WriteAll(data)鍦℅o鎻愪緵鐨勬爣鍑嗗簱encoding/csv涓嚜鐒舵敮鎸乧sv鏂囦欢鐨勮鍙栧拰澶勭悊锛屽湪杩欐浠g爜涓紝鍋氫簡濡備笅宸ヤ綔锛?.os.Create锛氬垱寤轰簡涓€涓猼est.csv鏂囦欢2.f.WriteString("xEFxBBxBF"):\xEF\xBB\xBF鏄娇鐢║TF-8BOM鐨勫崄鍏繘鍒舵牸寮忚繖閲岀敤鏉ユ爣璇嗘枃浠剁殑缂栫爜鏍煎紡锛屼竴鑸嚭鐜板湪鏂囦欢鐨勫紑澶达紝鎵€浠ョ涓€姝ュ氨鏄啓鍏ャ€傚鏋滀笉璇嗗埆UTF-8鐨勭紪鐮佹牸寮忥紝鍐欏叆鐨勬眽瀛椾細鏄剧ず涓轰贡鐮?.csv.NewWriter:funcNewWriter(wio.Writer)*Writer{return&Writer{Comma:',',w:bufio.NewWriter(w),}}4,w.WriteAll:func(w*Writer)WriteAll(records[][]string)error{for_,record:=range璁板綍{err:=w.Write(record)iferr!=nil{returnerr}}returnw.w.Flush()}WriteAll鍏跺疄鏄Write鐨勫皝瑁呫€傞渶瑕佹敞鎰忕殑鏄渶鍚庤皟鐢ㄤ簡w.w.Flush()锛屽厖鍒嗚鏄庝簡WriteAll鐨勪娇鐢ㄥ満鏅紝鍙互鎯虫兂浣滆€呭鍑篠ervice鏂规硶鐨勮璁℃剰鍥俱€傛墦寮€service/tag.go锛屾坊鍔燛xport鏂规硶锛屽涓嬶細func(t*Tag)Export()(string,error){tags,err:=t.GetAll()iferr!=nil{return"",err}file:=xlsx.NewFile()sheet,err:=file.AddSheet("LabelInformation")iferr!=nil{return"",err}鏍囬:=[]string{"ID","Name","Creator","CreatedTime","ModifiedBy","ModifiedTime"}row:=sheet.AddRow()varcell*xlsx.Cellfor_,title:=rangetitles{cell=row.AddCell()cell.Value=title}for_,v:=rangetags{values:=[]string{strconv.Itoa(v.ID),v.Name,v.CreatedBy,strconv.Itoa(v.CreatedOn),v.ModifiedBy,strconv.Itoa(v.ModifiedOn),}row=sheet.AddRow()for_,鍊?=鑼冨洿鍊納cell=row.AddCell()cell.Value=value}}time:=strconv.Itoa(int(time.Now().Unix()))filename:="tags-"+time+".xlsx"fullPath:=export.GetExcelFullPath()+filenameerr=file.Save(fullPath)iferr!=nil{return"",err}returnfilename,nil}routers鍏ュ彛鎵撳紑routers/api/v1/tag.go锛屽鍔犲涓嬫柟娉曪細funcExportTag(c*gin.Context){appG:=app.Gin{C:c}name:=c.PostForm("name")state:=-1ifarg:=c.PostForm("state");arg!=""{state=com.StrTo(arg).MustInt()}tagService:=tag_service.Tag{Name:name,State:state,}filename,err:=tagService.Export()iferr!=nil{appG.Response(http.StatusOK,e.ERROR_EXPORT_TAG_FAIL,nil)return}appG.Response(http.StatusOK,e.SUCCESS,map[string]string{鈥渆xport_url鈥?export.GetExcelFullUrl(filename),鈥渆xport_save_url鈥?瀵煎嚭.GetExcelPath()+filename,})}璺敱鍦╮outers/router.go鏂囦欢涓坊鍔犺矾鐢辨柟娉曪紝濡備笅apiv1:=r.Group("/api/v1")apiv1.Use(jwt.JWT()){...//瀵煎嚭鏍囩r.POST("/tags/export",v1.ExportTag)}楠岃瘉鎺ュ彛璁块棶http://127.0.0.1:8000/tags/export锛岀粨鏋滃涓嬶細{"code":200,鈥滄暟鎹€濓細{鈥渆xport_save_url鈥濓細鈥渆xport/tags-1528903393.xlsx鈥濓紝鈥渆xport_url鈥濓細鈥渉ttp://127.0.0.1:8000/export/tags-1528903393.xlsx鈥潁锛屸€渕sg鈥濓細鈥滃ソ鐨?}鏈€鍚庨€氳繃鎺ュ彛杩斿洖瀵煎嚭鏂囦欢鐨勫湴鍧€鍜孲taticFS鐨勫瓨鍌ㄥ湴鍧€銆傛兂涓€鎯筹紝鐩存帴璁块棶鍦板潃鑲畾鏄笉鍙兘涓嬭浇鏂囦欢鐨勶紝閭f€庝箞鍔炲憿锛熸墦寮€router.go鏂囦欢锛屾坊鍔犲涓嬩唬鐮侊細r.StaticFS("/export",http.Dir(export.GetExcelFullPath()))涓嶆槑鐧界殑寮虹儓寤鸿澶嶄範鍓嶉潰鐨勭珷鑺傚拰浠ユ绫绘帹楠岃瘉涓嬭浇銆傚啀娆¤闂笂闈㈢殑export_url锛屽锛歨ttp://127.0.0.1:8000/export/tags-1528903393.xlsx锛屾槸鍚︽垚鍔燂紵瀵煎叆鏈嶅姟鏂规硶鎵撳紑service/tag.go锛屾坊鍔犲鍏ユ柟娉曪紝濡備笅锛歠unc(t*Tag)Import(rio.Reader)error{xlsx,err:=excelize.OpenReader(r)iferr!=nil{returnerr}rows:=xlsx.GetRows("鏍囩淇℃伅")forirow,row:=rangerows{ifirow>0{vardata[]stringfor_,cell:=rangerow{data=append(data,cell)}models.AddTag(data[1],1,data[2])}}returnnil}routers鍏ュ彛鎵撳紑routers/api/v1/tag.go锛屾坊鍔犲涓嬫柟娉曪細funcImportTag(c*gin.Context){appG:=app.Gin{C:c}file,_,err:=c.Request.FormFile("file")iferr!=nil{logging.Warn(err)appG.鍝嶅簲(http.StatusOK,e.ERROR,nil)return}tagService:=tag_service.Tag{}err=tagService.Import(file)iferr!=nil{logging.Warn(err)appG.Response(http.StatusOK,e.ERROR_IMPORT_TAG_FAIL,nil)return}appG.Response(http.StatusOK,e.SUCCESS,nil)}璺敱鍦╮outers/router.go鏂囦欢涓坊鍔犺矾鐢辨柟娉曪紝濡備笅apiv1:=r.Group("/api/v1")apiv1.Use(jwt.JWT()){...//瀵煎叆鏍囩r.POST("/tags/import",v1.ImportTag)}楠岃瘉杩欓噷鎴戜滑浣跨敤涔嬪墠瀵煎嚭鐨凟xcel鏂囦欢浣滀负鍏ュ弬锛岃闂甴ttp://127.0.0.01:8000/tags/import锛屾鏌ヨ繑鍥炲€煎拰鏁版嵁鏄惁瀛樺偍姝g‘銆傚皬缁撴湰鏂囩畝鍗曚粙缁嶄簡Excel瀵煎叆瀵煎嚭鐨勪娇鐢紝浣跨敤浜嗕互涓嬩袱涓寘锛歵ealeg/xlsx360EntSecGroup-Skylar/excelize锛屽ぇ瀹跺彲浠ヤ粩缁嗛槄璇诲叾瀹炵幇鍜屼娇鐢ㄦ柟娉曪紝瀵逛互鍚庣殑瀛︿範浼氭洿鏈夊府鍔╀綘鏉ユ帶鍒跺府鍔煠旇澶杢ag:exportusingexcelize瀹炵幇锛堜篃璁镐綘浼氳寰楁洿绠€鍗曪級tag:瀵煎叆鍜屽幓閲嶅姛鑳藉疄鐜癮rtice:瀵煎叆瀵煎嚭鍔熻兘鐨勫疄鐜颁篃鏄綘缁冩墜鏈虹殑濂芥満浼氥€傛湁鍏磋叮鐨勫彲浠ュ弬鑰冩湰绯诲垪绀轰緥浠g爜go-gin-example鏈郴鍒楃洰褰曡繛杞?Golang浠嬬粛鍙婄幆澧冨畨瑁呰繛杞?BuildBlogAPI's(1)杩炶浇3BuildBlogAPI's(2)杩炶浇4Build鍗氬API鐨勶紙涓夛級杩炶浇5浣跨敤JWT杩涜韬唤楠岃瘉杩炶浇6鍐欎竴涓畝鍗曠殑鏂囦欢鏃ュ織杩炶浇7Golang浼橀泤閲嶅惎HTTP鏈嶅姟杩炶浇8涓哄叾娣诲姞Swagger杩炶浇9灏咷olang搴旂敤閮ㄧ讲鍒癉ocker杩炶浇10鑷畾涔塆ORMCallbacks鍥剧墖涓婁紶鐨勭粨鏋勫拰瀹炵幇杩炶浇13.搴旂敤缁撴瀯浼樺寲锛屽疄鐜癛edis缂撳瓨杩炶浇14.瀹炵幇瀵煎嚭瀵煎叆Excel杩炶浇15.浜岀淮鐮佺敓鎴愪笌娴锋姤鍚堝苟杩炶浇16.鍥剧墖缁樺埗鏂囧瓧杩炶浇17.閮ㄧ讲Go涓嶯ginxGolang浜ゅ弶缂栬瘧浣跨敤鐣锛岃寮€濮嬩娇鐢∕akefile