16

Golang导出CSV数据并解决数据乱码问题

 4 years ago
source link: https://studygolang.com/articles/32341
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

eY32MnQ.png!mobile

在日常开发中,针对数据导出,我们可以导出Excel格式,但是如果是针对大数据量的导出,直接导出为Excel格式可能需要占用大量内存,且导出速度很慢。这个时候我们就需要导出为CSV格式。

CSV 格式

CSV本质上是文本文件,该文件有以下要求:

  • 列之间用逗号分隔,行之间用换行分隔
  • 单元格如果有逗号、引号之类的字符,该单元格需要使用双引号括起来
  • 如果内容包含中文,直接输出可能会乱码

实现方式

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
}

有疑问加站长微信联系(非本文作者)

eUjI7rn.png!mobile

Recommend

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK