说实话,我第一次用 Golang 处理篮球队人员名单 Excel 表格的时候,差点把键盘摔了,那会儿刚接手球队管理工作,教练扔给我一个 Excel 文件,里头全是队员信息——姓名、号码、位置、身高、体重、上场时间,甚至还有每个人的投篮命中率,你说这东西要是手动改,每回比赛完都得重填一遍,谁受得了?后来我琢磨着,干脆用 Go 写个小工具,自动化搞定。
为什么选 Golang 来处理篮球队人员名单?
你可能觉得,Excel 表格嘛,用 Python 不香吗?但咱得说实话,Go 的编译速度、跨平台能力,还有 标准库 里的 encoding/csv 和 encoding/json,配合第三方库 excelize,处理起球队名单来,那叫一个顺手,关键是,编译出来的二进制文件就一个,扔到教练电脑上就能跑,不用装 Python 环境,这对于咱们这种非程序员出身的球队管理员来说,简直就是救星。
篮球队人员名单 Excel 表格长啥样?
先给你看我手头这份名单的结构,这玩意儿要是搞明白了,后面写代码就顺了。
| 球员姓名 | 球衣号码 | 位置 | 身高(cm) | 体重(kg) | 场均得分 |
|---|---|---|---|---|---|
| 张三 | 7 | 控球后卫 | 185 | 78 | 6 |
| 李四 | 23 | 小前锋 | 198 | 92 | 3 |
| 王五 | 34 | 中锋 | 210 | 110 | 8 |
| 赵六 | 11 | 得分后卫 | 192 | 85 | 7 |
| 孙七 | 5 | 大前锋 | 203 | 102 | 2 |
你看,就这么简单几列,但问题是,每回比赛完都要更新场均得分,有时候还要新增队员或者移除受伤的,手动搞真的太痛苦。
用 Go 读取篮球队人员名单 Excel 表格
下面这段代码,是我自己琢磨出来的,先用 excelize 打开文件,然后遍历每一行。
package main
import (
"fmt"
"github.com/xuri/excelize/v2"
)
func main() {
f, err := excelize.OpenFile("篮球队人员名单.xlsx")
if err != nil {
fmt.Println("打开文件失败:", err)
return
}
defer f.Close()
// 获取默认工作表
sheetName := f.GetSheetName(0)
rows, err := f.GetRows(sheetName)
if err != nil {
fmt.Println("读取行失败:", err)
return
}
for i, row := range rows {
if i == 0 {
continue // 跳过标题行
}
name := row[0]
number := row[1]
position := row[2]
height := row[3]
weight := row[4]
score := row[5]
fmt.Printf("球员: %s, 号码: %s, 位置: %s, 身高: %s, 体重: %s, 场均得分: %s\n",
name, number, position, height, weight, score)
}
}
这段代码跑起来之后,就能在终端里看到所有篮球队人员名单了。不过得注意,excelize 默认把单元格内容都当成字符串来读,要是想算平均身高啥的,得用 strconv 转换一下。
往篮球队人员名单 Excel 里写入新数据
光读不行,还得能写,比如比赛完了,我要更新每个人的场均得分。
func updateScores(f *excelize.File, sheetName string) {
rows, _ := f.GetRows(sheetName)
for i, row := range rows {
if i == 0 {
continue
}
if len(row) < 6 {
continue
}
// 假设每场比赛后,得分增加 2 分(这只是个例子)
oldScore, _ := strconv.ParseFloat(row[5], 64)
newScore := oldScore + 2.0
cell := fmt.Sprintf("F%d", i+1) // 场均得分在第6列
f.SetCellValue(sheetName, cell, newScore)
}
f.Save()
}
你看,通过 SetCellValue 就能直接修改 Excel 里的数据,以后教练再让我手动改,我就把这段代码甩给他。
篮球队人员名单的排序与筛选
有时候教练想看按身高排的名单,有时候想看按得分排的,我们可以在 Go 里先把数据读到结构体里,然后排序。
type Player struct {
Name string
Number int
Position string
Height float64
Weight float64
Score float64
}
// 按身高排序
sort.Slice(players, func(i, j int) bool {
return players[i].Height > players[j].Height
})
把排好序的数据再写回 Excel,就得到一份新的人员名单了。不过说实话,我更建议直接在代码里生成一个新的工作表,比如叫“按身高排序”,然后把原表留着。
处理特殊情况:受伤球员移除
打球嘛,受伤常有,我一般会在 Excel 里加一列“状态”,如果状态是“受伤”,就自动跳过。
| 球员姓名 | 球衣号码 | 位置 | 身高 | 体重 | 场均得分 | 状态 |
|---|---|---|---|---|---|---|
| 刘八 | 15 | 控卫 | 178 | 70 | 8 | 健康 |
| 周九 | 22 | 分卫 | 190 | 88 | 4 | 受伤 |
在代码里判断一下:
if row[6] == "受伤" {
continue // 不输出到活动名单
}
这样生成的活动名单 Excel 里就不会有受伤队员了,教练拿着直接开战术会。
生成多个工作表的管理方案
我自己的做法是,一个 篮球队人员名单.xlsx 文件里放三个工作表:
- 全部人员:所有注册球员
- 活动名单:剔除受伤的
- 历史数据:每场比赛后的快照
用 Go 创建一个新工作表很简单:

