办公自动化是 Python 提高工作效率的应用场景之一。使用 Python 批量修改,生成以及分析 Word 文档可以节省用户很多的拖拽鼠标和敲击键盘的时间。本篇文章将会介绍如何使用 Python 来操作 Word 文档编辑中的文件读取,文件写入,标题插入,段落添加,以及图片的插入。

前言

Word 是最常用的办公软件之一,它主要用来写作和排版文档。Word 有好用的界面来帮助用户阅读和写作文件,但是仍然有一些情况下操作 Word 是重复琐碎的:

  • 当用户要批量更改 Word 文件的时候,用鼠标频繁地打开和关闭文件管理器中的 Word 文件是非常耗时且繁琐的;
  • 当用户需要根据固定内容生成多个 Word 文档的时候,重复创建文件再粘贴内容修改的过程是非常无聊的;
  • 当用户需要使用其他语言处理软件来修改 Word 的内容的时候,需要有一个软件能够读取和修改 Word 文档的内容。

Python 程序语言可以通过第三方的库来开发出多种多样的功能,其中之一就是对 Word 文档的自动化操作,包括 Word 文档内容的读取和写作。结合 Python 其他的关于自然语言处理的库,我们更可以将更多功能结合到 Word 自动化操作的过程中。这篇文章下面的内容会介绍如何使用 Python 来读和写 Word 文档。

安装python-docx

Python 中有不止一个能够读写 Word 文档的库。这里我们使用python-docx库,

pip install python-docx

读取 Word 文件

为了使用python-docx库读取 Word 文件,你需要先导入docx模块,然后创建一个Document类,把 Word 文件的路径比如word_file.docx作为参数传入 Document,这个Document对象就会读取 Word 文件的内容。这个过程的代码如下:

import docx

doc = docx.Document("./word_file.docx")

读取段落

一个 Word 文件的所有内容可以按照段落(paragraphs)划分,下面的代码展示了如何从Document对象中得到所有的段落,并且在控制台中打印出来,你可以发现一个空白行也是一个段落:

all_paras = doc.paragraphs

print("There is totally {} paragraphs.".format(len(all_paras)))

for para in all_paras:
    print(para.text)
    print("--------")

single_para = doc.paragraphs[4]
print(single_para.text)

这段代码可以得到的输出是:

-------
Introduction
-------

-------
Welcome to my home page
-------
The site is for learning Python and Other Programming Languages
-------
Learn to program and write code in the most efficient manner
-------

-------
Details
-------

-------
This website contains useful programming articles for Java, Python, C and C++ etc.
-------

如果希望得到某一个段落的内容,可以对paragraphs进行索引,比如要想得到第6段的内容,可以编写代码:

single_para = doc.paragraphs[5]

读取 Runs

在 Word 文档中,一个 run 是连续的一段具有相同属性(包括字体,大小,格式)的词语。比如“欢迎来到我的主页,这个网站介绍如何使用Python和其他的编程语言”这句话,其中“欢迎来到我的蛀牙,”是一个run,“这个网站介绍如何使用Python”是另一个run,“和其他的编程语言”是又一个run。一个paragraph可以含一个或者一个以上的run。对这些run逐一读取可以使用下面的代码:

second_para = doc.paragraphs[1]
for run in second_para.runs:
    print(run.text)

写入Word文件

使用python-docx读取 Word 文件可以方便的得到文件中关键的内容,但更有用的是使用python-docx编写 Word 文档,这可以帮助我们批量修改和生成 Word 文件。写入 Word 文件和读取文件一样需要先创建一个Document 类,但是这里可以先不将路径写入Document类的构建函数的参数:

doc = docx.Document()

添加段落

你可以使用add_paragraph()方法来对Document类添加一个段落,添加段落完成后,使用save()方法来保存文件到一个路径,如果这个路径的文件不存在,那么这时会创建一个新的文件:

doc.add_paragraph("The first paragraph in a MS Word file")

doc.save("word_file.docx")

添加 run

如果你希望在一个段落后面添加一个run,你可以先得到这个段落的handle,然后就可以使用add_run()方法来添加run在后面。下面的代码中,add_paragraph()方法不仅会创建一个段落,还会返回这个段落的handle:

third_para = mydoc.add_paragraph("This is the third paragraph.")
third_para.add_run(" this is a section at the end of third paragraph")
doc.save("word_file.docx")

添加标题

在 Word 文件中添加标题可以使用add_heading()方法,这个方法的第一个参数是传入的标题内容,第二个参数是标题的尺寸。标题的尺寸从0开始到1,2,3,数字越大标题的字越小,0是最顶部的标题:

doc.add_heading("This is level 1 heading", 0)
doc.add_heading("This is level 2 heading", 1)
doc.add_heading("This is level 3 heading", 2)

添加图片

在 Word 文件中添加图片可以使用add_images()方法,这个方法的第一个参数为图片文件的路径,你还可以在后面的参数设置图片的宽度和高度,单位是docx.shared.Inches()

doc.add_picture("flower.jpg", width=docx.shared.Inches(4), height=docx.shared.Inches(3))

使用docxtpl填写word模版

工作中会出现需要填写大量重复的类似内容的时候,比如希望给多个客户发送邮件,需要发送相同的内容,但是客户姓名,地址,发送日期不相同。这个问题其中一个较好的解决方法是去创建一个内容模版,然后根据不同客户的信息填入不同的参数。我们可以使用python-docx-template来实现这个功能。

首先安装这个库:

pip install docxtpl

然后打开word编写文档作为模版,在变量部分使用````代替。完成后使用代码:

from docxtpl import DocxTemplate

doc = DocxTemplate("my_word_template.docx")
context = { 'company_name' : "World company" }
doc.render(context)
doc.save("generated_doc.docx")

即可得到填写好的word文档。

使用模版的方法可以允许你完全使用word的功能来编写复杂的模版,然后在使用填写标记的方法自动进行局部的修改。

结语

Python 可以使用python-docx库完成对 Word 文件内容的读取,文件的段落,run,标题,图片的写入,从而完成 Word 文件的自动化操作,这可以用在批量修改或者生成 Word 文件,以及使用其他自然语言处理应用来处理 Word 文件的内容,比如批量给 Word 文档添加结尾,使用马尔可夫链随机生成文字内容来生成多个 Word 文档。在官方文档中,还可以找到更多python-docx的操作方法比如字体和表格等等。

除了 Word 软件,Python还可以使用openpyxl库操作 Excel 表格,使用python-ppt库来操作 PPT,从而可以通过编写代码完成这两个软件的自动化操作,减少重复工作的时间。

参考