Skip to content

Word文档

利用 python-docx 模块,Python可以创建和修改 Word 文档,它带有 .docx 文件扩展名。运行 pip install python-docx,可以安装该模块。

和纯文本相比,.docx 文件有很多结构。这些结构在 python-docx 中用3种不同的类型来表示。在最高一层,Document 对象表示整个文档。Document 对象包含一个 Paragraph 对象的列表,表示文档中的段落(用户在Word 文档中输入时,如果按下回车,新的段落就开始了)。每个 Paragraph 对象都包含一个 Run 对象的列表,下面单句段落有4个 Run 对象。

一个 Paragraph 对象中识别的 Run 对象

Word 文档中的文本不仅仅是字符串。它包含与之相关的字体、大小、颜色和其他样式信息。在 Word 中,样式是这些属性的集合。一个 Run 对象是相同样式文本的延续。当文本样式发生改变时,就需要一个新的 Run 对象。

提前下载测试文档:https://share.weiyun.com/6k7GU6SF

读取 Word 文档

让我们尝试使用 python-docx 模块。

python
"""
    Document:文档
    Paragraph:段落
    Run:文字块
"""
from docx import Document

doc: Document = Document('测试文档.docx')

# doc.paragraphs->得到一个列表,包含了每个段落实例
print(doc.paragraphs)
# 遍历文档段落
for paragraph in doc.paragraphs:
    # 打印文档的文字内容
    # print(paragraph.text)
    print('---------------------------------')
    # 遍历段落块
    for run in paragraph.runs:
        # 打印段落块里面的文字信息
        print(run.text)

我们在 Python 中打开了一个 .docx 文件,调用 docx.Document() ,传入文件名 demo.docx 。这将返回一个 Document 对象,它有 paragraphs 属性,是 Paragraph 对象的列表。每个 Paragraph 对象都有一个 text 属性,包含该段中文本的字符串(没有样式信息)

每个 Paragraph 对象也有一个 runs 属性,它是 Run 对象的列表。Run 对象也有一个 text 属性,包含那个延续中的文本。我们看看第二个 Paragraph 对象中的 text 属性。然后,文本变为粗体样式,所以 bold 开始了一个新的 Run 对象。在这之后,文本又回到了非粗体的样式,这导致了第三个 Run 对象,' and some '。包含'italic',是斜体样式。

有了 python-docx,Python 程序就能从 .docx 文件中读取文本,像其他的字符串值一样使用它。

设置样式

设置 Paragraph 和 Run 对象的样式

在 Windows 平台的 Word 中,你可以按下 Ctrl-Alt-Shift-S,显示样式窗口并查看样式。在 OS X 上,可以点击 ViewStyles 菜单项,查看样式窗口。

Word 和其他文字处理软件利用样式,保持类似类型的文本在视觉展现上一致,并易于修改。例如,也许你希望将内容段落设置为 11 点,Times New Roman,左对齐,右边不对齐的文本。可以用这些设置创建一种样式,将它赋给所有的文本段落。然后,如果稍后想改变文档中所有内容段落的展现形式,只要改变这种样式,所有段落都会自动更新。

对于 Word 文档,有3种类型的样式:段落样式可以应用于 Paragraph 对象,字符样式可以应用于 Run 对象,链接的样式可以应用于这两种对象。可以将 Paragraph 和 Run 对象的 style 属性设置为一个字符串,从而设置样式。这个字符串应该是一种样式的名称。如果 style 被设置为 None,就没有样式与 Paragraph 或 Run 对象关联。

python
"""
对文字字体样式进行修改
run.font.样式 = XXX

"""
from docx import Document
from docx.shared import Pt, RGBColor

doc = Document('测试文档结构.docx')
for paragraph in doc.paragraphs:
    for run in paragraph.runs:
        run.font.bold = True  # 粗体
        run.font.italic = True  # 斜体
        run.font.underline = True  # 下划线
        run.font.strike = True  # 删除线
        run.font.shadow = True  # 阴影
        run.font.size = Pt(20)  # 字体大小
        run.font.color.rgb = RGBColor(255, 255, 0)  # 黄色
        run.font.name = '微软雅黑'

doc.save('测试修改字体样式.docx')

创建带有非默认样式的 Word 文档

如果想要创建的 Word 文档使用默认样式以外的样式,就需要打开一个空白 Word 文档,自己创建样式。

python
"""
paragraph.alignment =对齐方式
paragraph.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
"""
from docx import Document
from docx.enum.text import WD_PARAGRAPH_ALIGNMENT
from docx.shared import Pt

doc = Document('测试文档.docx')
"""可选的对齐方式:
LEFT, CENTER, RIGHT, JUSTIFY, DISTRIBUTE, JUSTIFY_MED,
JUSTIFY_H, JUSTIFY_LOW, THAI_JUSTIFY,
"""

"""行间距
paragraph.paragraph_format.line.spacing=2.0
注意用浮点数,2.0 就表示两倍行间距

paragraph.paragraph_format.line_spacing=2.0
"""
paragraph = doc.paragraphs[5]
# paragraph.paragraph_format.line_spacing = 5
print(paragraph.text)

