用Golang搞定篮球队人员名单Excel表格,这事儿其实挺有意思

说起来你可能不信,我上周帮朋友整一个篮球队的报名表,差点没被Excel折腾疯,50多号人,姓名、球衣号、位置、身高、体重、联系方式、备注...

说起来你可能不信,我上周帮朋友整一个篮球队的报名表,差点没被Excel折腾疯,50多号人,姓名、球衣号、位置、身高、体重、联系方式、备注……手动填着填着就串行了,后来一想,干嘛不用Go写个小工具?Golang处理Excel这事儿,其实没那么玄乎,只要你摸到门道,十分钟就能搞定一份漂亮的篮球队人员名单Excel表格

为什么要用代码生成Excel,而不是手打?

你肯定会想:不就一个名单吗,Excel拉一下不就完了?但实际场景里,球队人员信息往往来自不同渠道——有人微信发报名,有人填问卷星,还有人直接口头报,等最终汇总时,数据乱得跟球场上跑位似的,这时候,用Go写一段脚本,自动读数据、写Excel、还带格式,简直救命。

而且不止一次用,下赛季人员变动,改个输入文件,再跑一遍脚本,新名单就出来了,这才是自动化该有的样子。

核心工具:Excelize库

在Go里操作Excel,目前最顺手的库是Excelize(github.com/xuri/excelize/v2),它不依赖Office环境,纯Go实现,支持xlsx文件读写、样式设置、公式、图表……对付篮球队名单这种小场面,绰绰有余。

我写这篇文章用的就是 v2.8.1 版本,安装就一行:

go get github.com/xuri/excelize/v2

第一步:设计表格结构

在写代码之前,先把表格长什么样想清楚,我一般这样规划篮球队人员名单的列:

列号 字段名 示例值 备注
A 序号 1 自动递增
B 姓名 张大勇 必填
C 球衣号 23 数字
D 位置 小前锋 下拉可选
E 身高(cm) 188 整型
F 体重(kg) 82 浮点
G 手机号 13800138000 文本避免科学计数
H 入队时间 2025-03-15 日期格式
I 备注 队长 自由文本

小经验:球衣号、手机号最好设成文本格式,不然Excel可能会自作聪明把“00123”变成“123”,或者把长手机号当成科学计数,Excelize里可以通过 SetCellStr 强制写字符串。

第二步:正式开始写代码

我一般习惯把数据放在一个Go的结构体切片里,这样灵活,下面是一个简化版的示例:

package main
import (
    "fmt"
    "log"
    "github.com/xuri/excelize/v2"
)
// Player 球员信息结构体
type Player struct {
    Index     int
    Name      string
    JerseyNo  string // 球衣号当字符串处理
    Position  string
    Height    int
    Weight    float64
    Phone     string
    JoinDate  string
    Remark    string
}

这里有个小坑:Height 我用了int,Weight用了float64,原因是身高一般整厘米,体重可能有小数,如果你数据来源是字符串,记得先做类型转换,否则写到Excel时会报错或乱码。

然后初始化一些样本数据,真实场景里,这些数据可能来自JSON、数据库,甚至一个CSV文件。

