因為工作原因,需要經常往兩個word模板里填寫內容并生成新的word文件,模板大致如下圖:


老的工作流程:
打開兩個表,在表中對應位置填寫個人信息,保存。這樣一來,當需要填寫的信息比較多的時候,工作就會繁瑣。
新的工作流程:
利用python-docx編寫腳本,運行腳本-輸入個人信息-自動生成兩個word模板
腳本用到的python-docx庫的功能:
1、創建與合并表格2、添加文本3、設置文本屬性(如大小、加粗、下劃線、居中等)
安裝python-docx:
pip install python_docx
創建與合并表格
在python-docx中有表格對象(Table)。我們可以把一個表格看成M行(Row)N列(Column)的矩陣。
表格中的一個“格子”就是一個cell對象,同時它還有rows(行)和columns(列)屬性
首先創建一個新的文檔
from docx import Documentdocument = Document()
然后用Document類的add_table方法增加一個表格,其中rows是行,cols是列,style表格樣式,具體可以查看官方文檔:
table = document.add_table(rows=37,cols=13,style='Table Grid')
上述代碼就在word里插入了一個37行、13列的表格。(有37*13=481個cell)
生成的每個cell都是有“坐標”的,比如上面的表格左上角cell為(0,0),右下角cell為(36,12)
下面要做的就是合并一些cell,從而達到我們最終需要的表格
table.cell(0,0).merge(table.cell(2,2))
上述代碼就將cell(0,0)到cell(2,2)之間的所有cell合并成一個cell
這里需要注意的是,雖然每個cell都合并了,但其實它還是存在的。比如合并了(0,0)和(0,1)兩個cell,那么這個合并的cell其實就是(0,0;0,1)
如果cell較多,無法直觀的看出坐標的話,可以用下列的代碼將每個cell的坐標都標注出來,方便合并
document = Document()table = document.add_table(rows=37,cols=13,style='Table Grid')document.save('table-1.docx')document1 = Document('table-1.docx')table = document1.tables[0]for row,obj_row in enumerate(table.rows): for col,cell in enumerate(obj_row.cells): cell.text = cell.text + "%d,%d " % (row,col)document1.save('table-2.docx')
添加文本
將所有cell依次合并后,就需要向合并后的cell里添加文本。
用table的row方法可以得到一個表格的一行list其中包含了這一行的所有cell
hdr_cells0 = table.rows[0].cells
上面代碼就得到了合并表格后的第一行所有cell,然后我們用hdr_cell0[0]就可以得到合并表格后的第一行的第一個cell。用add_paragraph方法即可像cell里添加文本
hdr_cells0[0].add_paragraph('院(系)\n')
上面已經說過,合并的cell其實還是存在的。因為我所需要的表格第一個cell實際合并了(0,0)---(2,2)之間六個cell。所以hdr_cell0[0].add_paragraph其實就是向這六個cell里寫入內容。
第二個cell合并的是(0,3)---(2,6)之間的cell。所以就應該向(0,3)寫入文本,其實向這之間任一一個cell寫入文本都是可以的,所以應該是
hdr_cells0[3].add_paragraph('院')
按照上面的方法依次類推,就可以將所需表格的整體部分做成。
設置文本屬性(如大小、加粗、下劃線、居中等)
合并表格并且添加了所需文本后,下面就需要設置表格內文本的各種屬性了,比如大小、加粗、下劃線、居中等
在python-docx中,word主要有兩種文本格式等級:塊等級(block-level)和內聯等級(inline-level)。word中大部分內容都是由這兩種等級的對象組成。
段落是word文件中主要的塊對象,圖片、表、標題、列表也是塊對象
內聯對象是塊對象的組成部分塊對象的所有內容都包含在內聯對象中,一個塊對象由一個或多個內聯對象組成
run 是常用的內聯對象,例如:
p = document.add_paragraph('This is paragraph') p.add_run('bold').bold = True p.add_run(' and some ').font.size = Pt(14) p.add_run('italic.').italic = True
這個例子中一個段落(塊對象)包含三個 run(內聯對象),每一個 run 依次設置了粗體、大小、斜體三種屬性
具體設置run屬性直接用代碼說明,更詳細的請直接查閱官方文檔
from docx import Documentfrom docx.shared import Inches, Ptfrom docx.enum.text import WD_ALIGN_PARAGRAPHdocument = Document()#設置整個文檔的默認字體document.styles['Normal'].font.name = u'宋體'document.styles['Normal']._element.rPr.rFonts.set(qn('w:eastAsia'), u'宋體')p1=document.add_paragraph()#設置p1段落居中p1.paragraph_format.alignment = WD_ALIGN_PARAGRAPH.CENTER#p1段落大小p1.paragraph_format.line_spacing = Pt(25) #給p1段落添加run對象r1,并設置文本r1 =p1.add_run('添加文本\r添加文本\n')#文字大小r1.font.size = Pt(16)#粗體r1.bold = True#下劃線r1.font.underline = True
源代碼已上傳至:
https://github.com/juventusryp/python-in-life
參考鏈接: