用Golang写一份体育与健康PPT?这事儿我试着干了一下午

事情是这样的,上周我侄女问我:“叔,你能不能用代码帮我生成一份体育与健康的PPT?”我当时想,这有啥难的,Word、PowerPoint...

事情是这样的,上周我侄女问我:“叔,你能不能用代码帮我生成一份体育与健康的PPT?”我当时想,这有啥难的,Word、PowerPoint不都有API吗?结果一查,Python那一套库确实多,但咱是Golang选手啊,不熟那一套,那我自己写一个行不行?

说干就干,我花了整整一个下午,用Go写了一个命令行工具,愣是生成了一份PPTX文件,虽然过程磕磕绊绊,但结果居然能看,今天我就把这套“野路子”分享给你——用Golang生成体育与健康PPT,别嫌它丑,核心是自己能控制每一行代码。

为什么选Golang干这活儿?

你可能想问:PPT这种活儿,不都是PPT模板或者Python么?为啥非要跟Go过不去?

理由其实挺实在的:

  • 跨平台编译简单:写一次,Windows、Mac、Linux都能跑,我拿到学校机房Windows电脑上,直接一个exe扔过去就能用。
  • 性能够用:生成几十页PPT,Go那速度,基本秒开秒存,Python处理大文件有时候会卡一下,Go几乎没有。
  • 依赖少:我用的库就两个,gooxml和encoding/xml,不需要装Office,不需要注册任何API,干净。
  • 适合程序化内容:体育与健康这种主题,往往有很多结构化数据——比如运动项目表格、营养摄入对比、心率区间等等,Go的struct+json/yaml模板,天然适合。

不过我得说句实话:这方法对新手不太友好,你得懂一点Go基础,至少会写struct、会跑go mod,但如果你想深度定制PPT内容,尤其是批量生成不同班级、不同数据的PPT,那这套方案比手动复制粘贴爽一万倍。

准备工作:装库、建项目

打开终端,先搞一个干净的Go项目:

mkdir sports-health-ppt
cd sports-health-ppt
go mod init sports-health-ppt
go get github.com/unidoc/unioffice/...  # 或者用下面的

我实际用的是github.com/unidoc/unioffice,它可以直接创建、读取、修改PPTX文件,不需要安装任何Office软件,不过有一点要注意:这个库的某些高级功能是商业许可的,但基础的幻灯片创建、形状、文本、表格都是开源的,够用。

装完库之后,你会得到一个命令工具,也可以当库用,我选择当库用,因为我们要写代码。

核心思路:Golang怎么操作PPTX?

PPTX文件本质上是一个ZIP压缩包,里面是XML文件,unioffice这个库把XML那一层封装好了,你只需要操作Go对象:

  • Presentation:一个PPT文件
  • Slide:每一页
  • Shape:文本框、图片、形状
  • Table:表格
  • Paragraph / Run:文本段落和文字片段(支持加粗、斜体)

结构大概像这样:

// 伪代码,让你明白组织方式
pres := pptx.New()
slide := pres.AddSlide()
// 在slide上添加文本框
tb := slide.AddTextBox()
para := tb.AddParagraph()
run := para.AddRun()
run.SetText("体育与健康")
run.SetBold(true)

这个逻辑特别清晰:一页一页加,一遍一遍调,缺点是你得手动定义每一页的内容和位置、大小,所以对于长PPT,写个循环生成重复结构比手工改快一百倍。

实战:生成一份“体育与健康”PPT的完整流程

我给自己定了个目标:生成一份高中体育与健康课程入门PPT,包含以下几页:

  1. 封面页
  2. 课程目标页
  3. 运动项目分类(表格)
  4. 健康饮食金字塔(图文)
  5. 心率与运动强度(数据表格)
  6. 运动注意事项(列表)
  7. 结尾激励页

说干就干,我直接上代码,每一步都带注释,你改改数据就能跑。

