在 Golang 中导出为 CSV 时保留字符串的前导零
Keep the leading zeros of a string when exporting to CSV in Golang
我有一个使用 Gin 框架的 Go 应用程序,可以将结构导出到 CSV。一列 userCode
要求导出的字段保留字符串的所有前导零。
例如,对于000001
、010101
、000000
这样的字符串,导出的CSV字段应该有完全相似的值。但是,如果我直接将字符串附加到行并写入缓冲区,导出的字段将发出所有前导零并且值变为:1
、10101
、
,我做了一些挖掘,似乎这个问题可以通过在读取 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
我测试了你的代码,excel 中的结果会丢失零,但在 txt reader 中不会;
代码:
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)
}
结果:
我有一个使用 Gin 框架的 Go 应用程序,可以将结构导出到 CSV。一列 userCode
要求导出的字段保留字符串的所有前导零。
例如,对于000001
、010101
、000000
这样的字符串,导出的CSV字段应该有完全相似的值。但是,如果我直接将字符串附加到行并写入缓冲区,导出的字段将发出所有前导零并且值变为:1
、10101
、
,我做了一些挖掘,似乎这个问题可以通过在读取 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
我测试了你的代码,excel 中的结果会丢失零,但在 txt reader 中不会;
代码:
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)
}
结果: