Golang導出CSV數據並解決數據亂碼問題

golang-csv.png

在平常開發中,針對數據導出,咱們能夠導出Excel格式,可是若是是針對大數據量的導出,直接導出爲Excel格式可能須要佔用大量內存,且導出速度很慢。這個時候咱們就須要導出爲CSV格式。golang

CSV 格式


CSV本質上是文本文件,該文件有如下要求:web

  • 列之間用逗號分隔,行之間用換行分隔
  • 單元格若是有逗號、引號之類的字符,該單元格須要使用雙引號括起來
  • 若是內容包含中文,直接輸出可能會亂碼

實現方式


golang 官方有csv的庫,能夠很容易的實現csv數據的寫入。框架

golang實現csv數據寫文件


func main() {
    f, err := os.Create("data.csv")
    if err != nil {
        panic(err)
    }
    defer f.Close()

    f.WriteString("xEFxBBxBF") // 寫入UTF-8 BOM,避免使用Microsoft Excel打開亂碼 
    writer := csv.NewWriter(f)
    writer.Write([]string{"編號", "姓名", "年齡"})
    writer.Write([]string{"1", "張三", "23"})
    writer.Write([]string{"2", "李四", "24"})
    writer.Write([]string{"3", "王五", "25"})
    writer.Write([]string{"4", "趙六", "26"})
    writer.Flush() // 此時纔會將緩衝區數據寫入 }

golang實現web導出csv數據


此處以gin框架爲例,若是用的go官方web庫,其實差很少是同樣的:大數據

func ExportCsv(c *gin.Context) {
    bytesBuffer := &bytes.Buffer{}
    bytesBuffer.WriteString("xEFxBBxBF") // 寫入UTF-8 BOM,避免使用Microsoft Excel打開亂碼 
    writer := csv.NewWriter(bytesBuffer)
    writer.Write([]string{"編號", "姓名", "年齡"})
    writer.Write([]string{"1", "張三", "23"})
    writer.Write([]string{"2", "李四", "24"})
    writer.Write([]string{"3", "王五", "25"})
    writer.Write([]string{"4", "趙六", "26"})

    writer.Flush() // 此時纔會將緩衝區數據寫入 
    // 設置下載的文件名     c.Writer.Header().Set("Content-Disposition", "attachment;filename=data.csv")
    // 設置文件類型以及輸出數據     c.Data(http.StatusOK, "text/csv", bytesBuffer.Bytes())
    return
}
相關文章
相關標籤/搜索