第一步:新建PPT,设置主题颜色

package main
import (
    "log"
    "github.com/unidoc/unioffice/presentation"
    "github.com/unidoc/unioffice/color"
    "github.com/unidoc/unioffice/measurement"
)
func main() {
    pres := presentation.New()
    // 设置默认幻灯片尺寸为宽屏16:9
    pres.SetWidescreen()
    // 全局字体和默认颜色可以设,但更推荐每页单独控制
    // 后面的代码都基于这个pres对象
}

注意:unioffice的配色系统并不像PPT主题那么直观,但你可以在添加文本框时指定颜色,我建议直接用RGB:

run.SetColor(color.FromRGB(0x33, 0x66, 0x99))

第二步:生成封面页

封面要好看一点,我加了一个大标题框,副标题,再加一点分隔线(其实就是两个矩形)。

func makeCoverSlide(pres *presentation.Presentation) {
    slide := pres.AddSlide()
    // 标题——粗体
    tb := slide.AddTextBox()
    tb.SetWidth(measurement.Inch * 8)
    tb.SetHeight(measurement.Inch * 1.5)
    tb.SetPosition(measurement.Inch*1, measurement.Inch*1.5)
    para := tb.AddParagraph()
    para.SetAlignment(office.AlignCenter)
    run := para.AddRun()
    run.SetText("体育与健康")
    run.SetSize(44)
    run.SetBold(true)
    run.SetColor(color.FromRGB(0x1A, 0x1A, 0x2E))
    // 副标题
    tb2 := slide.AddTextBox()
    tb2.SetWidth(measurement.Inch * 6)
    tb2.SetPosition(measurement.Inch*2, measurement.Inch*3.5)
    para2 := tb2.AddParagraph()
    para2.SetAlignment(office.AlignCenter)
    run2 := para2.AddRun()
    run2.SetText("强健体魄,赢在未来")
    run2.SetSize(24)
    run2.SetItalic(true)
    run2.SetColor(color.FromRGB(0x55, 0x55, 0x55))
}

封面的关键就是大字号+居中,我试了几次发现,位置参数得靠猜(测量单位是英寸确实反人类),建议你生成后预览调整。

一个坑:文本框默认没有背景,最好加一个底色,不然白色背景上读白字就悲剧了。

第三步:课程目标页——使用列表

这一页我用了无序列表,unioffice里列表其实就用多个段落,加一个项目符号字符。

func makeObjectiveSlide(pres *presentation.Presentation) {
    slide := pres.AddSlide()
    // 小标题
    tb := slide.AddTextBox()
    tb.SetWidth(measurement.Inch * 8)
    tb.SetPosition(measurement.Inch*1, measurement.Inch*0.5)
    para := tb.AddParagraph()
    run := para.AddRun()
    run.SetText("课程目标")
    run.SetSize(28)
    run.SetBold(true)
    // 目标列表
    objectives := []string{
        "掌握至少三项球类运动的基本规则与技巧",
        "学会制定个人运动计划并评估效果",
        "理解营养膳食与运动的关系",
        "养成每日运动30分钟的习惯",
        "提升团队协作与运动安全意识",
    }
    tb2 := slide.AddTextBox()
    tb2.SetWidth(measurement.Inch * 7)
    tb2.SetPosition(measurement.Inch*1.5, measurement.Inch*1.5)
    for _, obj := range objectives {
        para2 := tb2.AddParagraph()
        para2.SetSpacing(measurement.Point*12, measurement.Point*12)
        // 项目符号——直接用Unicode字符
        run2 := para2.AddRun()
        run2.SetText("• " + obj)
        run2.SetSize(18)
        run2.SetColor(color.FromRGB(0x33, 0x33, 0x33))
    }
}

这样生成的效果就是带圆点列表,如果想用编号列表,换成“1.”,“2.”就行,不用依赖库的自带列表功能,因为那玩意儿我用了几次没成功,干脆自己写。

