亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

目錄
1、實作目標
2、使用的函式庫
3、專案目錄
4、主要程式碼寫
4.1、excelize.go(主要工具類別)
4.2、userService.go(接受請求)
4.2、測試結果
首頁 資料庫 mysql教程 Go怎麼結合Gin導出Mysql資料到Excel表格

Go怎麼結合Gin導出Mysql資料到Excel表格

May 26, 2023 pm 09:15 PM
mysql go gin

    1、實作目標

    Golang 使用excelize 匯出表格到瀏覽器下載或儲存到本機。
    後續(xù)導入的話也會寫到這裡

    2、使用的函式庫

    go get github.com/xuri/excelize/v2

    3、專案目錄

    go-excel
    ├─ app
    │  ├─ excelize
    │  │  └─ excelize.go
    │  ├─ model
    │  │  └─ sysUser.go
    │  └─ service
    │     └─ userService.go
    ├─ common
    │  └─ mysql.go
    ├─ go.mod
    ├─ go.sum
    ├─ main.go
    └─ setting.json

    4、主要程式碼寫


    讀取設定檔是用的viper

    4.1、excelize.go(主要工具類別)

    ExportExcelByStruct 函數(shù)是從網(wǎng)路上直接copy的,研究他這個寫法花了好一會兒,所以也寫上去了,提供大家學習

    import (
    	"fmt"
    	"math/rand"
    	"net/url"
    	"reflect"
    	"strconv"
    	"time"
    
    	"github.com/gin-gonic/gin"
    	"github.com/xuri/excelize/v2"
    )
    
    var (
    	defaultSheetName = "Sheet1" //默認Sheet名稱
    	defaultHeight    = 25.0     //默認行高度
    )
    
    type lzExcelExport struct {
    	file      *excelize.File
    	sheetName string //可定義默認sheet名稱
    }
    
    func NewMyExcel() *lzExcelExport {
    	return &lzExcelExport{file: createFile(), sheetName: defaultSheetName}
    }
    
    //導出基本的表格
    func (l *lzExcelExport) ExportToPath(params []map[string]string, data []map[string]interface{}, path string) (string, error) {
    	l.export(params, data)
    	name := createFileName()
    	filePath := path + "/" + name
    	err := l.file.SaveAs(filePath)
    	return filePath, err
    }
    
    //導出到瀏覽器。此處使用的gin框架 其他框架可自行修改ctx
    func (l *lzExcelExport) ExportToWeb(params []map[string]string, data []map[string]interface{}, c *gin.Context) {
    	l.export(params, data)
    	buffer, _ := l.file.WriteToBuffer()
    	//設置文件類型
    	c.Header("Content-Type", "application/vnd.ms-excel;charset=utf8")
    	//設置文件名稱
    	c.Header("Content-Disposition", "attachment; filename="+url.QueryEscape(createFileName()))
    	_, _ = c.Writer.Write(buffer.Bytes())
    }
    
    //設置首行
    func (l *lzExcelExport) writeTop(params []map[string]string) {
    	topStyle, _ := l.file.NewStyle(`{"font":{"bold":true},"alignment":{"horizontal":"center","vertical":"center"}}`)
    	var word = 'A'
    	//首行寫入
    	for _, conf := range params {
    		title := conf["title"]
    		width, _ := strconv.ParseFloat(conf["width"], 64)
    		line := fmt.Sprintf("%c1", word)
    		//設置標題
    		_ = l.file.SetCellValue(l.sheetName, line, title)
    		//列寬
    		_ = l.file.SetColWidth(l.sheetName, fmt.Sprintf("%c", word), fmt.Sprintf("%c", word), width)
    		//設置樣式
    		_ = l.file.SetCellStyle(l.sheetName, line, line, topStyle)
    		word++
    	}
    }
    
    //寫入數(shù)據(jù)
    func (l *lzExcelExport) writeData(params []map[string]string, data []map[string]interface{}) {
    	lineStyle, _ := l.file.NewStyle(`{"alignment":{"horizontal":"center","vertical":"center"}}`)
    	//數(shù)據(jù)寫入
    	var j = 2 //數(shù)據(jù)開始行數(shù)
    	for i, val := range data {
    		//設置行高
    		_ = l.file.SetRowHeight(l.sheetName, i+1, defaultHeight)
    		//逐列寫入
    		var word = 'A'
    		for _, conf := range params {
    			valKey := conf["key"]
    			line := fmt.Sprintf("%c%v", word, j)
    			isNum := conf["is_num"]
    
    			//設置值
    			if isNum != "0" {
    				valNum := fmt.Sprintf("'%v", val[valKey])
    				_ = l.file.SetCellValue(l.sheetName, line, valNum)
    			} else {
    				_ = l.file.SetCellValue(l.sheetName, line, val[valKey])
    			}
    
    			//設置樣式
    			_ = l.file.SetCellStyle(l.sheetName, line, line, lineStyle)
    			word++
    		}
    		j++
    	}
    	//設置行高 尾行
    	_ = l.file.SetRowHeight(l.sheetName, len(data)+1, defaultHeight)
    }
    
    func (l *lzExcelExport) export(params []map[string]string, data []map[string]interface{}) {
    	l.writeTop(params)
    	l.writeData(params, data)
    }
    
    func createFile() *excelize.File {
    	f := excelize.NewFile()
    	// 創(chuàng)建一個默認工作表
    	sheetName := defaultSheetName
    	index := f.NewSheet(sheetName)
    	// 設置工作簿的默認工作表
    	f.SetActiveSheet(index)
    	return f
    }
    
    func createFileName() string {
    	name := time.Now().Format("2006-01-02-15-04-05")
    	rand.Seed(time.Now().UnixNano())
    	return fmt.Sprintf("excle-%v-%v.xlsx", name, rand.Int63n(time.Now().Unix()))
    }
    
    //excel導出(數(shù)據(jù)源為Struct) []interface{}
    func (l *lzExcelExport) ExportExcelByStruct(titleList []string, data []interface{}, fileName string, sheetName string, c *gin.Context) error {
    	l.file.SetSheetName("Sheet1", sheetName)
    	header := make([]string, 0)
    	for _, v := range titleList {
    		header = append(header, v)
    	}
    	rowStyleID, _ := l.file.NewStyle(`{"font":{"color":"#666666","size":13,"family":"arial"},"alignment":{"vertical":"center","horizontal":"center"}}`)
    	_ = l.file.SetSheetRow(sheetName, "A1", &header)
    	_ = l.file.SetRowHeight("Sheet1", 1, 30)
    	length := len(titleList)
    	headStyle := Letter(length)
    	var lastRow string
    	var widthRow string
    	for k, v := range headStyle {
    
    		if k == length-1 {
    
    			lastRow = fmt.Sprintf("%s1", v)
    			widthRow = v
    		}
    	}
    	if err := l.file.SetColWidth(sheetName, "A", widthRow, 30); err != nil {
    		fmt.Print("錯誤--", err.Error())
    	}
    	rowNum := 1
    	for _, v := range data {
    
    		t := reflect.TypeOf(v)
    		fmt.Print("--ttt--", t.NumField())
    		value := reflect.ValueOf(v)
    		row := make([]interface {
    		}, 0)
    		for l := 0; l < t.NumField(); l++ {
    
    			val := value.Field(l).Interface()
    			row = append(row, val)
    		}
    		rowNum++
    		err := l.file.SetSheetRow(sheetName, "A"+strconv.Itoa(rowNum), &row)
    		_ = l.file.SetCellStyle(sheetName, fmt.Sprintf("A%d", rowNum), fmt.Sprintf("%s", lastRow), rowStyleID)
    		if err != nil {
    			return err
    		}
    	}
    	disposition := fmt.Sprintf("attachment; filename=%s.xlsx", url.QueryEscape(fileName))
    	c.Writer.Header().Set("Content-Type", "application/octet-stream")
    	c.Writer.Header().Set("Content-Disposition", disposition)
    	c.Writer.Header().Set("Content-Transfer-Encoding", "binary")
    	c.Writer.Header().Set("Access-Control-Expose-Headers", "Content-Disposition")
    	return l.file.Write(c.Writer)
    }
    
    // Letter 遍歷a-z
    func Letter(length int) []string {
    	var str []string
    	for i := 0; i < length; i++ {
    		str = append(str, string(rune(&#39;A&#39;+i)))
    	}
    	return str
    }

    4.2、userService.go(接受請求)

    其中導出的函數(shù)都已經(jīng)測試是ok的,可以直接用,資料改成自己的就好,
    注意的事項裡面我也寫了,避雷! !

    import (
    	"go-excel/app/excelize"
    	"go-excel/app/model"
    	config "go-excel/common"
    	"github.com/gin-gonic/gin"
    )
    
    
    
    //獲取所有用戶數(shù)據(jù)-excel
    func GetAllUserExportToWeb(ctx *gin.Context) {
    	var users []model.TUser
    	db := config.GetDB()
    	db.Find(&users)
    
    	//定義首行標題
    	dataKey := make([]map[string]string, 0)
    	dataKey = append(dataKey, map[string]string{
    		"key":    "id",
    		"title":  "索引",
    		"width":  "20",
    		"is_num": "0",
    	})
    	dataKey = append(dataKey, map[string]string{
    		"key":    "username",
    		"title":  "用戶名",
    		"width":  "20",
    		"is_num": "0",
    	})
    	dataKey = append(dataKey, map[string]string{
    		"key":    "remark",
    		"title":  "備注",
    		"width":  "20",
    		"is_num": "0",
    	})
    
    	//填充數(shù)據(jù)
    	data := make([]map[string]interface{}, 0)
    	if len(users) > 0 {
    		for _, v := range users {
    			data = append(data, map[string]interface{}{
    				"id":       v.ID,
    				"username": v.Username,
    				"remark":   v.Remark,
    			})
    		}
    	}
    	ex := excelize.NewMyExcel()
      
    	// ex.ExportToWeb(dataKey, data, ctx)
    
    	//保存到D盤
    	ex.ExportToPath(dataKey, data, "D:/")
    }
    
    //excel 導出
    func GetUserExcelByMap(ctx *gin.Context) {
    	var users []model.TUser
    	db := config.GetDB()
    	db.Find(&users)
    
    	titles := []string{"ID", "用戶名", "備注"}
    
    	ex := excelize.NewMyExcel()
    
    	var datas []interface{}
    	for _, v := range users {
    		//這里最好新建一個struct 和titles一致,不然users里面的多余的字段也會寫進去
    		datas = append(datas, model.TUser{
    			ID:       v.ID,
    			Username: v.Username,
    			Remark:   v.Remark,
    		})
    	}
    	ex.ExportExcelByStruct(titles, datas, "用戶數(shù)據(jù)", "用戶", ctx)
    }

    4.2、測試結果

    GetAllUserExportToWeb

    Go怎麼結合Gin導出Mysql資料到Excel表格

    GetUserExcelByMap

    Go怎麼結合Gin導出Mysql資料到Excel表格

    ##

    以上是Go怎麼結合Gin導出Mysql資料到Excel表格的詳細內容。更多資訊請關注PHP中文網(wǎng)其他相關文章!

    本網(wǎng)站聲明
    本文內容由網(wǎng)友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發(fā)現(xiàn)涉嫌抄襲或侵權的內容,請聯(lián)絡admin@php.cn

    熱AI工具

    Undress AI Tool

    Undress AI Tool

    免費脫衣圖片

    Undresser.AI Undress

    Undresser.AI Undress

    人工智慧驅動的應用程序,用於創(chuàng)建逼真的裸體照片

    AI Clothes Remover

    AI Clothes Remover

    用於從照片中去除衣服的線上人工智慧工具。

    Clothoff.io

    Clothoff.io

    AI脫衣器

    Video Face Swap

    Video Face Swap

    使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

    熱工具

    記事本++7.3.1

    記事本++7.3.1

    好用且免費的程式碼編輯器

    SublimeText3漢化版

    SublimeText3漢化版

    中文版,非常好用

    禪工作室 13.0.1

    禪工作室 13.0.1

    強大的PHP整合開發(fā)環(huán)境

    Dreamweaver CS6

    Dreamweaver CS6

    視覺化網(wǎng)頁開發(fā)工具

    SublimeText3 Mac版

    SublimeText3 Mac版

    神級程式碼編輯軟體(SublimeText3)

    熱門話題

    Laravel 教程
    1597
    29
    PHP教程
    1488
    72
    您如何在Go中逐行讀取文件? 您如何在Go中逐行讀取文件? Aug 02, 2025 am 05:17 AM

    使用bufio.Scanner是Go中逐行讀取文件最常見且高效的方法,適用於處理大文件、日誌解析或配置文件等場景。 1.使用os.Open打開文件並確保通過deferfile.Close()關閉文件。 2.通過bufio.NewScanner創(chuàng)建掃描器實例。 3.在for循環(huán)中調用scanner.Scan()逐行讀取,直到返回false表示到達文件末尾或出錯。 4.使用scanner.Text()獲取當前行內容(不含換行符)。 5.循環(huán)結束後檢查scanner.Err()以捕獲可能的讀取錯誤。此方法內存效

    您如何處理GO Web應用程序中的路由? 您如何處理GO Web應用程序中的路由? Aug 02, 2025 am 06:49 AM

    Go應用中的路由選擇取決於項目複雜度,1.使用標準庫net/httpServeMux適合簡單應用,無需外部依賴且輕量,但不支持URL參數(shù)和高級匹配;2.第三方路由器如Chi提供中間件、路徑參數(shù)和嵌套路由,適合模塊化設計;3.Gin性能優(yōu)異,內置JSON處理和豐富功能,適合API和微服務。應根據(jù)是否需要靈活性、性能或功能集成來選擇,小型項目用標準庫,中大型項目推薦Chi或Gin,最終實現(xiàn)從簡單到復雜的平滑擴展。

    GO應用程序的標準項目佈局是什麼? GO應用程序的標準項目佈局是什麼? Aug 02, 2025 pm 02:31 PM

    答案是:Go應用沒有強制項目佈局,但社區(qū)普遍採用一種標準結構以提升可維護性和擴展性。 1.cmd/存放程序入口,每個子目錄對應一個可執(zhí)行文件,如cmd/myapp/main.go;2.internal/存放私有代碼,不可被外部模塊導入,用於封裝業(yè)務邏輯和服務;3.pkg/存放可公開復用的庫,供其他項目導入;4.api/可選,存放OpenAPI、Protobuf等API定義文件;5.config/、scripts/、web/分別存放配置文件、腳本和Web資源;6.根目錄包含go.mod和go.sum

    GO中的構建約束是什麼? GO中的構建約束是什麼? Jul 31, 2025 am 02:53 AM

    BuildconstraintsinGoarecommentslike//go:buildthatcontrolfileinclusionduringcompilationbasedonconditionssuchasOS,architecture,orcustomtags.2.TheyareplacedbeforethepackagedeclarationwithablanklineinbetweenandsupportBooleanoperatorslike&&,||,and

    故障排除MySQL連接字符串和驅動程序問題 故障排除MySQL連接字符串和驅動程序問題 Jul 31, 2025 am 09:30 AM

    連接不上MySQL數(shù)據(jù)庫時,應先檢查連接字符串格式和驅動版本。 1.檢查連接字符串格式是否正確,常見錯誤包括端口號、數(shù)據(jù)庫名、參數(shù)符號錯誤及驅動前綴錯誤,建議使用生成工具驗證格式並註意轉義特殊字符;2.確保使用正確的JDBC或數(shù)據(jù)庫驅動,不同語言使用不同驅動,需注意版本兼容性、依賴配置及驅動類名變化,查看日誌確認驅動是否加載成功;3.檢查遠程訪問權限和防火牆設置,包括MySQL用戶權限、bind-address配置及服務器防火牆規(guī)則,需開放3306端口和遠程訪問權限;4.使用簡單測試程序快速驗證連

    您如何與JSON合作? 您如何與JSON合作? Jul 31, 2025 am 08:12 AM

    Go提供了encoding/json包來輕鬆處理JSON數(shù)據(jù)。 1.使用json.Marshal將Go結構體或映射編碼為JSON,結構體字段需以大寫字母開頭並可通過json:"name"標籤指定鍵名,omitempty可使零值字段被省略;2.使用json.Unmarshal將JSON數(shù)據(jù)解碼到Go變量中,需傳入變量指針以便修改值;3.對於結構未知的JSON,可解碼到map[string]interface{}或interface{}中,但訪問時需使用類型斷言;4.處理大型JSO

    實施MySQL數(shù)據(jù)譜系跟蹤 實施MySQL數(shù)據(jù)譜系跟蹤 Aug 02, 2025 pm 12:37 PM

    實現(xiàn)MySQL數(shù)據(jù)血緣追蹤的核心方法包括:1.利用Binlog記錄數(shù)據(jù)變更來源,開啟並解析binlog,結合應用層上下文追溯具體業(yè)務動作;2.在ETL流程中註入血緣標籤,通過工具同步時記錄源與目標的映射關係;3.給數(shù)據(jù)加註釋和元數(shù)據(jù)標籤,在建表時說明字段來源,並接入元數(shù)據(jù)管理系統(tǒng)形成可視化圖譜;4.注意主鍵一致性、避免過度依賴SQL解析、版本控制數(shù)據(jù)模型變化及定期校驗血緣數(shù)據(jù),確保血緣追蹤準確可靠。

    故障排除MySQL磁盤空間問題和清理 故障排除MySQL磁盤空間問題和清理 Jul 31, 2025 am 03:13 AM

    當MySQL數(shù)據(jù)庫出現(xiàn)磁盤空間不足時,可按以下步驟排查和清理:1.使用df-h和du-sh/var/lib/mysql/*檢查磁盤及MySQL文件佔用情況;2.清理二進制日誌,通過PURGEBINARYLOGS按時間或文件名刪除舊日誌,或在my.cnf設置expire_logs_days自動清理;3.刪除不再使用的數(shù)據(jù)庫或表,執(zhí)行DROPDATABASE或DROPTABLE前確認無用並做好備份;4.使用OPTIMIZETABLE回收InnoDB表空間碎片,注意需預留足夠空間執(zhí)行;5.部署監(jiān)控工具

    See all articles