【Golang】使用gin框架导出excel和csv文件

目录

1、背景

项目中可能会遇到导入导出一批数据的功能,对于批量大数据可能用表格的方式直观性更好,所以本篇文件来讲一下go中导出excel和csv文件的方式。

2、go库

【1】excel库下载

go get -u github.com/xuri/excelize/v2

【2】csv标准库

encoding/csv

3、代码示例

go 复制代码
func main() {
	r := gin.Default()

	r.GET("/download", func(c *gin.Context) {
		fileType := c.Query("type") // 获取请求参数csv或excel

		switch strings.ToLower(fileType) {
		case "csv":
			downloadCSV(c)
		case "excel":
			downloadExcel(c)
		default:
			c.JSON(http.StatusBadRequest, gin.H{"error": "invalid type parameter, use 'csv' or 'excel'"})
		}
	})

	r.Run(":8080")
}

func downloadCSV(c *gin.Context) {
	// 设置响应头 - 解决乱码和中文文件名问题
	filename := url.QueryEscape("测试.csv")
	c.Header("Content-Disposition", "attachment; filename*=UTF-8''"+filename)
	c.Header("Content-Type", "text/csv; charset=utf-8")

	// 写入UTF-8 BOM头,防止中文乱码(可选,某些旧版Excel需要)
	_, _ = c.Writer.Write([]byte{0xEF, 0xBB, 0xBF})

	// 创建CSV写入器
	writer := csv.NewWriter(c.Writer)
	defer writer.Flush()

	// 写入表头
	_ = writer.Write([]string{"姓名", "年龄"})

	// 写入数据行
	data := [][]string{
		{"xxx", "18"},
		{"yyy", "19"},
		{"zzz", "20"},
	}

	for _, row := range data {
		_ = writer.Write(row)
	}
}

func downloadExcel(c *gin.Context) {
	// 创建Excel文件
	f := excelize.NewFile()
	defer f.Close()

	// 创建工作表
	index, _ := f.NewSheet("Sheet1")

	// 设置表头
	_ = f.SetCellValue("Sheet1", "A1", "姓名")
	_ = f.SetCellValue("Sheet1", "B1", "年龄")

	// 设置数据
	data := [][]interface{}{
		{"xxx", "18"},
		{"yyy", "19"},
		{"zzz", "20"},
	}

	for i, row := range data {
		_ = f.SetCellValue("Sheet1", "A"+strconv.Itoa(i+2), row[0])
		_ = f.SetCellValue("Sheet1", "B"+strconv.Itoa(i+2), row[1])
	}

	// 设置活动工作表
	f.SetActiveSheet(index)

	// 设置响应头 - 解决中文文件名问题
	filename := url.QueryEscape("测试.xlsx")
	c.Header("Content-Type", "application/octet-stream")
	c.Header("Content-Disposition", "attachment; filename*=UTF-8''"+filename)

	// 写入响应
	_ = f.Write(c.Writer)
}

4、使用方法

浏览器上输入http://127.0.0.1:8080/download?type=excel 下载excel文件,浏览器上输入**http://127.0.0.1:8080/download?type=csv**下载csv文件,下载完之后可以在下载目录看到如下文件:

bash 复制代码
xxx@A030414-NC MINGW64 /d/谷歌浏览器下载文件
$ ls 测试.*
测试.csv  测试.xlsx
相关推荐
Wang's Blog1 小时前
Go-Zero框架上手前奏2: 微服务核心要素 —— 拆分、通信与无状态设计
开发语言·微服务·golang
Generalzy18 小时前
从本地 Demo 到生产级检索:Milvus 学习笔记(2)
golang·milvus
小高Baby@19 小时前
单链表的删操作
数据结构·算法·golang
张3231 天前
Go语言基础 Map 函数值 闭包
开发语言·golang
不坑老师1 天前
Excel总表如何按班级拆分并分别发送?
前端·数据库·人工智能·excel·ppt·office
北冥you鱼1 天前
Go Modules 使用指南:从入门到精通
开发语言·后端·golang
灯澜忆梦1 天前
【dp_1】爬楼梯 | 斐波那契数 | 第 N 个泰波那契数 | 三步问题
算法·golang
geovindu1 天前
go: Floyd-Warshall Algorithms
开发语言·后端·算法·golang
AC赳赳老秦1 天前
Excel 动态仪表盘制作:用 OpenClaw 自动处理数据、生成交互式图表并实时更新仪表盘
大数据·服务器·后端·测试用例·excel·deepseek·openclaw
得闲喝茶2 天前
跨表数据匹配——VLOOKUP、XLOOKUP
大数据·数据库·笔记·信息可视化·数据分析·excel