最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

基于Golang實現(xiàn)Excel表格的導(dǎo)入導(dǎo)出功能

 更新時間:2023年12月12日 09:04:40   作者:敲代碼der  
最近項目開發(fā)中有涉及到Excel的導(dǎo)入與導(dǎo)出功能,特別是導(dǎo)出表格時需要特定的格式,所以本文給大家介紹了基于Golang實現(xiàn)Excel表格的導(dǎo)入導(dǎo)出功能,文中通過代碼示例和圖文介紹的非常詳細(xì),需要的朋友可以參考下

最近項目開發(fā)中有涉及到Excel的導(dǎo)入與導(dǎo)出功能,特別是導(dǎo)出表格時需要特定的格式(單元格合并等),廢話不多說,直接上代碼了。

首先用到一個第三方庫,實測還是很強大很好用的,就是這個https://github.com/qax-os/excelize

引用庫

go get github.com/xuri/excelize/v2

導(dǎo)入表格

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
  }
  // 關(guān)閉
  defer formFile.Close()
  //
  reader, err := excelize.OpenReader(formFile)
  if err != nil {
    w.Write([]byte("讀取文件失敗, " + err.Error()))
    return
  }
  // 關(guān)閉
  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ù)據(jù)的列, 都是從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服務(wù)
  http.HandleFunc("/fileImport", fileImport)
  err := http.ListenAndServe(":8192", nil)
  if err != nil {
    panic(err)
  }
}

表格格式

執(zhí)行后效果

導(dǎo)出表格

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()

  // 設(shè)置頁
  sheetName := "Sheet1"
  // 創(chuàng)建
  sheet, err := file.NewSheet(sheetName)
  if err != nil {
    w.Write([]byte("創(chuàng)建失敗, " + err.Error()))
    return
  }
  // 設(shè)置單元格格式
  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)
  // 設(shè)置表頭
  _ = file.SetCellValue(sheetName, "A1", "款")
  _ = file.SetCellStyle(sheetName, "A1", "A1", styleID)
  _ = file.SetCellValue(sheetName, "B1", "尺碼")
  _ = file.SetCellStyle(sheetName, "B1", "B1", styleID)
  // 設(shè)置值
  for i := 0; i < 5; i++ {
    lineStr := fmt.Sprintf("%d", i+2)
    //
    _ = file.SetCellValue(sheetName, "A"+lineStr, "基礎(chǔ)款")
    _ = 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("導(dǎo)出失敗, " + err.Error()))
    return
  }
  w.Header().Set("Content-Disposition", fmt.Sprintf("attachment; filename=%s", "導(dǎo)出文件.xlsx"))
  w.Header().Set("Content-Type", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")
  w.Write(buffer.Bytes())
}