func main() {
    players := []Player{
        {1, "张大勇", "23", "小前锋", 188, 82.5, "13800138000", "2025-03-15", "队长"},
        {2, "李小龙", "7", "得分后卫", 192, 85.0, "13900139000", "2025-04-01", ""},
        //... 实际会有几十条
    }
    // 创建新Excel文件
    f := excelize.NewFile()
    defer f.Close()
    // 重命名默认工作表
    sheetName := "篮球队名单"
    index, _ := f.NewSheet(sheetName)
    f.SetActiveSheet(index)
    // 设置表头样式(加粗、居中、蓝底白字)
    headerStyle, _ := f.NewStyle(&excelize.Style{
        Font: &excelize.Font{Bold: true, Size: 12, Color: "#FFFFFF"},
        Fill: excelize.Fill{Type: "pattern", Pattern: 1, Color: []string{"#4472C4"}},
        Alignment: &excelize.Alignment{Horizontal: "center", Vertical: "center"},
    })
    // 写表头
    headers := []string{"序号", "姓名", "球衣号", "位置", "身高(cm)", "体重(kg)", "手机号", "入队时间", "备注"}
    for i, h := range headers {
        cell := fmt.Sprintf("%c1", 'A'+i)
        f.SetCellValue(sheetName, cell, h)
        f.SetCellStyle(sheetName, cell, cell, headerStyle)
    }
    // 写数据行
    for idx, p := range players {
        row := idx + 2 // 从第2行开始
        f.SetCellInt(sheetName, fmt.Sprintf("A%d", row), p.Index)
        f.SetCellStr(sheetName, fmt.Sprintf("B%d", row), p.Name)
        f.SetCellStr(sheetName, fmt.Sprintf("C%d", row), p.JerseyNo) // 文本强制
        f.SetCellStr(sheetName, fmt.Sprintf("D%d", row), p.Position)
        f.SetCellInt(sheetName, fmt.Sprintf("E%d", row), p.Height)
        f.SetCellFloat(sheetName, fmt.Sprintf("F%d", row), p.Weight, 1, 64) // 1位小数
        f.SetCellStr(sheetName, fmt.Sprintf("G%d", row), p.Phone)
        f.SetCellStr(sheetName, fmt.Sprintf("H%d", row), p.JoinDate)
        f.SetCellStr(sheetName, fmt.Sprintf("I%d", row), p.Remark)
    }
    // 自动列宽(粗调)
    f.SetColWidth(sheetName, "A", "A", 8)
    f.SetColWidth(sheetName, "B", "B", 12)
    // ...其他列
    // 保存
    if err := f.SaveAs("篮球队人员名单.xlsx"); err != nil {
        log.Fatal(err)
    }
    fmt.Println("生成成功:篮球队人员名单.xlsx")
}

你看,代码量不多,但逻辑挺清晰,关键是SetCellStrSetCellInt要分清楚,别混用,我一开始踩过坑:把手机号用SetCellInt写,结果前导0全没了,13位的手机号也变成科学计数法,后来改成SetCellStr就完美了。

第三步:让表格更像“人做的”

光有数据不行,得有点样子,Excelize支持设置行高、冻结窗格、加边框、条件格式等等,下面几个锦上添花的技巧:

冻结首行

这样往下滚动时,表头一直可见,代码就一行:

f.SetPanes(sheetName, &excelize.Panes{
    Freeze: true,
    Split:  false,
    XSplit: 0,
    YSplit: 1,
})

数据行加斑马条纹

隔行变色可以让名单更好读,Excelize里通过NewStyle设置不同的填充色,然后循环里隔行应用:

evenStyle, _ := f.NewStyle(&excelize.Style{
    Fill: excelize.Fill{Type: "pattern", Pattern: 1, Color: []string{"#D9E2F3"}},
})
for idx := range players {
    row := idx + 2
    if idx%2 == 1 {
        f.SetCellStyle(sheetName, fmt.Sprintf("A%d", row), fmt.Sprintf("I%d", row), evenStyle)
    }
}

加入数据验证——位置列做成下拉菜单

防止有人乱填“中锋”写成“中疯”,可以加下拉验证:

用Golang搞定篮球队人员名单Excel表格,这事儿其实挺有意思

dvRange := excelize.NewDataValidation("D2:D100")
dvRange.SetDropList([]string{"控球后卫", "得分后卫", "小前锋", "大前锋", "中锋"})
f.AddDataValidation(sheetName, dvRange)

这样点进去直接选,省心又规范。

再深一步:从外部数据源生成名单

光手写结构体不是长久之计,实际项目中,数据可能来自:

  • JSON文件:用 encoding/json 反序列化
  • CSV文件:用标准库 encoding/csv 一行行读
  • 数据库:用 database/sql 查询,循环 Scan 到结构体
  • 微信小程序接口:HTTP请求拿到JSON,再解析

比如从JSON文件读:

file, _ := os.ReadFile("players.json")
var players []Player
json.Unmarshal(file, &players)

然后在上面那个循环里直接跑,一键出表,换一批队员,改个JSON文件就行,完全不用碰代码。

实际遇到的坑和躲坑姿势

写的过程中,还有几个琐碎但容易卡壳的点:

  • 特殊字符:队员名字里如果有“·”或者“—”,Excelize直接写没问题,但注意如果名字里带空格,最好 strings.TrimSpace 一下。
  • 日期格式SetCellStr 写入"2025-03-15"后,Excel会识别成文本,如果你想让它变成真正的日期,可以用 SetCellStyle 配合 NumFmt,但我个人觉得文本更安全,反正筛选排序都不影响。
  • 内存问题:几百人的名单,Excelize毫无压力,但如果你要生成上十万行的大表,注意用 StreamWriter 流式写入,避免内存爆掉,篮球队名单通常几十人,完全不用担心。
  • 文件覆盖:每次运行都生成同一个文件名,会覆盖旧文件,如果你要保留历史版本,可以在文件名里加时间戳,
    filename := fmt.Sprintf("篮球队名单_%s.xlsx", time.Now().Format("20060102_150405"))

不止是名单——你能扩展出什么?

其实掌握了Golang生成Excel的思路,篮球队名单只是开胃菜,你可以:

  • 自动统计各位置人数,写到另一个sheet
  • 根据身高体重自动计算BMI,添加一列健康提示
  • 给队长、副队长加个特殊颜色标记
  • 每周训练签到表也能用同样套路生成

我就顺手用这个脚本,把朋友球队的名单、赛程表、球员数据统计一股脑全生成了,后来他拿去做成队刊印刷出来,还挺像那么回事。

代码和表格的平衡

有人会说:明明Excel手动搞更快,何必写代码?但当我看到朋友在50个人的表格里改动一个球衣号,然后整列数字都乱了的时候,我就觉得自动化是有意义的,尤其是你要频繁更新、多人协作、或者对接其他系统时,代码的可重复性和准确性远超人肉操作。

而且Golang编译后就是单个可执行文件,扔给队友,双击就生成Excel,连Go环境都不用装,要是用 go build -ldflags="-H windowsgui" 编译,连控制台窗口都不弹,球队里不懂技术的哥们双击一下,最新名单就出来了,那种感觉,比投进压哨三分还爽

最后说个题外话,我那个朋友后来问我:能不能在名单里加一列“三分命中率”?我说行啊,Excelize支持写公式,直接 f.SetCellFormula(sheetName, "J2", "=E2/F2"),Excel打开自己算,他听后,当场说我请他喝一箱红牛。

到现在红牛还没见影,但篮球队人员名单excel表格,我是再也不想手打了。

本文来自作者[kyadmin]投稿,不代表678体育 - 全网热门体育赛事高清直播平台立场,如若转载,请注明出处:http://66weibo.cn/nba/1415.html

(2)

文章推荐

发表回复

本站作者才能评论

评论列表(4条)

  • kyadmin
    kyadmin 2026-07-21

    我是678体育 - 全网热门体育赛事高清直播平台的签约作者“kyadmin”!

  • kyadmin
    kyadmin 2026-07-21

    希望本篇文章《用Golang搞定篮球队人员名单Excel表格,这事儿其实挺有意思》能对你有所帮助!

  • kyadmin
    kyadmin 2026-07-21

    本站[678体育 - 全网热门体育赛事高清直播平台]内容主要涵盖:678体育,678体育官网,678赛事直播

  • kyadmin
    kyadmin 2026-07-21

    本文概览:说起来你可能不信,我上周帮朋友整一个篮球队的报名表,差点没被Excel折腾疯,50多号人,姓名、球衣号、位置、身高、体重、联系方式、备注...

    联系我们

    工作时间:周一至周五,9:30-18:30,节假日休息

    关注我们