在 Golang 中导出为 CSV 时保留字符串的前导零

Keep the leading zeros of a string when exporting to CSV in Golang

我有一个使用 Gin 框架的 Go 应用程序,可以将结构导出到 CSV。一列 userCode 要求导出的字段保留字符串的所有前导零。

例如,对于000001010101000000这样的字符串,导出的CSV字段应该有完全相似的值。但是,如果我直接将字符串附加到行并写入缓冲区,导出的字段将发出所有前导零并且值变为:110101 ,我做了一些挖掘,似乎这个问题可以通过在读取 csv 文件时在 Excel 中设置列​​类型来解决,但我想知道这是否可以在 Go 程序中解决?谢谢!

我的CSV导出相关功能:

func (h *HandleManager) ExportUsers() gin.HandlerFunc {

        var buf bytes.Buffer
        writer := csv.NewWriter(&buf)
        var cols = []string{"User Name", ..., ....}
        writer.Write(cols)
        for _, e := range users {
            var row []string
            // ....
            row = append(row, e.userCode) // type: string
            if err := writer.Write(row); err != nil {
                log.Errorff(h.logCtx, "ExportUsers|WriteToCSV|err:%v", err)
                c.AbortWithStatus(http.StatusInternalServerError)
                return
            }
        }
        writer.Flush()
        c.Writer.Header().Set("Content-Type", "text/csv")
        c.Writer.Header().Set("Content-Disposition", "attachment;filename="+csvFileName+".csv")
        c.Writer.Write(buf.Bytes())
}

经过几次尝试,我找到了在 golang 中有效的解决方案,感谢 link @Steffen Ullrich 提出的。与VB中的类似,两边不用双引号,一个就够了:

row = append(row, "=\""+e. userCode +"\"")

将包含 CSV 文件中的所有前导零:

000001, 010101, 000000
  1. 我测试了你的代码,excel 中的结果会丢失零,但在 txt reader 中不会;

  2. 代码:

    func main() { 输入用户结构{ 名称字符串 代码字符串 }

     http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
         var buf bytes.Buffer
         writer := csv.NewWriter(&buf)
         var cols = []string{"Name", "Code"}
         writer.Write(cols)
         users := []user{{Name: "Tome", Code: "001"}, {Name: "James", Code: "000"}}
    
         for _, e := range users {
             err := writer.Write([]string{e.Name, e.Code})
             if err != nil {
                 log.Fatalln(err)
             }
         }
         writer.Flush()
         w.Header().Set("Content-Type", "text/csv")
         w.Header().Set("Content-Disposition", "attachment;filename="+"test.csv")
    
         w.Write(buf.Bytes())
    
     })
    
     http.ListenAndServe(":8080", nil)
    

    }

结果: