使用模板生成周報的步驟:
1、使用 docx 庫編輯模板文檔
2、將段落中的關鍵詞替換成每週需要改變的參數
3、將統計內容插入表格中
4、生成統計圖並插入模板文件
5、將模板文件另外輸出
本篇博客會涉及以下幾個知識點:
1、使用 docx 依賴編輯模板文件
2、如何替換 word 文檔中的關鍵字
3、在 word 中添加圖片
4、將統計內容插入表格
本篇博客會涉及到的依賴庫:
docx
1、使用 docx 庫打開模板文檔
此步驟會涉及到 docx 安裝以及該模塊的基本使用。
安裝
直接使用以下命令進行安裝:
sudo pip3 install docx
然後打開 python 的交互交互界面,如果出現如下錯誤:
則需要使用以下命令再安裝一次:
sudo pip3 install python-docx
然後 import docx 不報錯則表示安裝成功。
docx 文檔編輯 word 文檔
在 python3 裏,docx 編輯 word 文檔,有如下幾個方法:
每一段文字都是 paragraph,每一個表格都是 table。
編輯文字
import docx
path = "e:/test.docx"
document = docx.Document(path)
paragraphs = document.paragraphs
for para in paragraphs:
print(para.text)
這樣就打印出了每一段的文字,如果是想要替換,則是如下操作:
for para in paragraphs:
para.text = 'test'
這樣,每一段文字都會被置換成 test 字符串,如果是想要替換某個關鍵詞,在後面的操作中會涉及。
編輯表格
tables = document.tables
對於每一個表格,要涉及的操作都是每個表格內的格子,這個在後面插入數據的地方詳細講述。
因爲本文做的是使用模板,所以只講表格內字符串的替換以及插入操作,不涉及表格的添加與刪除。
以上就是本文中涉及 docx 編輯表格需要用到的一些知識點。
2、將段落中的關鍵詞替換成每週需要改變的參數
第一個步驟後中,介紹 docx 編輯文檔,直接使用
paragraph.text = 'replace string'
替換整段文字,如果是在一個段落中,模板文件需要修改的只是每個段落中的幾個參數,那麼我們如果去修改呢?
首先,我們要了解一下,每個段落的構成。
在一個段落中,這個段落並不是一個整體,而是由一個個叫做 run的東西組成。
爲什麼一個段落會分解成一個個的 run 呢,因爲在一個段落裏,每一個字符都有可能會被單獨加上一些屬性,比如字號、字體、顏色、背景等參數。
比如在第一個段落中,文本信息爲:
逐個打印出 run 的 text 文本。
而我們通過替換每個 run 中的字符,可以保留下 run 中的這些屬性,而只替換文字內容。
比如原始本文內容爲:
以下是替換方法:
test = paragraphs[2]
for run in test.runs:
if 'n' in run.text:
run.text = run.text.replace("n", str(3))
if 'hour' in run.text:
run.text = run.text.replace("hour", str(18))
然後打印出替換後的內容:
該段落中,關鍵字部分已經被替換。
3、將統計內容插入表格中
接下來介紹一下表格的基本組成結構。
每一個 table由一個個的 cell 組成,這個特點和 Python 操作 Excel 的方式有點相似,而在每一個cell裏要添加內容,可以使用到前面的 段落paragraph 以及之下的 run。
而對於每一個 cell,計數都是從0 開始,也就是說,要定位到表格的第一個格子,是 cell(0, 0)。
以下是向格子中添加內容的方法:
table = document.tables[0]
run = table.cell(0,0).paragraphs[0].add_run('this is add string')
以上代碼片段就向 table 的第一個格子添加了一段測試字符串。
如果需要將該 run 的字符設置字號大小,則使用如下代碼:
run.font.size = docx.shared.Pt(18)
4、生成統計圖並插入模板文件
要生成報表,比如折線圖,柱狀圖,餅圖等,這個內容我會另開一篇博文,這裏只講述如果插入模板文件。
在將圖片插入模板文件的過程中,嘗試了一些方法,比如直接插入,比如插入 表格的 cell 中,這就涉及幾個問題:
如何定位圖片的插入地方,插入圖片後的排版。
如果是直接通過段落,也就是 paragraph 來定位,會有一個問題,插入圖片後顯示不全,也就是說字體與圖片的懸浮問題。
當然,直接在 word 文檔中插入也有這個問題,可以通過將段落改爲 單倍行距的方式來解決。
但是通過向 table 的 cell 中插入圖片可以一次性解決這個問題。
但是需要注意一點,就是需要將表格 table 設置爲隱藏邊框。
以下是插入圖片的方法:
run = document.tables[1].cell(0, 0).paragraphs[0].add_run()
run.add_picture(image_path, width=Inches(5.25))
其中, width 這個參數是用來設置 圖片的大小。
5、將模板文件另外輸出
通過以上的操作步驟生成一個新的週報文件以後,需要將其另外輸出到一個地址,而原有模板文件不會改變。
以下是輸出操作:
document.save(document_path)