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: 查看表格
