首先介绍一下赛事背景,因为这是一场马拉松接力赛,正常马拉松全程是42.195公里,如果把它办成一场接力赛。一个队伍6个人,每个人需要跑7公里。而在我们区里,正好有这样的一个U字形场地,来回一圈刚刚好是7公里左右。
基本情况介绍完了之后,再看看老师安排的需求:
需求明确之后,就可以开始设计表格了。先填入所有需要记录的关键信息,如下图所示。
其中跑团战队名称、姓名、性别前面三项是固定的,在此之前已经通过其他表格收集了这些信息,所以现在要做的,就是将这三项信息复制进来,得到以下结果。
由于每个战队都是6名队员,所以号码编排就是用「队伍序号+棒次序号」即可。在第一个号码中填入0101,但是会发现0101被Excel识别为了数字,而自动忽略了前面的0,所以点击第2列上面的B,按下+1,调整整列单元格的格式,将它设置为文本,并重新输入就可以正常显示0101了。
然后拉到0106,之后如法炮制再生成到0206,本以为这样选中两大组数据之后,Excel就能根据这个规则自动生成其他号码,但是经过测试发现只会在0101到0206之间循环,并没有按照预期结果生成序号。
=INDIRECT(ADDRESS(ROW(),5))公式演变过程如下图所示,先获取到了$E$3绝对地址,再通过INDIRECT()间接访问$E$3获取到01:12:09。
IF(判断语句,结果为真的表达式,结果为假的表达式)对于后面两个表达式,在上文中已经给出了答案。现在的问题又转为了,如何构造判断语句?显然这是一道送分题,只需要将上文的知识点,将列号替换一下即可。在Excel表格中队名所对应的列号是1,所以就可以构造出如下的判断语句:
所以此处还可以进行一下优化,对IF语句后面两个表达式进行修改,只有当前行不为空,才进行减法计算,否则返回空值。重复利用上面提到的知识点,构造出如下的公式:
到此为止,表格的制作终于可以暂告一个段落,删除所有测试数据,得到一张干净的参赛运动员表格,等到了比赛的时候直接拿到现场使用即可。接下来要做的工作是制作成绩证书。
棒次表,可以看出「秀屿健跑一队」是毫无疑问的冠军。
计时表,可以看出第一名和最后一名,整整差了一个小时之多。
当比赛完成后,就要开始输出四项排名了,分别是:个人排名、团队排名、男子排名、女子排名。使用Excel的高级筛选功能,就可以很简单地实现这个需求,接下来就来看看具体是如何操作。
RANK(number,ref,[order])Number是需要排序的数据,ref是全体的数据,其中[order]参数有0和1两种选项,0是降序,1是升序,默认是使用降序。如下图所示,是比赛全部完成后的成绩表格。以用时作为排序的依据,用时在第6列,采用升序的方式排列。
在功能栏上选择「数据>高级」,点击打开高级筛选。选择第二个「将筛选结果复制到其他位置」,可以看到此处要求输入「列表区域」和「条件区域」两个参数。列表区域,也就是筛选运动员们的成绩已经有了。但是还差个条件区域,所以暂时关闭该窗口,在Excel表格中创建一个条件区域。
筛选区域制作好后,就可以使用高级筛选,选择出合适的数据了。点击区域选择框后面的「选择」图标,就可以手动选择区域,免去了手动输入的麻烦。还有一点要注意的是,选择区域的时候要连表头一起选择,否则会导致筛选不到数据。筛选得到的数据如下图所示。
但是此时数据是未排序状态,所以需要对其进行排序。此时再使用RANK()函数排序,是不太合适的。为了让运动员们可以更直观地看出队伍排名,需要直接对行进行排序。,选择所有团队,点击「数据>排序」,列条件选择「团队总成绩」,顺序按照「升序」排列,点击「确定」即可完成排序。
排序完成后的数据如下所示,排序完成后,就是简单的数据清理工作了。保留跑团名称和总成绩,删除不必要的列,增加一个团队总成绩表头,增加一个团队排名的递增序列。
最终效果如下图所示:
用类似的方法,制作男/女个人排名。如下图绿色区域所示,重新设置筛选条件区域,表头设置为「性别」,下方单元格改为「男」,重新进行高级复制筛选,得到如图中O到U列的效果。
同样适用数据中的排序功能,对全部的男运动员成绩排序,删除无用的两个序列,并在最后添加名为「男子排名」的递增数列即可。
修改筛选性别为女,重复以上两个步骤,生成女子排名。
最后得到如下所示的四种排名:
在上个步骤中已经生成好了四种排名,但对于大量数量的表格,没有隔行变色的话,会让阅读者查看数据的时候较为麻烦,可能会出现对错数据的情况。所以可以在此基础上,添加隔行变色样式。
选中需要隔行变色的表,在功能栏的「开始」菜单下,点击「套用表格格式」,选择合适的样式。此处有一个小技巧,可以提高选表的效率,点击表中任意单元格,再按下command+A全选,即可选择出所属的大表。
间隔变色设置好之后,效果如下图所示,重复以上步骤,对剩余的三个表格进行同样操作。
在表格发在群里之后,有人问说:只看到了个人成绩,其他几个排名成绩在哪里呢?看了一下,才知道原来是只顾着上下滑动,忘记了左右滑动也有表格了。为了从源头上解决这个问题,而不是在群里不停地解释,可以对四个表格进行分表。
将制作好的证书模版导出JPG图片,添加电子签名。此处可以使用预览中的签名功能,选择在iPhone上进行签名,因为在iPhone上签名是可以显示字的。如果使用触控板签名的话,那就是手指对着触控板盲签,笔画上可能会产生一些偏移,导致签名不那么好看。如果有ApplePencil的话,可以得到更好的签名效果。
在签名完成后,将电子签名添加到成绩证书模版上,这样一份正式的成绩证书模版就制作好了。
使用sys从命令行的第一个参数读取成绩记录,第二个参数设置男子组or女子组。在第一版的代码中,原先是没有第二个参数的,在实际赛后制作成绩证书的时候,忘记把组别进行修改,导致第一版的成绩证书组别错误。所以为了从根本上解决这个问题,直接将组别设置为了命令行参数。
访达中对应显示的文件名,就是在Python代码中需要使用的文件名,例如下图中的PingFang.ttc,只要将它连同后缀名一起填入即可。
生成的成绩证书如下图所示,效果还是比较好的。
上一小节中以及生成好了各种成绩排名,接下来就是根据拍卖信息,生成电子成绩证书了。不要包括表头,选中排名成绩表,复制到剪切板。
新建纯文本文件,保存到Certificate.py相同目录下即可。最后得到如下所示的目录结构,Certificate.py会读取man.txt里的内容,使用template.jpg作为模版,读取每行的内容添加到template.jpg,并保存为相应的运动员名字。
根据第二小节介绍的Python脚本原理,在命令行中切换到Certificate.py文件所在目录。并使用以下命令格式生成成绩证书:
随便挑选两张查看,效果如下:
男子组制作好之后,就是女子组了,但是在此之前需要对图片进行打包,以免和接下来生成的女子组混在一起。部分对macOS比较熟悉的用户可能知道,如果是使用右键对文件进行压缩,在其他平台上接收文件,可能会多出一个_MACOS的文件夹,该文件下包含了一些元信息,如果不想生成这个多余的文件夹,可以使用终端里的zip命令进行打包。命令格式是:zip压缩包名.zip压缩文件名。
所以直接在目录下使用如下命令进行压缩打包:
pbpaste>woman.txtpython3Certificate.pywoman.txt女子组zip女子组成绩证书.zip*.pngrm*.png最后生成好的zip压缩包发在运动员群里,搞定收工。
本次协办这场赛事,让作者从0入门开始学习了一点Excel,也真正认识到了Excel的强大之处。之前都是道听途说,这次终于是有了实际体验。以后还有类似的需求,必定也是找Excel实现。本文以0基础的Excel新手的视角,配合编程的思维,逐级递进地介绍了如何编写复杂的Excel公式。希望读者在以后有实际类似需求的时候,也可以通过Google+官方文档的方式,逐渐实现自己的需求。
除了技术上的收获,在这次赛事中也感受到了大家对运动的热情。作者日常也是个骑行爱好者,前年参加了海洋杯国际自行车公开赛,虽然是骑游组去游玩为主的,但是很被那种运动的气氛所感染。由于疫情,已经两年半没有大型赛事可办了。这次久违的中型比赛,让作者又体验了当年赛事的热闹气氛,所以也打算接下来试着开始跑跑步,换点新的运动方式。
本文也算是对本次协办赛事的总结,实际跑一遍流程之后,发现很多可以改进的地方。例如上面的细节优化这部分,就是在全部结束之后,大家有反馈过来一些问题,才想起来要这么做。相信经过这次的实践,明年的比赛技术支持会做地更好。比如以下几个点可以改进或者升级: