说实话,我之前一直觉得用代码操作Excel表格是件挺玄乎的事,尤其是篮球队那种几十号人的名单,光是录入姓名、年龄、位置、身高体重这些信息就够头疼的,但后来被教练催着要名单,我硬着头皮用Golang写了个小工具,没想到还真搞定了,而且用起来还挺顺手。
为啥非得用Golang搞Excel?
你要是没被Excel折磨过,那你可能不懂为啥要这么折腾,篮球队名单这种东西,今天有个人受伤要加替补,明天又来个试训的新人,后天教练说“我要按身高排序、按位置分组”,每次手动编辑Excel都烦得要命,用Golang呢,写一次代码,后面改改数据跑个程序就行,省事多了。
而且Golang的库很成熟,比如Excelize这个库,能创建、读取、修改xlsx文件,连样式都能调,这玩意儿是纯Go写的,不需要装Office,在服务器上也能跑,特别适合搞自动化。
先搭个架子,把库装上
go get github.com/xuri/excelize/v2
这步就是装个依赖,跟装篮球鞋一个道理,先得有的穿才能打球,Excelize是目前Go里最火的Excel库,没有之一。
开始干活:创建篮球队人员名单
我一般先捋清楚要存哪些信息,篮球队嘛,常见的字段有:
- 姓名
- 球衣号码
- 场上位置(控卫、分卫、小前、大前、中锋)
- 身高(cm)
- 体重(kg)
- 年龄
- 备注(比如队长、试训、受伤恢复期之类的)
这些列在Excel里从左到右排开,看起来清清楚楚。
下面是我当时写的代码片段,其实逻辑很简单,就是创建一个文件,往Sheet里写数据:
package main
import (
"fmt"
"github.com/xuri/excelize/v2"
)
func main() {
f := excelize.NewFile()
defer f.Close()
// 设置表头
headers := []string{"姓名", "球衣号码", "场上位置", "身高(cm)", "体重(kg)", "年龄", "备注"}
for i, h := range headers {
cell := fmt.Sprintf("%c1", 'A' + i)
f.SetCellValue("Sheet1", cell, h)
}
// 写入球员数据
players := []map[string]interface{}{
{"姓名": "张明", "号码": 7, "位置": "控球后卫", "身高": 183, "体重": 78, "年龄": 24, "备注": "队长"},
{"姓名": "李伟", "号码": 23, "位置": "得分后卫", "身高": 190, "体重": 85, "年龄": 22, "备注": ""},
{"姓名": "王强", "号码": 34, "位置": "小前锋", "身高": 196, "体重": 92, "年龄": 26, "备注": "新入队"},
{"姓名": "赵刚", "号码": 15, "位置": "大前锋", "身高": 202, "体重": 105, "年龄": 28, "备注": "受伤恢复期"},
{"姓名": "刘洋", "号码": 12, "位置": "中锋", "身高": 210, "体重": 115, "年龄": 27, "备注": ""},
}
for row, p := range players {
r := row + 2 // 从第2行开始,第1行是表头
f.SetCellValue("Sheet1", fmt.Sprintf("A%d", r), p["姓名"])
f.SetCellValue("Sheet1", fmt.Sprintf("B%d", r), p["号码"])
f.SetCellValue("Sheet1", fmt.Sprintf("C%d", r), p["位置"])
f.SetCellValue("Sheet1", fmt.Sprintf("D%d", r), p["身高"])
f.SetCellValue("Sheet1", fmt.Sprintf("E%d", r), p["体重"])
f.SetCellValue("Sheet1", fmt.Sprintf("F%d", r), p["年龄"])
f.SetCellValue("Sheet1", fmt.Sprintf("G%d", r), p["备注"])
}
// 保存文件
if err := f.SaveAs("篮球队人员名单.xlsx"); err != nil {
fmt.Println("保存失败:", err)
} else {
fmt.Println("成功生成篮球队人员名单!")
}
}
你看,也就几十行代码,一个完整的篮球队人员名单Excel就出来了,跑完程序,在目录下找到那个xlsx文件,打开一看,各个球员的信息清清楚楚、整整齐齐。
进阶玩法:给名单加点样式
光有数据还不够,教练要求表格得好看点,比如表头要加粗、背景色要深一点,球员位置不同最好能高亮一下。
Excelize支持设置样式,我简单搞了个例子:
styleHeader, _ := f.NewStyle(&excelize.Style{
Font: &excelize.Font{Bold: true, Color: "FFFFFF", Size: 12},
Fill: excelize.Fill{Type: "pattern", Pattern: 1, Color: []string{"4472C4"}},
Alignment: &excelize.Alignment{Horizontal: "center"},
})
// 给表头应用样式
f.SetCellStyle("Sheet1", "A1", "G1", styleHeader)
跑完之后,Excel里表头变成蓝底白字,看着专业多了。其实很多人不知道,用代码调样式比手动复制粘贴还快——尤其是名单要反复更新的时候,改一次代码,后面每次都自动生成。
从Excel读数据,反向操作
有时候教练发过来一个旧名单,要我改几个人的信息,我的做法是:先用代码把Excel读出来,分析一下,再写回去。
f, _ := excelize.OpenFile("篮球队人员名单.xlsx")
rows, _ := f.GetRows("Sheet1")
for _, row := range rows {
for _, cell := range row {
fmt.Print(cell, "\t")
}
fmt.Println()
}
这段代码会逐行打印Excel里的内容,虽然简单,但结合条件判断,你可以做到很多事情:找出来超过30岁的老将,或者筛选出身高不足180的球员单独列出来,这些功能手动操作起来费时间,用代码一秒钟搞定。
解决一个实际问题:分类统计
有次我做了个小组件,用来统计球队里各个位置的人数,比如中锋几个,后卫几个,这听着简单,但手动数确实容易出错,尤其是人数多了以后。
用Golang的话,就加一段计算逻辑:
positionCount := make(map[string]int)
for _, p := range players {
positionCount[p["位置"].(string)]++
}
for pos, count := range positionCount {
fmt.Printf("%s: %d人\n", pos, count)
}
然后顺手把这个统计结果也写到Excel的另一个Sheet里,比如加个叫“统计”的Sheet,这样教练打开文件,在第一个Sheet看名单,第二个Sheet看统计,非常直观。

