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

小谷xg · · 1277 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

golang-csv.png

在日常开发中,针对数据导出,我们可以导出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
}

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

本文来自:Segmentfault

感谢作者:小谷xg

查看原文:Golang导出CSV数据并解决数据乱码问题

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1277 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传