第四步:运动项目分类——表格

体育PPT怎么能没有表格?田径、球类、体操、水上……我用unioffice的表格API做了个3x6的表格。

func makeSportsTableSlide(pres *presentation.Presentation) {
    slide := pres.AddSlide()
    // 标题
    tb := slide.AddTextBox()
    tb.SetWidth(measurement.Inch * 8)
    tb.SetPosition(measurement.Inch*1, measurement.Inch*0.3)
    para := tb.AddParagraph()
    run := para.AddRun()
    run.SetText("主要运动项目分类")
    run.SetSize(26)
    run.SetBold(true)
    // 表格:4行(标题+3行数据),3列(类别、项目、特点)
    table, err := slide.AddTable(4, 3)
    if err != nil {
        log.Fatal(err)
    }
    table.SetWidth(measurement.Inch * 8)
    table.SetPosition(measurement.Inch*1, measurement.Inch*1.2)
    // 设置表头
    headers := []string{"类别", "代表项目", "核心特点"}
    for i, h := range headers {
        cell := table.Cell(0, i)
        cell.SetText(h)
        cell.SetFontSize(14)
        cell.SetFontBold(true)
        cell.SetBackgroundColor(color.LightGray)
    }
    // 填充数据
    data := [][]string{
        {"球类", "篮球、足球、排球", "团队配合,全身运动"},
        {"田径", "短跑、跳高、铅球", "爆发力与速度"},
        {"体操", "单杠、自由体操", "柔韧性,身体控制"},
    }
    for r, row := range data {
        for c, val := range row {
            cell := table.Cell(r+1, c)
            cell.SetText(val)
            cell.SetFontSize(12)
            cell.SetBackgroundColor(color.White)
        }
    }
    // 调整列宽
    for i := 0; i < 3; i++ {
        table.Column(i).SetWidth(measurement.Inch * 2.5)
    }
}

这个表格生成出来跟PPT里的表格外观上差不多,但默认风格很朴素,你可以手动给表头加个底色,给表格边框设细线,unioffice支持边框,但代码量大,这里为了简洁我只设了背景色。

如果你是强迫症,想弄好看点,建议做好基础框架之后,再统一调整边框:

table.SetStyle(office.StyleLightShading)

但官方库的Style枚举少得可怜,试了一圈也就Shading还算能用。

第五步:心率与运动强度——数据表格 + 强调

这一页我放了一个“运动心率区间”表,再加一句斜体强调语。

func makeHeartRateSlide(pres *presentation.Presentation) {
    slide := pres.AddSlide()
    // 标题
    tb := slide.AddTextBox()
    tb.SetWidth(measurement.Inch * 8)
    tb.SetPosition(measurement.Inch*1, measurement.Inch*0.3)
    para := tb.AddParagraph()
    run := para.AddRun()
    run.SetText("运动心率与强度")
    run.SetSize(26)
    run.SetBold(true)
    // 表格:5行2列
    table, _ := slide.AddTable(5, 2)
    table.SetWidth(measurement.Inch * 6)
    table.SetPosition(measurement.Inch*1.5, measurement.Inch*1.5)
    headers2 := []string{"强度级别", "目标心率 (次/分钟)"}
    for i, h := range headers2 {
        cell := table.Cell(0, i)
        cell.SetText(h)
        cell.SetFontBold(true)
        cell.SetBackgroundColor(color.FromRGB(0xCC, 0xDD, 0xFF))
    }
    rows := [][]string{
        {"低强度", "120-140"},
        {"中强度", "140-160"},
        {"高强度", "160-180"},
        {"极限", "180以上"},
    }
    for i, row := range rows {
        for j, val := range row {
            table.Cell(i+1, j).SetText(val)
        }
    }
    // 强调行——斜体
    emphasis := slide.AddTextBox()
    emphasis.SetWidth(measurement.Inch * 7)
    emphasis.SetPosition(measurement.Inch*1.5, measurement.Inch*4.5)
    paraE := emphasis.AddParagraph()
    runE := paraE.AddRun()
    runE.SetText("* 建议从低强度开始,逐步适应后再提升强度")
    runE.SetItalic(true)
    runE.SetColor(color.FromRGB(0x77, 0x77, 0x77))
    runE.SetSize(14)
}

