首页 > 其他分享 >golang 把内容写到 csv 文件或者 xlsx 文件里

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

时间:2023-09-24 16:46:07浏览次数:50  
标签:文件 CSV err xlsx golang student csv row

内容来自对 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的<a>标签来创建超链接,并用逗号分隔它们。但是,需要注意的是,打开CSV时是否能以超链接的形式展示这些URL取决于查看CSV文件的程序,比如 wps 就不能默认使用超链接来渲染 <a> 标签

时间格式被 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 文件的二进制流
}

标签:文件,CSV,err,xlsx,golang,student,csv,row
From: https://www.cnblogs.com/hi3254014978/p/17726165.html

相关文章

  • 从一个golang 员工emp数组中,找到其中name相同的元素,把结果放到一个新数组里,代码实现
    内容来自对chatgpt的咨询为了找到具有相同名称的员工,并将结果放入一个新的数组中,我们可以首先使用一个映射(map)来存储每个名称及其出现的次数。然后,我们可以遍历原始数组并使用映射来判断是否有重复的名称。以下是一个示例代码,演示如何实现这一目标:packagemainimport( ......
  • WebStorm 快捷键打开文件所在的文件夹
    可能会以为是给ShowinExplorer绑定快捷键,但我这里测试无效,需要绑定ShowinFileManager:......
  • Python处理CSV文件
    python处理CSV文件CSV文件CSV(comma-separatedvalues)文件是一种文本文件格式,允许以表格结构保存数据。这是一种流行的格式,用于从数据库和电子表格导出和导入数据,CSV文件中的每条数据都用逗号(,)分隔,例如,第一行数据可以选择用作标题,标明其下方的每一列数据:处理CSV文件CSV......
  • 大文件切片上传+断点续传解决方案-前后端实现
    上传文件大家应该都做过,前端直接把file文件传给后端就ok了,但是大文件这样传就会造成页面假死,体验极差。如果遇到网络不稳定的时候,中途上传失败的话,又要从头开始传,本来文件就大,还慢。所以今天我们用一种新方法-切片上传+断点续传前端实现:页面上很简单,我就放了进度条和一个上传文件......
  • 解除锁定:一键批量完成 【解除锁定】所有指定文件
    ......
  • mysql导入外部文件
    1、右击表点击导入向导2、选择导入类型,点击下一步 3、选择数据源 4、有需要的画更改栏位分隔符(这里是.csv文件所以不可选)5、修改数据行(我习惯改成第一行,这样不用担心遗漏数据)6、确定表名7、确定列名8、点击下一步、开始 等进度条满就可以啦 ......
  • 这个红头文件做了15遍!!!
    今天是2020-02-1720:57,真的很佩服自己的耐心!一朋友说自己需要调整一张图片的几个字,于是花了许久才昨晚,或许是能力有限吧,后面仔细一看,做了15遍,仔细想想,还有一层原因就是,我那朋友的要求的确比较高。今天小编给大家分享一下,ps学习过程中的一些心得吧!当涉及到学习使用PS(Photoshop)这......
  • springBoot上传文件时MultipartFile报空问题解决方法
    1.问题描述:之前用springMVC,转成springboot之后发现上传不能用。网上参考说是springboot已经有CommonsMultipartResolver了,但是我的上传后台接收的还是null。2.解决方法加入配置类importorg.springframework.context.annotation.Bean;importorg.springframework.context......
  • 搭建Wpf框架(17) ——大文件上传与下载
    先上效果图:大文件上传1.客户端需要按照块拆成一块一块,先计算大小,然后计算块的个数,然后按块逐个上传,代码如下:public async Task<UploadResult> UploadFileChunck(string path, Action<double> progressAction)        {            try      ......
  • android驱动模块实现文件重定位
    编写驱动模块进行sys_call_tablehook替换sys_open和sys_openat系统调用为自定义函数,需要注意sys_call_table是只读的,修改前需要前修改其内存属性为可写。直接修改内核源码,并编写驱动模块实现filterfunction进行过滤。sys_call_tablehook只能对系统调用函数进行hook。而第......