Press "Enter" to skip to content

golang中使用excelize导出表格

golang中使用excelize导出表格

背景:客户每天定点取一组数据填入excel中,记录发酵周期内温度变化,并根据公式计算报表值,现希望通过系统完成该操作

分析

针对golang的几款兼容性好的excel包有tealeg, excelize, openxlsx等,对比语法,选择了excelize

Step1: 下载安装包
方式一 在go.mod文件中填写 github.com/xuri/excelize/v2 v2.6.1 然后执行 go mod tidy
方式二在终端输入go get github.com/xuri/excelize/v2 
Step2: 查询数据

根据客户要求,查询窖池中固定时间点的一条数据,分上中下层,当设备未上报该时间点数据时,取时间点前后教近的一条,该步骤省略…

Step3: 处理表格
// 创建一个新的Excel文件
f := excelize.NewFile()

注意,同一个excel单元格只能设置一次样式,多次设置会覆盖

// 如果一个单元格的样式较多,可以把样式一次性加上
styleID, _ := f.NewStyle(`{
		"font": {
			"size":12,
			"bold": true
		},
		"alignment": {
			"horizontal": "center",
			"vertical": "center"
		}
	}`)
f.SetCellStyle("Sheet1", "A1", "A1", styleColor) // 设置样式
// 合并单元格
f.MergeCell("Sheet1", "A1", "A2")
// 设置单元格值
f.SetCellValue("Sheet1", "A1", OperationName)
// 设置行高
f.SetRowHeight("Sheet1", "A1", 22.0)
// 表格的填充需根据excel的横纵两个轴循环写入 eg:
	columnIndex = 2
	for _, device := range data { // 循环填入数据
		rowIndex := 4
		for _, dataGroup := range device.Data {
			lie1 := e.GetColumnLetter(columnIndex)
			lie2 := e.GetColumnLetter(columnIndex + 1)
			for _, item := range dataGroup {
				t := time.Unix(item.CreatedTime, 0)
				timeStr := t.Format("01月02日 15:04")
				f.SetCellValue("Sheet1", fmt.Sprintf("%s%d", lie1, rowIndex), timeStr)
				f.SetCellValue("Sheet1", fmt.Sprintf("%s%d", lie2, rowIndex), item.Value)
				f.SetCellStyle("Sheet1", fmt.Sprintf("%s%d", lie2, rowIndex), fmt.Sprintf("%s%d", lie2, rowIndex), styleCenter)
			}
			rowIndex++
		}
		columnIndex += 2 // 移动到下一列
	}
Step3: 保存文件

excel表格数据填充完毕后,保存文件

// 保存文件
	FileName := "langjiu_pit.xlsx"
	f.SaveAs(FileName)
// 执行后,可看到根目录有一个名为langjiu_pit.xlsx的表格
Step4: 导出表格
// // 设置HTTP响应头,指定文件名和Content-Type
	co.Header("Content-Disposition", "attachment; filename="+FileName)
	co.Header("Content-Type", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")
	// 打开文件
	file, err := os.Open(FileName) // 替换为你的文件路径
	if err != nil {
		return
	}
	defer file.Close()

	// 发送文件内容
	_, err = io.Copy(co.Writer, file) // 注意:这里使用了io.Copy,但没有在示例中导入"io"包
Step5: 查看表格

1721377152631