"""段前段后间距
paragraph.paragraph_format.space_before= Pt(12)
Pt(12) 表示12磅

paragraph.paragraph_format.space_before = Pt(12)
paragraph.paragraph_format.space_after = Pt(12)
"""

paragraph.paragraph_format.space_before = Pt(50)
paragraph.paragraph_format.space_after = Pt(50)

doc.save('修改段落样式.docx')

写入 Word 文档

在交互式环境中输入以下代码:

python
from docx import Document

doc = Document()  # type: Document

# doc.add_paragraph("段落文字内容")
paragraph1 = doc.add_paragraph("这里是第一个段落")
paragraph2 = doc.add_paragraph("这里是第二个段落")

doc.save('测试添加内容.docx')

要创建自己的 .docx 文件,就调用 docx.Document(),返回一个新的、空白的 Word Document 对象。Document 对象的 add_paragraph() 方法将一段新文本添加到文档中,并返回添加的 Paragraph 对象的引用。在添加完文本之后,向 Document 对象的 save() 方法传入一个文件名字符串,将 Document 对象保存到文件。

可以用新的段落文本,再次调用 add_paragraph() 方法,添加段落。或者,要在已有段落的末尾添加文本,可以调用 Paragraph 对象的 add_run() 方法,向它传入一个字符串。

添加标题

调用 add_heading() 将添加一个段落,并使用一种标题样式。在交互式环境中输入以下代码:

python
# doc.add_heading(标题名称,level=标题等级)
doc.add_heading('一级标题', level=1)

add_heading() 的参数,是一个标题文本的字符串,以及一个从 0 到 4 的整数。整数 0 表示标题是 Title 样式,这用于文档的顶部。整数 1 到 4 是不同的标题层次,1 是主要的标题,4 是最低层的子标题。add_heading() 返回一个 Paragraph 对象,让你不必多花一步从 Document 对象中提取它。

Run 属性

通过 text 属性,Run 可以进一步设置样式。每个属性都可以被设置为 3 个值之一:True(该属性总是启用,不论其他样式是否应用于该 Run)、False(该属性总是禁用)或 None(默认使用该Run被设置的任何属性)。

下面列出了可以在Run对象上设置的text属性。

属性描述
bold文本以粗体出现
italic文本以斜体出现
underline文本带下划线
strike文本带删除线
double_strike文本带双删除线
all_caps文本以大写首字母出现
small_caps文本以大写首字母出现,小写字母小两个点
shadow文本带阴影
outline文本以轮廓线出现,而不是实心
rtl文本从右至左书写
imprint文本以刻入页面的方式出现
emboss文本以凸出页面的方式出现

例如,为了改变 demo.docx 的样式,在交互式环境中输入以下代码:

python
paragraph3 = doc.add_paragraph()
# paragraph.add_run(文字内容)
paragraph3.add_run('加粗,').bold = True
paragraph3.add_run('普通,')
paragraph3.add_run('斜体').italic = True

这里,我们使用了 text 和 style 属性,以便容易地看到文档的段落中有什么。我们可以看到,很容易将段落划分成 Run ,并单独访问每个 Run 。可以设置每个 Run 的样式,将结果保存到一个新文档。

添加换行符和换页符

要添加换行符(而不是开始一个新的段落),可以在Run对象上调用 add_break() 方法,换行符将出现在它后面。如果希望添加换页符,可以调用 .add_page_break()

python
# 添加分页 doc.add_page_break()
doc.add_page_break()

添加图像

Document 对象有一个 add_picture() 方法,让你在文档末尾添加图像。假定当前工作目录中有一个文件 zophie.png,你可以输入以下代码,在文档末尾添加 logo.png ,宽度为 1 英寸,高度为 4 厘米(Word 可以同时使用英制和公制单位):

python
# 添加图片
doc.add_picture("logo.png")
# doc.add_picture(图片地址, width=宽度, height=高度)
# 只给一个宽度或高度,另一个的尺寸会自动计算
from docx.shared import Cm

doc.add_picture("logo.png", width=Cm(5))
doc.add_picture("logo.png", height=Cm(5))

第一个参数是一个字符串,表示图像的文件名。可选的 width 和 height 关键字参数,将设置该图像在文档中的宽度和高度。如果省略,宽度和高度将采用默认值,即该图像的正常尺寸。

你可能愿意用熟悉的单位来指定图像的高度和宽度,诸如英寸或厘米。所以在指定 width 和 height 关键字参数时,可以使用 docx.shared.Inches() 和 docx.shared.Cm() 函数。

添加表格

python
# doc.add_table(rows=多少行, cols=多少列)
records = [
    ['学号', '姓名', '成绩'],
    [101, '李雷', 95],
    [102, '韩梅梅', 100],
    [103, '马冬梅', 98]
]

table = doc.add_table(rows=4, cols=3)
for row in range(4):
    cells = table.rows[row].cells
    for col in range(3):
        cells[col].text = str(records[row][col])

附录

word 设置中文字体

python
from docx.oxml.ns import qn

# 设置中文字体需要进行特殊处理
r = run_header._element.rPr.rFonts
r.set(qn('w:eastAsia'), '微软雅黑')