func main() {
  // HTTP服務(wù)
  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()

  // 設(shè)置頁
  sheetName := "Sheet1"
  // 創(chuàng)建
  sheet, err := file.NewSheet(sheetName)
  if err != nil {
    w.Write([]byte("創(chuàng)建失敗, " + err.Error()))
    return
  }
  // 設(shè)置單元格格式
  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)
  // 設(shè)置表頭
  _ = 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)
  // 設(shè)置值
  for i := 0; i < 5; i++ {
    lineStr := fmt.Sprintf("%d", i+3)
    //
    _ = file.SetCellValue(sheetName, "A"+lineStr, "基礎(chǔ)款")
    _ = 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("導(dǎo)出失敗, " + err.Error()))
    return
  }
  // 設(shè)置文件名
  w.Header().Set("Content-Disposition", fmt.Sprintf("attachment; filename=%s", "導(dǎo)出文件.xlsx"))
  // 導(dǎo)出的文件格式 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服務(wù)
  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表格的導(dǎo)入導(dǎo)出功能的詳細(xì)內(nèi)容,更多關(guān)于Golang導(dǎo)入導(dǎo)出Excel表格的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Windows系統(tǒng)中搭建Go語言開發(fā)環(huán)境圖文詳解

    Windows系統(tǒng)中搭建Go語言開發(fā)環(huán)境圖文詳解

    GoLand?是?JetBrains?公司推出的商業(yè)?Go?語言集成開發(fā)環(huán)境(IDE),這篇文章主要介紹了Windows系統(tǒng)中搭建Go語言開發(fā)環(huán)境詳解,需要的朋友可以參考下
    2022-10-10
  • 7分鐘讀懂Go的臨時對象池pool以及其應(yīng)用場景

    7分鐘讀懂Go的臨時對象池pool以及其應(yīng)用場景

    這篇文章主要給大家介紹了關(guān)于如何通過7分鐘讀懂Go的臨時對象池pool以及其應(yīng)用場景的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或使用Go具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起看看吧
    2018-11-11
  • Go語言操作金倉數(shù)據(jù)庫之SQL執(zhí)行,類型映射與超時控制詳解

    Go語言操作金倉數(shù)據(jù)庫之SQL執(zhí)行,類型映射與超時控制詳解

    本文詳細(xì)介紹了使用Go語言操作金倉數(shù)據(jù)庫的關(guān)鍵技術(shù)點,主要包括 SQL執(zhí)行,通過Query方法執(zhí)行查詢并處理結(jié)果集,使用Exec執(zhí)行非查詢操作,以及事務(wù)處理多條SQL語句的方法,有需要的小伙伴可以了解下
    2026-05-05
  • Golang中omitempty關(guān)鍵字的具體實現(xiàn)

    Golang中omitempty關(guān)鍵字的具體實現(xiàn)

    本文主要介紹了Golang中omitempty關(guān)鍵字的具體實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • 在Go中編寫測試代碼的方法總結(jié)

    在Go中編寫測試代碼的方法總結(jié)

    在程序開發(fā)過程中,測試是非常重要的一環(huán),甚至有一種開發(fā)模式叫?TDD,先編寫測試,再編寫功能代碼,通過測試來推動整個開發(fā)的進行,可見測試在開發(fā)中的重要程度,為此,Go提供了testing框架來方便我們編寫測試,本文將向大家介紹在Go中如何編寫測試代碼
    2023-07-07
  • Go Struct結(jié)構(gòu)體的具體實現(xiàn)

    Go Struct結(jié)構(gòu)體的具體實現(xiàn)

    Go語言中通過結(jié)構(gòu)體的內(nèi)嵌再配合接口比面向?qū)ο缶哂懈叩臄U展性和靈活性,本文主要介紹了Go Struct結(jié)構(gòu)體的具體實現(xiàn),感興趣的可以了解一下
    2023-03-03
  • go內(nèi)存緩存BigCache之Entry封裝源碼閱讀

    go內(nèi)存緩存BigCache之Entry封裝源碼閱讀

    這篇文章主要介紹了go內(nèi)存緩存BigCache之Entry封裝源碼閱讀
    2023-09-09
  • Go操作redis與redigo的示例解析

    Go操作redis與redigo的示例解析

    這篇文章主要為大家介紹了Go操作redis與redigo的示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步早日升職加薪
    2022-04-04
  • Golang SSE 服務(wù)器端推送事件

    Golang SSE 服務(wù)器端推送事件

    本文主要介紹了Golang SSE 服務(wù)器端推送事件,SSE基于HTTP實現(xiàn),允許服務(wù)器單向推送數(shù)據(jù),客戶端通過EventSource接收,下面就來詳細(xì)的介紹一下,感興趣的可以了解一下
    2025-07-07
  • golang基礎(chǔ)之reflect反射的實現(xiàn)

    golang基礎(chǔ)之reflect反射的實現(xiàn)

    Golang反射通過TypeOf/ValueOf實現(xiàn)接口與反射對象的轉(zhuǎn)換,可動態(tài)獲取和修改值,本文主要介紹了golang基礎(chǔ)之reflect反射的實現(xiàn),具有一定的參考價值,感興趣的可以了解一下
    2025-06-06

最新評論

池州市| 汽车| 稷山县| 丹东市| 新巴尔虎左旗| 上犹县| 绥棱县| 清河县| 共和县| 达拉特旗| 阜康市| 平南县| 竹山县| 原平市| 年辖:市辖区| 新和县| 苍山县| 长兴县| 游戏| 凯里市| 饶河县| 广汉市| 太仓市| 弥渡县| 辽中县| 新兴县| 沛县| 云浮市| 横山县| 大洼县| 武汉市| 淳化县| 丹东市| 宜丰县| 荣昌县| 定州市| 额济纳旗| 泌阳县| 武鸣县| 都江堰市| 湖州市|