golang 把内容写到 csv 文件或者 xlsx 文件里

发布时间 2023-09-24 16:38:31作者: Lucky小黄人^_^

内容来自对 chatgpt 的咨询

csv 格式

csv 格式的文件使用 wps 或者 office 打开后是一个 excel 表格的形式,很容易看到表格里的数据。csv 格式跟 markdown 格式有点像,只需要按照固定的语法放置文本,保存后,用对应的渲染软件打开,就能得到想要的效果。

比如下面这段 json,用文本编辑器使用 csv 的语法写到一个文件里,保存时修改文件后缀为 .csv,一个就成功把 json 转成 csv 文件了。

[
    {
        "aaa": "张三",
        "age": 18,
        "hobby":["1", "2", "3"]
    },
        {
            "aaa": "李四",
            "age": 28,
            "hobby": [
                "1",
                "2",
                "4"
            ]
        }
]

将数组转化为以逗号分隔的字符串。以下是基于您的 JSON 数据转换的 CSV:使用了 | 来分隔数组中的元素,渲染时会将数组元素平铺开来,展开成多列。

aaa,age,hobby
张三,18,1|2|3
李四,28,1|2|4

Golang 编程把内容写到 csv 文件里

假设你有一个student对象数组,你需要使用 golang 转成 csv 文件

package main

import (
	"encoding/csv"
	"os"
	"log"
)

// 定义 Student 结构
type Student struct {
	ID   int64
	Name string
	Age  int
}

func main() {
    // 定义 Student 对象数组
	students := []Student{
		{"1", "Alice", 20},
		{"2", "Bob", 21},
		{"3", "Charlie", 22},
		{"4", "David", 23},
	}

	file, err := os.Create("students.csv")
	if err != nil {
		log.Fatalf("failed creating file: %s", err)
	}

    buf := &bytes.Buffer{}
	csvwriter := csv.NewWriter(buf)
	csvwriter.Write([]string{"ID", "Name", "Age"})

	for _, student := range students {
		var row []string
		row = append(row, strconv.FormatInt(student.ID, 10))
		row = append(row, student.Name)
		row = append(row, fmt.Sprintf("%d", student.Age))
		csvwriter.Write(row)
	}

	csvwriter.Flush()
	err := csvwriter.Error()
	if err != nil {
		log.Fatalf("CSV writer error: %v", err)
	}

	// 获取二进制流
	binaryData := buf.Bytes()
	_ = binaryData // 这里 binaryData 就是 CSV 文件的二进制流
}

添加一行记录时也可以像下面这样,先创建一个数组,随后往数组里填值

	for _, student := range students {
		var row = make([]string, 0)
        row[0] = "'" + strconv.FormatInt(student.ID, 10) // 使用一个单引号,使得使用软件渲染文件时,不会默认展示成科学计数法的形式。
        row[1] = student.Name
        row[2] = fmt.Sprintf("%d", student.Age)
		csvwriter.Write(row)
	}

渲染超链接

如果你想在CSV文件中将多个URL保存为超链接,你可以考虑使用HTML的标签来创建超链接,并用逗号分隔它们。但是,需要注意的是,打开CSV时是否能以超链接的形式展示这些URL取决于查看CSV文件的程序,比如 wps 就不能默认使用超链接来渲染 标签

时间格式被 wps 渲染成 '#######',怎么默认展示正常时间格式

当你在WPS或Excel中打开一个CSV文件并看到'######',这通常意味着单元格的宽度不足以显示其内容。这是电子表格软件的默认行为来提示用户某个单元格的内容过长。

解决这个问题有两种常见的方法:

手动调整列宽:打开CSV文件后,你可以手动调整受影响列的宽度以查看完整的日期/时间值。

预设列宽:如果你经常需要处理这样的CSV文件,考虑编写一个宏或使用某种自动化工具来自动调整列宽。但这需要你在WPS或Excel中进行额外的配置。

但是,如果你想确保上传时间在任何情况下都能正确显示,还可以考虑以下方法:

改变时间格式:考虑使用一个更短的日期/时间格式,这样即使在较小的单元格宽度下,时间也可以完整显示。例如,你可以使用yy-MM-dd代替yyyy-MM-dd。

不过,最终,这仍然取决于你如何打开CSV文件以及你使用的工具的默认设置。如果你希望文件的接收者在不进行任何手动操作的情况下看到格式正确的日期/时间,那么可能需要考虑使用一个更专业的电子表格格式(如XLSX),并预先设置适当的列宽和日期/时间格式。

func formatUrlsAsHyperlinks(urls []string) string {
	var hyperlinks []string
	for _, url := range urls {
		hyperlink := "<a href=\"" + url + "\">" + url + "</a>"
		hyperlinks = append(hyperlinks, hyperlink)
	}
	return strings.Join(hyperlinks, ", ")
}

golang 编程把内容写到 xlsx 文件里

package main

import (
	"log"
	"strconv"
	"github.com/tealeg/xlsx"
)

// 定义 Student 结构
type Student struct {
	ID   int64
	Name string
	Age  int
}

func main() {

	// 定义 Student 对象数组
	students := []Student{
		{1, "Alice", 20},
		{2, "Bob", 21},
		{3, "Charlie", 22},
		{4, "David", 23},
	}

	file := xlsx.NewFile()
	sheet, err := file.AddSheet("Sheet1")
	if err != nil {
		log.Fatalf("failed adding sheet: %s", err)
	}

    // 添加标题
	headers := []string{"ID", "Name", "Age"}
	headerRow := sheet.AddRow()
	for _, h := range headers {
		cell = headerRow.AddCell()
		cell.Value = h
	}

	// 遍历每个学生并将其信息添加到新行
	for _, student := range students {
		row = sheet.AddRow()
		row.AddCell().Value = strconv.FormatInt(student.ID, 10)
		row.AddCell().Value = student.Name
		row.AddCell().Value = strconv.Itoa(student.Age)
	}

	// 将文件编写到buffer中,并获取二进制流
	buffer := bytes.NewBuffer([]byte{})
	err = file.Write(buffer)
	if err != nil {
		log.Fatalf("failed writing to buffer: %s", err)
	}

	binaryData := buffer.Bytes()
	_ = binaryData // 这里 binaryData 就是 XLSX 文件的二进制流
}