f.NewSheet("活动名单")
然后把筛选后的数据写进去,这样教练每次打开 Excel,直接看“活动名单”那张表就行。
从 CSV 导入到 Excel
有时候别的球队发来的名单是 CSV 格式,用 Go 读取 CSV,再写入 Excel,也很方便。
csvRows, _ := csv.NewReader(strings.NewReader(csvData)).ReadAll()
for _, row := range csvRows {
f.SetCellValue("Sheet1", "A1", row[0])
// 等等
}
一点小坑和注意事项
用 excelize 的时候有个坑,Excel 单元格的坐标 是像 A1、B2 这样,你得算清楚行号和列号,比如第 3 行第 4 列,对应的是 D3,我刚开始老搞错,后来写了个辅助函数:
func cellCoord(row, col int) string {
colLetter := string(rune('A' + col))
return fmt.Sprintf("%s%d", colLetter, row)
}
不过说实话,有时候也不完美,比如超过 26 列就不行了,但对于篮球队人员名单来说,一般也就十来列,够用了。
带点真实感的自动化流程
现在我的流程是这样的:每次比赛结束后,把技术统计贴到 Excel 里,然后运行 Go 程序,自动更新场均得分、自动生成活动名单、自动备份历史数据,整个过程不到 3 秒,教练每次都问我:“你咋这么快?”我就笑笑不说话。
记住,excelize 库是开源的,GitHub 上能找到,文档写得挺好的,还有个叫 tealeg/xlsx 的库,不过我用 excelize 比较多,因为它支持更多 Excel 特性。
最后啰嗦一句,要是你的篮球队人员名单 Excel 表格太大,几千人那种,Go 处理起来也毫无压力,我就是从 15 个人的小球队开始的,慢慢玩熟了,后来帮好几个球队都写了类似的小工具,这玩意儿,真的能省下大把喝啤酒的时间。
本文来自作者[kyadmin]投稿,不代表678体育 - 全网热门体育赛事高清直播平台立场,如若转载,请注明出处:http://www.yuanlikao.com/nba/1689.html
评论列表(4条)
我是678体育 - 全网热门体育赛事高清直播平台的签约作者“kyadmin”!
希望本篇文章《用 Golang 搞定篮球队人员名单 Excel 表格,这事儿我熟》能对你有所帮助!
本站[678体育 - 全网热门体育赛事高清直播平台]内容主要涵盖:678体育,678体育官网,678赛事直播
本文概览:说实话,我第一次用Golang处理篮球队人员名单Excel表格的时候,差点把键盘摔了,那会儿刚接手球队管理工作,教练扔给我一个...