事情是这样的,上周我侄女问我:“叔,你能不能用代码帮我生成一份体育与健康的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,包含以下几页:
- 封面页
- 课程目标页
- 运动项目分类(表格)
- 健康饮食金字塔(图文)
- 心率与运动强度(数据表格)
- 运动注意事项(列表)
- 结尾激励页
说干就干,我直接上代码,每一步都带注释,你改改数据就能跑。
第一步:新建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的示例代码——我就是在那里翻到表格用法的。

好了,我的Go版“体育与健康PPT”就生成完了,文件名老老实实躺在那儿,你如果有兴趣,今晚试试跑一下这代码,不出意外,你也能拥有一份带有表格、列表、加粗、斜体的PPT。
然后你就可以跟我侄女一样,交差了。
本文来自作者[kyadmin]投稿,不代表ac米兰官网立场,如若转载,请注明出处:http://www.milanomuse.com/jiankang/1205.html
评论列表(4条)
我是ac米兰官网的签约作者“kyadmin”!
希望本篇文章《用Golang写一份体育与健康PPT?这事儿我试着干了一下午》能对你有所帮助!
本站[ac米兰官网]内容主要涵盖:AC米兰,ac米兰中文,AC米兰官网
本文概览:事情是这样的,上周我侄女问我:“叔,你能不能用代码帮我生成一份体育与健康的PPT?”我当时想,这有啥难的,Word、PowerPoint...