1. 背景
清明節(jié)的時(shí)候复凳,正做好了心理建設(shè)要開(kāi)始寫一個(gè)項(xiàng)目結(jié)題報(bào)告菌羽,
同事突然發(fā)來(lái)了一句:“哈嘍升略,你能代碼批量出有圖的報(bào)告嗎兵迅?”
心情既是激動(dòng)(最近沉迷python不可自拔)泰讽,又是恐懼(那個(gè)結(jié)題報(bào)告感覺(jué)寫不完了……)例衍,五味雜陳啊……
跟同事溝通了一下需求昔期,感覺(jué)用python寫代碼兩三天應(yīng)該能出來(lái)吧,狠了狠心佛玄,答應(yīng)下來(lái)硼一,也算逼著自己面對(duì)這個(gè)坎吧。
其實(shí)梦抢,批量出報(bào)告般贼,很久前就用R研究過(guò),只是死活都卡在出不了office自帶的chart對(duì)象的圖奥吩,就總是經(jīng)歷從入門到放棄的過(guò)程……
好在同事的需求沒(méi)有那么麻煩哼蛆,不少數(shù)據(jù)同事也已經(jīng)整理好了,于是霞赫,花了2天時(shí)間(確切的來(lái)說(shuō)腮介,是29個(gè)小時(shí))邊百度邊搞出來(lái)了……
趁著程序在跑,把思路整理整理端衰,記一記……
2. 需求
同事的需求就是希望能夠出145份區(qū)紀(jì)委的分報(bào)告叠洗,里面的圖可以是圖片,里面需要替換的部分已經(jīng)標(biāo)記出來(lái)了旅东,有的同事也已經(jīng)整理好在excel中灭抑,有的還需要在python里算。
3.思路過(guò)程
1. 確定關(guān)鍵技術(shù)問(wèn)題
明確需求后抵代,首先確定有哪些關(guān)鍵技術(shù)問(wèn)題需要解決:
① python根據(jù)模板生成word腾节;
② python生成柱狀圖和折線+柱狀組合圖;
③ python將圖插入word的指定位置荤牍;
④ python根據(jù)結(jié)果呈現(xiàn)不同表述內(nèi)容案腺;
2. 解決關(guān)鍵技術(shù)問(wèn)題
① python根據(jù)模板生成word :根據(jù)第三方庫(kù)docx-mailmerge,配合在word模板里插入MailMerge域可以實(shí)現(xiàn)参淫;
② python生成柱狀圖和折線+柱狀組合圖:根據(jù)第三方庫(kù)matplotlib可實(shí)現(xiàn)救湖,如下圖效果【數(shù)據(jù)已經(jīng)虛擬!】
(其實(shí)涎才,最怕畫圖就是因?yàn)榧追浇?jīng)常會(huì)說(shuō)一句“弄得好看一點(diǎn)”鞋既,然而,我是一直覺(jué)得我是沒(méi)有審美的耍铜,就怕這種來(lái)回調(diào)了……)
③ python將圖插入word的指定位置:
百度了一圈邑闺,發(fā)現(xiàn)可以指定在某個(gè)段落插入圖片,但是棕兼,嘗試幾次陡舅,發(fā)現(xiàn)圖片都是嵌入性,顯示不全伴挚,而且也不能居中對(duì)齊靶衍。
琢磨了一下灾炭,發(fā)現(xiàn)可以指定位置插入表格,這樣的話颅眶,可以先插入1行3列無(wú)邊框的表格蜈出,再將圖片插入到中間列里,這樣既能解決顯示不全涛酗,又能保證居中對(duì)齊了铡原。
④ python根據(jù)結(jié)果呈現(xiàn)不同表述內(nèi)容:
需求里,需要先根據(jù)選取不同組別中均值最高的組商叹,再對(duì)該組的18個(gè)題目的均值進(jìn)行排序燕刻,選出均值最高或最低的題項(xiàng)進(jìn)行描述。共有5個(gè)組別剖笙。
例如卵洗,51歲及以上的群體XX均值最高,得分為XX分枯途,其中忌怎,該群體在題項(xiàng)1的評(píng)價(jià)最高,在題項(xiàng)2的評(píng)價(jià)最低
酪夷。
這個(gè)就需要寫循環(huán)和判斷了,還得根據(jù)得分修改描述孽惰,如果有多個(gè)題項(xiàng)晚岭,還得寫成評(píng)價(jià)最高是題項(xiàng)1,題項(xiàng)2等n個(gè)方面
勋功。
光寫這段循環(huán)和判斷坦报,邊捋邏輯邊寫,就花了3個(gè)小時(shí)左右狂鞋,縮進(jìn)就縮進(jìn)了5層片择,好在一遍寫完之后,沒(méi)啥大錯(cuò)骚揍,重點(diǎn)是沒(méi)有發(fā)現(xiàn)不明白的錯(cuò)字管,最后調(diào)試成功,跑完也就花了1分多鐘信不。
3.其他問(wèn)題(keng)
只要一個(gè)例子弄出來(lái)了嘲叔,剩下的就是寫循環(huán)跑出來(lái)了。
在此期間也是在坑里掉進(jìn)去爬上來(lái)不少次的抽活。
例如:
① 保證柱狀圖柱子的寬度不隨著組別數(shù)量發(fā)生變化:通過(guò)建字典硫戈,指定不同組別數(shù)量的圖的寬度不一樣;
② 柱狀圖一共跑了800多個(gè)圖下硕,之前總是跑到一半就errorFail to allocate bitmap
丁逝,后來(lái)應(yīng)該是刪了fig.add_subplot(111)
汁胆,才可以都跑出來(lái);
核查反饋回來(lái)之后霜幼,需要:
③ 柱狀圖的x標(biāo)簽需要按照選項(xiàng)順序呈現(xiàn):琢磨了一下嫩码,之前是先將數(shù)值replace成標(biāo)簽;現(xiàn)在是先用數(shù)值作為x軸標(biāo)簽辛掠,再對(duì)x軸標(biāo)簽進(jìn)行替換就行了谢谦;
④ 標(biāo)點(diǎn)符號(hào)全角半角的問(wèn)題:這個(gè)真的是,看得我的眼睛都要瞎了……模板里有全角半角的萝衩,圖片選項(xiàng)里有全角半角的回挽,看了半天……花的時(shí)間最長(zhǎng)的是,替換的數(shù)據(jù)部分猩谊,在excel是全角千劈,到word是半角,各種排除因素牌捷,發(fā)現(xiàn)墙牌,原來(lái)要在word模板里對(duì)這個(gè)域<<>>
進(jìn)行格式設(shè)定,最后就能保證出來(lái)的符號(hào)是全角的暗甥。
4.最后
好在最后多多少少能滿足需求了喜滨,實(shí)在是個(gè)性化的就得手動(dòng)改了,例如撤防,有的分組沒(méi)有數(shù)據(jù)虽风,整個(gè)段落就得刪了。好在python也可以打印出哪些報(bào)告存在這些特殊的情況寄月,便于后續(xù)查驗(yàn)了辜膝。
好了,不多說(shuō)了漾肮,還得去寫那個(gè)項(xiàng)目結(jié)題報(bào)告了……一個(gè)寫到懷疑人生的結(jié)題報(bào)告……
最后厂抖,實(shí)名感謝后勤部長(zhǎng)兼政委的鄭老師!給寫結(jié)題報(bào)告寫到懷疑人生的我做好吃的克懊,還做思想工作忱辅!
補(bǔ)充:
python里“四舍五入”的坑