因为工作原因,需要经常往两个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 Document

document = 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其中包含了这一行的所有cellhdr_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_PARAGRAPH

document = 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