领导有天在群里扔了个消息,说周报要统一格式,内容要详细,还要体现工作亮点。我当时在工位上正调试一个接口,看到这个消息差点把咖啡打翻。全部门二十多号人,每周五下午都在手动复制粘贴,写一堆没人看的流水账。我在座位上坐了三分钟,打开IDE,决定写个东西把这个破事自动化掉。
项目名就叫weekly_auto。我观察了部门这几周的周报存档,发现大家写的内容其实很固定。对接了哪些系统,改了多少bug,做了多少需求,剩下就是零碎的会议和文档。我决定用python的jinja2模板引擎做底层,配合pandas处理excel数据,再加上pywin32操作outlook发送邮件。这个组合足够我应付现有的周报格式。
第一步先梳理数据源。我让同事把日常记录统一到一张excel表里,列名固定成“日期、项目、类型、描述、耗时”。类型分三类:开发、排查、会议。描述写一句话就行。我写了个函数读这张表,用pandas按人分组,再把当周的数据提出来。代码大概是这样跑的:
def load_weekly_data(file_path, week_number):
df = pd.read_excel(file_path)
df['日期'] = pd.to_datetime(df['日期'])
df = df[df['日期'].dt.isocalendar().week == week_number]
grouped = df.groupby('人员')
return grouped
模板我用jinja2写了个html格式,保留公司规定的那些固定表格行。标题动态替换成“第xx周工作汇报”,表格里循环插入数据行。类型字段我用不同颜色标出来:开发类绿色,排查类橙色,会议类蓝色。这样收邮件的人一眼就能看出来这周画了多少时间在哪个方向上。我特意把描述列加了个截断逻辑,超过30个字自动加省略号,避免表格撑爆。
发送邮件这块我卡了一下。公司用的exchange邮箱,pywin32连outlook最稳。但我发现outlook的html渲染和网页不太一样,表格边框要写成border:1px solid ccc内联样式,否则收件人看到的就是一坨散架的格子。我加了个函数专门检查表格标签,把样式补全再发送。测试的时候我给自己的邮箱发了十封测试邮件,来回调了三四轮格式才算能用。
工具写完后我用pyinstaller打了个exe包。部门里有人不会装python环境,有人电脑上没有pandas,我总不能挨个配环境。exe包大概40多兆,拷贝到共享盘里,写了个简单的bat脚本双击就能运行。脚本会弹出命令行窗口,提示输入excel文件路径和当周周数。我还加了日志输出到txt,谁卡住了看一眼日志就知道是文件路径不对还是outlook没打开。
第一周试点只有三个人愿意试。他们反馈说excel里写日常记录比写周报轻松很多。以前周五下午要在邮件编辑器里憋半小时,现在五分钟填完excel,运行工具自动生成并发送。第二周有八个人加入,第三周全部门都装上了。领导后来在周会上说,这段时间周报质量提升了,内容比以前具体了。
我没有告诉领导这是自动生成的。同事们也很默契,没人去捅破这层窗户纸。后来我在工具里加了个随机延时发送的功能,每人邮件的发送时间错开五分钟,看起来更像人工写的。这个功能没写在readme里,但大家用完都给我竖大拇指。
上周隔壁组组长跑过来问我,能不能也给他们部门装一个。我说明天把excel模板发你,再加个部门字段区分就行。现在这个工具一共两百多行代码,支撑着二十多个人的周报自动生成。我花了一个周末写它,省下来的时间够我休好几个年假了。