Python批量word报告(带图)【思路篇】
1. 背景
清明节的时候,正做好了心理建设要开始写一个项目结题报告,
同事突然发来了一句:“哈喽,你能代码批量出有图的报告吗?”
心情既是激动(最近沉迷python不可自拔),又是恐惧(那个结题报告感觉写不完了……),五味杂陈啊……
跟同事沟通了一下需求,感觉用python写代码两三天应该能出来吧,狠了狠心,答应下来,也算逼着自己面对这个坎吧。
其实,批量出报告,很久前就用R研究过,只是死活都卡在出不了office自带的chart对象的图,就总是经历从入门到放弃的过程……
好在同事的需求没有那么麻烦,不少数据同事也已经整理好了,于是,花了2天时间(确切的来说,是29个小时)边百度边搞出来了……
趁着程序在跑,把思路整理整理,记一记……
2. 需求
同事的需求就是希望能够出145份区纪委的分报告,里面的图可以是图片,里面需要替换的部分已经标记出来了,有的同事也已经整理好在excel中,有的还需要在python里算。
3.思路过程
1. 确定关键技术问题
明确需求后,首先确定有哪些关键技术问题需要解决:
① python根据模板生成word;
② python生成柱状图和折线+柱状组合图;
③ python将图插入word的指定位置;
④ python根据结果呈现不同表述内容;
2. 解决关键技术问题
① python根据模板生成word :根据第三方库docx-mailmerge,配合在word模板里插入MailMerge域可以实现;
image.png② python生成柱状图和折线+柱状组合图:根据第三方库matplotlib可实现,如下图效果【数据已经虚拟!】
(其实,最怕画图就是因为甲方经常会说一句“弄得好看一点”,然而,我是一直觉得我是没有审美的,就怕这种来回调了……)
pic1.png pic2.png③ python将图插入word的指定位置:
百度了一圈,发现可以指定在某个段落插入图片,但是,尝试几次,发现图片都是嵌入性,显示不全,而且也不能居中对齐。
琢磨了一下,发现可以指定位置插入表格,这样的话,可以先插入1行3列无边框的表格,再将图片插入到中间列里,这样既能解决显示不全,又能保证居中对齐了。
报告pic.png④ python根据结果呈现不同表述内容:
需求里,需要先根据选取不同组别中均值最高的组,再对该组的18个题目的均值进行排序,选出均值最高或最低的题项进行描述。共有5个组别。
例如,51岁及以上的群体XX均值最高,得分为XX分,其中,该群体在题项1的评价最高,在题项2的评价最低
。
这个就需要写循环和判断了,还得根据得分修改描述,如果有多个题项,还得写成评价最高是题项1,题项2等n个方面
。
光写这段循环和判断,边捋逻辑边写,就花了3个小时左右,缩进就缩进了5层,好在一遍写完之后,没啥大错,重点是没有发现不明白的错,最后调试成功,跑完也就花了1分多钟。
代码.png
3.其他问题(keng)
只要一个例子弄出来了,剩下的就是写循环跑出来了。
在此期间也是在坑里掉进去爬上来不少次的。
例如:
① 保证柱状图柱子的宽度不随着组别数量发生变化:通过建字典,指定不同组别数量的图的宽度不一样;
② 柱状图一共跑了800多个图,之前总是跑到一半就errorFail to allocate bitmap
,后来应该是删了fig.add_subplot(111)
,才可以都跑出来;
核查反馈回来之后,需要:
③ 柱状图的x标签需要按照选项顺序呈现:琢磨了一下,之前是先将数值replace成标签;现在是先用数值作为x轴标签,再对x轴标签进行替换就行了;
④ 标点符号全角半角的问题:这个真的是,看得我的眼睛都要瞎了……模板里有全角半角的,图片选项里有全角半角的,看了半天……花的时间最长的是,替换的数据部分,在excel是全角,到word是半角,各种排除因素,发现,原来要在word模板里对这个域<<>>
进行格式设定,最后就能保证出来的符号是全角的。
4.最后
好在最后多多少少能满足需求了,实在是个性化的就得手动改了,例如,有的分组没有数据,整个段落就得删了。好在python也可以打印出哪些报告存在这些特殊的情况,便于后续查验了。
好了,不多说了,还得去写那个项目结题报告了……一个写到怀疑人生的结题报告……
最后,实名感谢后勤部长兼政委的郑老师!给写结题报告写到怀疑人生的我做好吃的,还做思想工作!
补充:
python里“四舍五入”的坑