心路历程

朋友让我做几十份报告。数据来源于excel表格。为此,计划先手动做一个word模板,根据源数据,修改文档指定内容。查找了一些关于docx的使用方法,讲的比较多,尝试过程中也走了些弯路。所以想写一份更加清晰易懂的帮助文档。 必须要说,我是python新手,第一次发文章,主要是写给自己的笔记。

安装python-docx 包

cmd:
pip install python-docx
Tip

:

打开cmd窗口时,记得以administrator 模式打开,否则可能会提醒‘permission denied’ 导致无法安装库文件

python 替换word表格中内容并设置字体大小 用python替换word文档中的文字_下划线

word文件基础操作

关于docx库的详细使用方法,可以查看网站介绍:

官方文档

1.打开与保存文档

import docx

dir_tar_file_name = r'D:\workspace\self\Report-01.docx'

wd = docx.Document(dir_tar_file_name)

# 保存文件

wd.save(dir_tar_file_name)

docx 模块库只能处理 .docx 格式文件,如果时doc格式的,需要提前转换。

所有对文档的编辑工作需要在word关闭的状态下进行,否则会引发错误。

docx中对象类型

a. paragraph 段落对象

paragraph 很好理解,就是段落的意思。包括标题和按序号排版的内容。

举个例子

python 替换word表格中内容并设置字体大小 用python替换word文档中的文字_对象类型_02

获取paragraph的方式:

wd = docx.Document(dir_tar_file_name)

para=wd.paragraphs

print('总共有 %s 段文字' %(len(para)))

for i in para:

print(i.text)

运行结果,可以看到每一个段落分割符切分一个paragraph. 获取段落文本即其text属性。

python 替换word表格中内容并设置字体大小 用python替换word文档中的文字_用python编辑word的好处_03

新建paragraph

new_paragraph=wd.add_paragraph('新增一个段落内容')

#在段落前插入一段

add_before_para=new_paragraph.insert_paragraph_before('在刚才那段话前插入这段话')

b. table 表格对象

word中经常会有表格,以下是获取表格文本对象的方式:

tables->table->columns/rows->cells->text

tables=wd.tables

print('总共有%s个表格'%(len(tables)))

print('第一个表有%s行,%s列'%(len(tables[0].rows),(len(tables[0].columns))))

print('******按列打印*******')

for col in tables[0].columns:

for row in col.cells:

print (row.text)

print('******按行打印******')

for row in tables[0].rows:

for col in row.cells:

print(col.text)

Result:

python 替换word表格中内容并设置字体大小 用python替换word文档中的文字_对象类型_04

以下 是修改tables的常用方法:

#新建一个表格

table=rew_record.add_table(rows=2,cols=2)

#获取第二个单元格

cell=table.cell(0,1)

cell.text='填在第一行第二列'

#获取第二行单元格

second_cells=table.rows[1].cells

second_cells[0].text='一'

second_cells[1].text='二'

#新增一行

cells=table.add_row().cells

cells[0].text='1'

cells[1].text='2'

c. picture 图片对象

获取图片

docx并不擅长处理picture对象,暂时无法获取文档中的图片需要借助其他工具,知道一个思路可以借鉴:

将文档后缀改为zip,然后打开,会发现所有的图片都在word->media文件夹下,所以可以需要处理zip格式文件的方法。

添加图片

from docx.shared import Inches

#导入Inches为了调整图片尺寸,默认尺寸往往过大

#可以设置width/height

wd.add_picture(r'C:\Users\\timg1.jpg',width=Inches(1.0))

d. style 格式对象

style即文档中的段落/字体格式,style 对象对应着word中的Styles工具栏内容。如下图:

python 替换word表格中内容并设置字体大小 用python替换word文档中的文字_用python编辑word的好处_05

表格格式的name可以通过modify看到

python 替换word表格中内容并设置字体大小 用python替换word文档中的文字_对象类型_06

修改段落文本格式最简单的方法是重新给对象指定style名,和人为操作类似。所以需要提前把文本模板的格式创建并固定下来,免去后面再去更改字体或字体大小的麻烦。

方法就是在styles中,create a New style

这里面可以把style的作用域进行设置:paragraph/character/Table/List ,如果一个段落中有多种文本格式,需要使用character style。暂时不需要理解,等遇到实际问题了再回头看这句话。

python 替换word表格中内容并设置字体大小 用python替换word文档中的文字_对象类型_07

python 替换word表格中内容并设置字体大小 用python替换word文档中的文字_下划线_08

** 获取文档的所有格式**

#获取styles,注意 仅能get到文档中所使用过的类型

styles=wd.styles

for style in styles:

print(style.name)

python 替换word表格中内容并设置字体大小 用python替换word文档中的文字_用python编辑word的好处_09

获取段落,或表格的格式属性,并替换到其他格式。

#修改第二段的格式,设置为2级标题

para[1].style=styles['Heading 2']

#修改表格格式

tables[0].style=style['Table Grid']

编辑style 属性

编辑的是style的属性,不是仅仅修改指定文档的格式

修改字体大小/斜体/加粗

from docx.shared import Pt

style1.font.size =Pt(12) #设为12号字

style1.font.italic=True #斜体

style1.font.bold=True #加粗

style1.font.underline=True #下划线

段落中的多style格式处理-run 对象

如果段落中有多种格式,对paragraph.text修改会把格式覆盖掉,docx根据style类型不同将一段文字按run进行切割。

for run in wd.paragraphs[3].runs:

print(run.text)

result:

python 替换word表格中内容并设置字体大小 用python替换word文档中的文字_对象类型_10

例如:下面这段文字

python 替换word表格中内容并设置字体大小 用python替换word文档中的文字_下划线_11

把表格中的统计数据,填写到文档中,并把小于30的值加上下划线。

#需要提前设定两个style类型

if int(run.text[0:2])<=30:

run.style=styles['Style_under1']

else:

run.style=styles['Style_Nounder']

大概整理这些,有其他常见问题我再补充。