这里用到的斜体在PPT里看起来就是稍微倾斜的字体,强调效果明显。

第六步:运动注意事项——带编号的列表

运动安全很重要,我用了手动编号列表:

func makeSafetySlide(pres *presentation.Presentation) {
    slide := pres.AddSlide()
    tb := slide.AddTextBox()
    tb.SetWidth(measurement.Inch * 8)
    tb.SetPosition(measurement.Inch*1, measurement.Inch*0.5)
    para := tb.AddParagraph()
    run := para.AddRun()
    run.SetText("运动安全注意事项")
    run.SetSize(26)
    run.SetBold(true)
    notes := []string{
        "运动前充分热身10-15分钟",
        "穿着合适的运动鞋服,避免受伤",
        "运动过程中适量补水,少量多次",
        "出现头晕、胸闷立即停止并休息",
        "运动后做拉伸放松,缓解肌肉紧张",
    }
    tb2 := slide.AddTextBox()
    tb2.SetWidth(measurement.Inch * 7)
    tb2.SetPosition(measurement.Inch*1.5, measurement.Inch*1.8)
    for i, note := range notes {
        p := tb2.AddParagraph()
        p.SetSpacing(measurement.Point*10, measurement.Point*10)
        r := p.AddRun()
        r.SetText(fmt.Sprintf("%d. %s", i+1, note))
        r.SetSize(16)
        r.SetColor(color.FromRGB(0x22, 0x22, 0x22))
    }
}

这里又用了加粗和正常字体的内容,配合编号,结构一目了然。

第七步:结尾激励页

最后放一句简单的话,字体调大,居中,带一点底色。

func makeEndSlide(pres *presentation.Presentation) {
    slide := pres.AddSlide()
    // 全屏文本框,居中
    tb := slide.AddTextBox()
    tb.SetWidth(measurement.Inch * 8)
    tb.SetHeight(measurement.Inch * 3)
    tb.SetPosition(measurement.Inch*1, measurement.Inch*2)
    para := tb.AddParagraph()
    para.SetAlignment(office.AlignCenter)
    run := para.AddRun()
    run.SetText("运动让生命更精彩")
    run.SetSize(40)
    run.SetBold(true)
    run.SetColor(color.FromRGB(0xFF, 0xA5, 0x00)) // 橙色
    para2 := tb.AddParagraph()
    para2.SetAlignment(office.AlignCenter)
    run2 := para2.AddRun()
    run2.SetText("坚持运动,拥抱健康每一天")
    run2.SetSize(22)
    run2.SetColor(color.FromRGB(0x66, 0x66, 0x66))
}

这一页虽然简单,但视觉上很稳,我试过加一张背景图,但unioffice的图片插入较复杂,容易变形,所以放弃了。

最后一步:保存

所有幻灯片加完后,保存:

func main() {
    pres := presentation.New()
    pres.SetWidescreen()
    makeCoverSlide(pres)
    makeObjectiveSlide(pres)
    makeSportsTableSlide(pres)
    makeHeartRateSlide(pres)
    makeSafetySlide(pres)
    makeEndSlide(pres)
    err := pres.SaveToFile("体育与健康.pptx")
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println("✅ PPT生成成功:体育与健康.pptx")
}

直接go run打包,不出意外几秒后文件夹里就多了一个pptx文件,双击打开,内容全在,排版虽然比不上专业模板,但数据和结构完全可控

图片”的问题

