基于Golang實現(xiàn)Excel表格的導入導出功能
更新時間:2023年12月12日 09:04:40 作者:敲代碼der
最近項目開發(fā)中有涉及到Excel的導入與導出功能,特別是導出表格時需要特定的格式,所以本文給大家介紹了基于Golang實現(xiàn)Excel表格的導入導出功能,文中通過代碼示例和圖文介紹的非常詳細,需要的朋友可以參考下
最近項目開發(fā)中有涉及到Excel的導入與導出功能,特別是導出表格時需要特定的格式(單元格合并等),廢話不多說,直接上代碼了。
首先用到一個第三方庫,實測還是很強大很好用的,就是這個https://github.com/qax-os/excelize
引用庫
go get github.com/xuri/excelize/v2
導入表格
package main import ( "encoding/json" "github.com/xuri/excelize/v2" "net/http" "strings" ) func fileImport(w http.ResponseWriter, r *http.Request) { // 獲取請求中的文件名 formFile, _, err := r.FormFile("filename") if err != nil { w.Write([]byte("獲取文件失敗, " + err.Error())) return } // 關閉 defer formFile.Close() // reader, err := excelize.OpenReader(formFile) if err != nil { w.Write([]byte("讀取文件失敗, " + err.Error())) return } // 關閉 defer reader.Close() rows, err := reader.GetRows("Sheet1") if err != nil { w.Write([]byte("獲取工作表失敗, " + err.Error())) return } ret := make([]string, 0, 8) for i, row := range rows { // 每一行數(shù)據的列, 都是從0開始的, 一般0行都是表頭 if i == 0 { continue } value1 := row[0] // 第一列 value2 := row[1] // 第二列 // 去除空格 value1 = strings.Trim(strings.TrimSpace(value1), "\n") value2 = strings.Trim(strings.TrimSpace(value2), "\n") // ret = append(ret, value1+","+value2) } bytes, _ := json.Marshal(ret) w.Write(bytes) return } func main() { // HTTP服務 http.HandleFunc("/fileImport", fileImport) err := http.ListenAndServe(":8192", nil) if err != nil { panic(err) } }
表格格式
執(zhí)行后效果
導出表格
package main import ( "encoding/json" "fmt" "github.com/xuri/excelize/v2" "net/http" "strings" ) func fileExport(w http.ResponseWriter, r *http.Request) { file := excelize.NewFile() defer file.Close() // 設置頁 sheetName := "Sheet1" // 創(chuàng)建 sheet, err := file.NewSheet(sheetName) if err != nil { w.Write([]byte("創(chuàng)建失敗, " + err.Error())) return } // 設置單元格格式 style := &excelize.Style{ Border: nil, Fill: excelize.Fill{}, Font: nil, Alignment: &excelize.Alignment{ Horizontal: "center", Indent: 0, JustifyLastLine: false, ReadingOrder: 0, RelativeIndent: 0, ShrinkToFit: false, TextRotation: 0, Vertical: "center", WrapText: false, }, Protection: nil, NumFmt: 0, DecimalPlaces: nil, CustomNumFmt: nil, NegRed: false, } styleID, _ := file.NewStyle(style) // 設置表頭 _ = file.SetCellValue(sheetName, "A1", "款") _ = file.SetCellStyle(sheetName, "A1", "A1", styleID) _ = file.SetCellValue(sheetName, "B1", "尺碼") _ = file.SetCellStyle(sheetName, "B1", "B1", styleID) // 設置值 for i := 0; i < 5; i++ { lineStr := fmt.Sprintf("%d", i+2) // _ = file.SetCellValue(sheetName, "A"+lineStr, "基礎款") _ = file.SetCellStyle(sheetName, "A"+lineStr, "A"+lineStr, styleID) // _ = file.SetCellValue(sheetName, "B"+lineStr, "1:2:3:4:5:6") _ = file.SetCellStyle(sheetName, "B"+lineStr, "B"+lineStr, styleID) } // file.SetActiveSheet(sheet) // buffer, err := file.WriteToBuffer() if err != nil { w.Write([]byte("導出失敗, " + err.Error())) return } w.Header().Set("Content-Disposition", fmt.Sprintf("attachment; filename=%s", "導出文件.xlsx")) w.Header().Set("Content-Type", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet") w.Write(buffer.Bytes()) } func main() { // HTTP服務 http.HandleFunc("/fileImport", fileImport) http.HandleFunc("/fileExport", fileExport) err := http.ListenAndServe(":8192", nil) if err != nil { panic(err) } }
頁面請求 http://127.0.0.1:8192/fileExport 后會直接生成xlsx文件并下載
合并單元格
package main import ( "encoding/json" "fmt" "github.com/xuri/excelize/v2" "net/http" "strings" ) func fileExport(w http.ResponseWriter, r *http.Request) { file := excelize.NewFile() defer file.Close() // 設置頁 sheetName := "Sheet1" // 創(chuàng)建 sheet, err := file.NewSheet(sheetName) if err != nil { w.Write([]byte("創(chuàng)建失敗, " + err.Error())) return } // 設置單元格格式 style := &excelize.Style{ Border: nil, // 邊框樣式 Fill: excelize.Fill{}, Font: nil, // 字體樣式 Alignment: &excelize.Alignment{ // 位置樣式 Horizontal: "center", Indent: 0, JustifyLastLine: false, ReadingOrder: 0, RelativeIndent: 0, ShrinkToFit: false, TextRotation: 0, Vertical: "center", WrapText: false, }, Protection: nil, NumFmt: 0, DecimalPlaces: nil, CustomNumFmt: nil, NegRed: false, } styleID, _ := file.NewStyle(style) // 設置表頭 _ = file.MergeCell(sheetName, "A1", "A2") // 合并單元格 _ = file.SetCellValue(sheetName, "A1", "款") _ = file.SetCellStyle(sheetName, "A1", "A2", styleID) _ = file.MergeCell(sheetName, "B1", "G1") // 合并單元格 _ = file.SetCellValue(sheetName, "B1", "尺碼") _ = file.SetCellStyle(sheetName, "B1", "G1", styleID) _ = file.SetCellValue(sheetName, "B2", "XS") _ = file.SetCellStyle(sheetName, "B2", "B2", styleID) _ = file.SetCellValue(sheetName, "C2", "S") _ = file.SetCellStyle(sheetName, "C2", "C2", styleID) _ = file.SetCellValue(sheetName, "D2", "M") _ = file.SetCellStyle(sheetName, "D2", "D2", styleID) _ = file.SetCellValue(sheetName, "E2", "L") _ = file.SetCellStyle(sheetName, "E2", "E2", styleID) _ = file.SetCellValue(sheetName, "F2", "XL") _ = file.SetCellStyle(sheetName, "F2", "F2", styleID) _ = file.SetCellValue(sheetName, "G2", "XLL") _ = file.SetCellStyle(sheetName, "G2", "G2", styleID) // 設置值 for i := 0; i < 5; i++ { lineStr := fmt.Sprintf("%d", i+3) // _ = file.SetCellValue(sheetName, "A"+lineStr, "基礎款") _ = file.SetCellStyle(sheetName, "A"+lineStr, "A"+lineStr, styleID) // split := strings.Split("1:2:3:4:5:6", ":") _ = file.SetCellValue(sheetName, "B"+lineStr, split[0]) _ = file.SetCellStyle(sheetName, "B"+lineStr, "B"+lineStr, styleID) _ = file.SetCellValue(sheetName, "C"+lineStr, split[1]) _ = file.SetCellStyle(sheetName, "C"+lineStr, "C"+lineStr, styleID) _ = file.SetCellValue(sheetName, "D"+lineStr, split[2]) _ = file.SetCellStyle(sheetName, "D"+lineStr, "D"+lineStr, styleID) _ = file.SetCellValue(sheetName, "E"+lineStr, split[3]) _ = file.SetCellStyle(sheetName, "E"+lineStr, "E"+lineStr, styleID) _ = file.SetCellValue(sheetName, "F"+lineStr, split[4]) _ = file.SetCellStyle(sheetName, "F"+lineStr, "F"+lineStr, styleID) _ = file.SetCellValue(sheetName, "G"+lineStr, split[5]) _ = file.SetCellStyle(sheetName, "G"+lineStr, "G"+lineStr, styleID) } // file.SetActiveSheet(sheet) // buffer, err := file.WriteToBuffer() if err != nil { w.Write([]byte("導出失敗, " + err.Error())) return } // 設置文件名 w.Header().Set("Content-Disposition", fmt.Sprintf("attachment; filename=%s", "導出文件.xlsx")) // 導出的文件格式 xlsx 或者 xsl // xlsx application/vnd.openxmlformats-officedocument.spreadsheetml.sheet // xls application/vnd.ms-excel w.Header().Set("Content-Type", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet") w.Write(buffer.Bytes()) } func main() { // HTTP服務 http.HandleFunc("/fileImport", fileImport) http.HandleFunc("/fileExport", fileExport) err := http.ListenAndServe(":8192", nil) if err != nil { panic(err) } }
頁面請求 http://127.0.0.1:8192/fileExport 后會直接生成xlsx文件并下載
以上就是基于Golang實現(xiàn)Excel表格的導入導出功能的詳細內容,更多關于Golang導入導出Excel表格的資料請關注腳本之家其它相關文章!