python-docx是一个用于创建和更新Microsoft Word(.docx)文件的Python库。官方文档链接
使用前首先通过pip install python-docx
来安装此库。
打开一个文档
from docx import Document
document = Document()
这将打开一个基于默认“模板”的空白文档,几乎是您使用内置默认值在Word中启动新文档时获得的文档。您可以使用python-docx打开并处理现有的Word文档,但我们暂时先学习最基本的功能。
添加段落
段落是Word中的基础,它们用于正文,但也用于标题和列表项目。
这是添加一个最简单的方法:
paragraph = document.add_paragraph('这是一个段落')
可以使用一个段落作为“游标”并在其上方插入一个新段落:
prior_paragraph = paragraph.insert_paragraph_before('你好,')
这允许将段落插入文档的中间,这在修改现有文档时很重要,而不是从头开始修改。
添加标题
一般的文档,正文文本被分成几个部分,每个部分都以标题开头。以下是添加标题的方法:
document.add_heading('这是一个标题')
默认情况下,这会添加顶级标题,Word中显示为“标题1”。当您需要子节的标题时,只需指定所需的级别为1到9之间的整数:
document.add_heading('这是个标题2', level=2)
如果指定级别0,则添加“标题”段落。这可以很方便的完成了一个相对较短没有单独标题页的文档。
添加分页符
如果你需要对文档进行分页,你需要下一个文本在一个单独的页面,即使你所在页面不是完整的。
分页符可以做到这一点:
document.add_page_break()
添加表格
在word里使用的表格如何用python_docx实现呢?
表格通常由行和列组成,python_docx也一样:
table = document.add_table(rows=2,cols=2)
表具有几个属性和方法,您将需要它们来填充它们。
访问单个单元格可以按照坐标来访问,例如:
cell = table.cell(0, 1) # 取出第一行第二列的数据
注意,行和列指示是从0开始的,就像python的列表一样。
你可以通过text来给单元格添加内容:
cell.text = '这是单元格里面的内容'
通常,一次访问一行单元格更容易,
例如,先从表格中取出一行(.rows[])或是一列(.columns[]),然后就可以使用cells[]像操作列表一样操作表格。
row = table.rows[1]
row.cells[0].text = '这是单元格里面的内容'
row.cells[1].text = '这是也单元格里面的内容'
在.rows和.columns取出来的数据是可迭代的,这样你就可以直接在使用for循环对表格进行操作:
for row in table.rows:
for cell in row.cells:
print(cell.text)
如果你想获取行或列的长度,可以使用len()
row_count = len(table.rows)
col_count = len(table.colums)
你还可以使用增量的方式添加新的行
row = table.add_row()
这对于我们上面提到的可变长度表场景非常方便:
# 获取表格数据
items = (
(7, '1024', '你好'),
(3, '2042', 'hello'),
(1, '1288', 'Hola'),
)
# 添加一个表格
table = document.add_table(1, 3)
# 填充标题行
heading_cells = table.rows[0].cells
heading_cells[0].text = 'A'
heading_cells[1].text = 'B'
heading_cells[2].text = 'C'
# 给表格填充数据
for item in items:
cells = table.add_row().cells
cells[0].text = item[0]
cells[1].text = item[1]
cells[2].text = item[2]
word的表格有一组预设的表格样式,python-docx同样可以指定摆个样式:
table.style = 'LightShading-Accent1'
通过将鼠标悬停在Word的表样式库中的缩略图上,可以找到表样式名称,去掉所有的空格就是样式名称,当然首先你要切换到英文环境下。
添加图片
Word中,你可以通过插入添加图片,那python-docx是如何做到这一点的?
document.add_picture('path.png')
括号中是图片的本地路径。
你也可以使用一个类文件对象,本质上就是打开任何文件对象。如果您从数据库或网络检索图像,并且不想获取涉及的文件系统,这就很方便了。
图像大小
默认情况下,添加的图像就是原始大小。这通常比你想要的更大。要设置图像大小,您可以指出图片的宽高,如英寸或厘米:
from docx.shared import Cm, Inches
document.add_picture('path.png', width=Cm(10))
可以自由地指定宽度和高度。如果仅指定一个,python-docx会通过宽高比保持原图片比例,让图像看起来不拉伸。
段落样式
word提供了丰富的段落样式,如下图所示:
python-docx可以在你创建段落的时候,应用样式:
document.add_paragraph('这是个带样式的段落', style='ListBullet')
你也可以在添加段落后再添加样式:
paragraph = document.add_paragraph('这是个带样式的段落')
paragraph.style = 'ListBullet'
在此示例中,样式使用样式ID“ListBullet”指定。
通常,通过去除样式名称中出现在Word用户界面(UI)中的空格来形成样式ID。
所以风格’列表3号’将被指定为’ListNumber3’。
但是,咱们使用的中文版word就很难受,需要将win系统语言切换到英语,才能查看样式的英文。
粗体和斜体
关于word中的粗体和斜体大家一定不陌生
有以下四点需要了解:
- 段落样式可以应用于paragraph对象
- 字符样式可以应用于run对象
- 链接的样式可以应用于这两种对象。
- 因此,中间带有粗体字的段落需要三次运行,一次正常,一个包含该单词的粗体,另一个正常用于后面的文本。
通过向.add_paragraph()方法提供文本来添加段落时,它将被放入单个run对象中。您可以使用段落上的.add_run()方法添加更多内容:
paragraph = document.add_paragraph('段落 ')
paragraph.add_run('你好')
上面的代码会产生一个看起来很普通的段落,除非你看一下XML,否则段落文本被分成run对象的地方并不明显。请注意第一个字符串末尾的尾随空格。你需要明确在运行的开头和结尾出现空格的位置,它们不会在run对象之间自动插入。
Run对象有.bold(加粗)和.italic(倾斜)属性,您可以对run对象进行设置:
paragraph = document.add_paragraph('感谢 ')
run = paragraph.add_run('大家')
run.bold = True # 对‘大家’加粗
paragraph.add_run(' 的照顾')
其产生的文字,看起来像这样:“感谢 大家 的照顾”
如果你对run对象只进行加粗或者倾斜操作,那可以这么写:
paragraph.add_run('dolor').bold = True
这不是必须的,但是很方便:
paragraph = document.add_paragraph('感谢 ')
run = paragraph.add_run('大家').bold = True
paragraph.add_run(' 的照顾')
应用字符样式
除了段落样式,其中指定一组段落级别设置,Word有字符样式指定一组run级别的设置。
一般来说,可以将字符样式视为指定字体,包括其字体,大小,颜色,粗体,斜体等。
像段落样式,字符样式必须已经与你在打开的文档中定义的Document()调用,关于段落样式。
添加新run对象时可以指定字符样式:
paragraph = document.add_paragraph('你好 ')
paragraph.add_run('再见', 'Emphasis')
您还可以在运行创建后将样式应用于run对象。
paragraph = document.add_paragraph('你好 ')
run = paragraph.add_run('再见')
run.style = 'Emphasis'
与段落样式一样,样式名称与Word UI中显示的一样。