我把这个统计表的代码也加上了,用同一份数据生成两个关联的表格,这就是自动化比手动强的核心优势:
f.NewSheet("数据统计")
f.SetCellValue("数据统计", "A1", "场上位置")
f.SetCellValue("数据统计", "B1", "人数")
rowNum := 2
for pos, count := range positionCount {
f.SetCellValue("数据统计", fmt.Sprintf("A%d", rowNum), pos)
f.SetCellValue("数据统计", fmt.Sprintf("B%d", rowNum), count)
rowNum++
}
踩过的坑和反思
说实话,我刚开始用Excelize的时候也栽过跟头,比如忘了调列宽,生成的Excel里有些长名字被截断了,看着很丑,或者单元格内容本来是数字,但存成了字符串,排序的时候出问题。
解决方法也简单:我列一下我踩过的坑和补救办法:
- 列宽问题:用
f.SetColWidth("Sheet1", "A", "G", 15)设置统一宽度,或者每个字段单独设置 - 数据类型:数字就用
SetCellInt或SetCellFloat,别全用SetCellValue,否则可能会当成字符串 - 合并单元格:如果要把“队长”的备注列合并成一行说明,用
f.MergeCell("Sheet1", "A8", "G8") - 冻结窗格:让表头始终可见,用
f.SetPanes("Sheet1", &excelize.Panes{Freeze: true, SplitCol: 0, SplitRow: 1})
这些细节说大不大,但用起来确实能让名单更专业,我后来还专门写了个函数封装这些操作,每次生成名单直接调用,省心多了。
配合数据库或API更好用
其实我真实的场景是这样的:球队有一个小型的web管理系统(也是用Go写的),教练在线填写球员信息,提交后自动生成Excel名单,用Go的http库接个API,前面贴的那段生成Excel的代码放到API里,每次POST请求进来就把最新名单刷成Excel文件,存到服务器上供下载。
这个流程自动化之后,我基本不需要手动碰Excel了,而且因为用的是纯Go库,服务器不装Office也完全没问题。有时候队友问我是不是用什么软件做的,我说:用Go写了几行代码,他们还不信。
本文来自作者[kyadmin]投稿,不代表中国·AC米兰(Milan)体育官方网站-Official Website立场,如若转载,请注明出处:http://www.yx727.com/ny/1582.html
评论列表(4条)
我是中国·AC米兰(Milan)体育官方网站-Official Website的签约作者“kyadmin”!
希望本篇文章《用Golang搞定篮球队人员名单Excel表格,这事儿我一晚上就整明白了》能对你有所帮助!
本站[中国·AC米兰(Milan)体育官方网站-Official Website]内容主要涵盖:AC米兰,ac米兰官网,AC米兰官网
本文概览:说实话,我之前一直觉得用代码操作Excel表格是件挺玄乎的事,尤其是篮球队那种几十号人的名单,光是录入姓名、年龄、位置、身高体重这些信息...