背景
最近在做客戶端性能測試的提效工作,會把當前版本的性能數(shù)據(jù)與上個版本的性能數(shù)據(jù)進行對比奕污,然后把對比結(jié)論以及數(shù)據(jù)萎羔,放到docx文檔上,自動生成一個性能報告碳默,就學習了相關Python-docx的相關操作贾陷,記錄如下。
基本介紹
python-docx 是用于創(chuàng)建可修改 微軟 Word 的一個 python 庫嘱根,提供全套的 Word 操作髓废,是最常用的 Word 工具「檬悖可以對文檔進行更改慌洪,包含段落、分頁符凑保、表格冈爹、圖片、標題欧引、樣式等幾乎所有的word文檔中能常用的功能都包含了频伤。只能解析docx文件,解析不了doc文件芝此。python-docx
將整個文章看做是一個Document
對象憋肖,其基本結(jié)構(gòu)如下:
- 每個
Document
包含許多個代表“段落”的Paragraph
對象,存放在document.paragraphs
中 - 每個
Paragraph
都有許多個代表"行內(nèi)元素"的Run
對象婚苹,存放在paragraph.runs
基本的一些使用
from docx import Document as Doc
from docx.document import Document
import os
doc: Document = Doc()
word_path = os.getcwd()
doc.save(os.path.join(word_path, 'demo.docx'))
上面代碼岸更,我們引入python-docx 最核心的對象Document,它對應的就是一個word文件膊升,可以通過這個對象來操作word里的一切內(nèi)容怎炊。
- 標題
doc.add_heading(text="一級標題", level=1)
doc.add_heading(text="二級標題", level=2)
text參數(shù)制定標題的文字,level制定標題的級別廓译,一級標題還是二級標題结胀,如果level等于0,標題就會當做文檔的title责循,level支持1-9個級別。
- 段落
doc.add_paragraph("測試段落一")
paragraph = doc.add_paragraph()
paragraph.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
run = paragraph.add_run("測試段落二")
run.bold = True
run.font.name = u'宋體'
添加段落有兩種方式攀操,如上:使用doc.add_paragraph("測試段落一")
直接添加院仿,另一種通過add_run來添加,同時可以操作文字的各種屬性,比如粗體歹垫、字體剥汤、顏色等等
本文重點操作表格
創(chuàng)建
table = doc.add_table(2, 3, style="Table Grid")
調(diào)用add_table
方法,并傳入行數(shù)和列數(shù)排惨,即可完成一個表格的創(chuàng)建吭敢,如下圖:
添加表頭
['場景', '版本', '內(nèi)存', 'CPU', '卡頓數(shù)', 'GPU']假設我們的表頭內(nèi)容存放再這樣一個列表中
columns = ['場景', '版本', '內(nèi)存', 'CPU', '卡頓數(shù)', 'GPU']
table = doc.add_table(1, len(columns), style="Table Grid")
for i in range(len(columns)):
row = table.rows[0]
row.cells[i].text = columns[i]
根據(jù)表頭的長度來確定表格有多少列,目前我們還不知道有多少行暮芭,就只需要添加一行就可以鹿驼。
table.rows可以獲取所有行,row.cells可以行內(nèi)所有的單元格辕宏,然后通過給text屬性賦值就可以完成單元格內(nèi)容的填充畜晰。效果如下:
表頭的內(nèi)容我們一般都需要加個背景色,讓整體排版更好看一下
columns = ['場景', '版本', '內(nèi)存', 'CPU', '卡頓數(shù)', 'GPU']
table = doc.add_table(1, len(columns), style="Table Grid")
for i in range(len(columns)):
row = table.rows[0]
row.cells[i].text = columns[i]
shading = parse_xml(r'<w:shd {} w:fill="{bgColor}"/>'.format(nsdecls('w'), bgColor='129563'))
row.cells[i]._tc.get_or_add_tcPr().append(shading)
通過xml來定義一個背景色瑞筐,然后再通過調(diào)用get_or_add_tcPr凄鼻,這樣添加北京色就成功了。
溫馨提示:
shading = parse_xml(r'<w:shd {} w:fill="{bgColor}"/>'.format(nsdecls('w'), bgColor='129563'))
這里是先解析出一個shading聚假,如果每個單元格都添加這一個shading块蚌,那么只有最后一個單元格能有背景色。所以這里需要每添加一次膘格,都要重新解析一次峭范。
合并單元格
舉個栗子,比如我們添加了四行闯袒,想把每行的第一列進行合并虎敦,代碼如下:
a = table.add_row()
b = table.add_row()
c = table.add_row()
d = table.add_row()
d.cells[0].merge(a.cells[0])
實際的效果如下圖。這里用到了_Cell單元格對象的merge方法政敢,實現(xiàn)單元格的合并其徙,這里的0,就是第一個單元格的索引喷户。
給單元格字體添加顏色
給單元格文字添加顏色唾那,和操作段落文字的原理是一樣的,都是用run操作褪尝。代碼如下:
data = ['B站feed滑動', '6.54.0', 330, 14.5, 212, 12.5]
for i in range(len(columns)):
run = a.cells[i].paragraphs[0].add_run(str(data[i]))
run.font.color.rgb = RGBColor(255, 69, 0) # 這是紅色的RGB
效果如下:
友情提示:
注意這里給單元格添加內(nèi)容時闹获,必須字符串的形式,不然會報錯
設置頁面紙張大小
python-docx生成的文檔默認是A4的河哑,當你想改成A3或者其他大小的時候避诽,可以看看這里
document.sections[0].page_height = Cm(42) # 設置A3紙的高度
document.sections[0].page_width = Cm(29.7) # 設置A3紙的寬