原计划想插入一两张运动相关的图片(比如一张跑步剪影、一张膳食金字塔),但我试了unioffice的AddImage方法,发现图片坐标和尺寸非常难调,而且缩放容易失真,我花了半小时调了一张,结果看起来像是被门挤过的,干脆,文字+表格,干净利落。

如果你擅长手动调坐标,也能搞定,大致写法是:

img, _ := slide.AddImage("running.png")
img.SetPosition(measurement.Inch*2, measurement.Inch*2)
img.SetWidth(measurement.Inch*4)
img.SetHeight(measurement.Inch*3)

但不同图片分辨率不一样,你得反复调,我更建议直接在PowerPoint里手动加图,保留代码生成文字框架——这是最务实的组合。

改进空间:从“能看”到“好看”

我生成的这份PPT,说实话,只能算60分及格

  • 字体默认是Calibri,我想改成微软雅黑,但是unioffice设置中文字体需要额外嵌入,不然换台电脑就乱码,我直接放弃了字体定制,用Calibri配合大字号。
  • 配色比较单调:蓝色+灰色+橙色,你可以自己定义一套主题色,比如体育类可以红+黑+白。
  • 没有动画和转场——这些API unioffice支持,但我不建议用,Go生成PPT的目标是快速产出内容,动画在代码里很难调出效果,还不如在PowerPoint后期加。

如果你愿意折腾,还可以把内容从YAML/JSON文件读入,这样就可以不修改代码,直接换数据生成不同的PPT。

比如写一个config.yaml:

objectives:
  - 掌握三大球基本技术
  - 制定个人运动计划
  ...

然后在Go里读取yaml,循环生成,这样一份代码,批量生成几十个班的PPT,效率直接起飞。

为什么推荐你试试这条路?

我见过太多老师、教练,为了做一份体育健康PPT,套模板改格式改到半夜,或者用WPS手机版一根手指戳半天,而用Golang,你只需要维护一份代码(或配置),哪怕版权信息、LOGO、二维码需要统一修改,改一行代码,全部PPT自动更新。

代价是你要花一个下午去写代码,但如果你每年都要做这种PPT,一次投入长期受益,非常划得来。

如果你完全不懂编程,这条路不通,建议你还是用回PPT模板,别跟自己过不去,但如果你已经入了Go的坑,或者正想练手,这绝对是一个有趣又有用的小项目

最后的最后,我得说一句:unioffice的API文档写得有点简略,很多功能我得读源码才知道,所以遇到报错别慌,把错误信息贴到GitHub Issues里,或者去搜unioffice的示例代码——我就是在那里翻到表格用法的。

用Golang写一份体育与健康PPT?这事儿我试着干了一下午

好了,我的Go版“体育与健康PPT”就生成完了,文件名老老实实躺在那儿,你如果有兴趣,今晚试试跑一下这代码,不出意外,你也能拥有一份带有表格、列表、加粗、斜体的PPT。

然后你就可以跟我侄女一样,交差了。

本文来自作者[kyadmin]投稿,不代表ac米兰官网立场,如若转载,请注明出处:http://www.milanomuse.com/jiankang/1205.html

(10)

文章推荐

发表回复

本站作者才能评论

评论列表(4条)

  • kyadmin
    kyadmin 2026-07-16

    我是ac米兰官网的签约作者“kyadmin”!

  • kyadmin
    kyadmin 2026-07-16

    希望本篇文章《用Golang写一份体育与健康PPT?这事儿我试着干了一下午》能对你有所帮助!

  • kyadmin
    kyadmin 2026-07-16

    本站[ac米兰官网]内容主要涵盖:AC米兰,ac米兰中文,AC米兰官网

  • kyadmin
    kyadmin 2026-07-16

    本文概览:事情是这样的,上周我侄女问我:“叔,你能不能用代码帮我生成一份体育与健康的PPT?”我当时想,这有啥难的,Word、PowerPoint...

    联系我们

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

    关注我们