python 操作 MS Word

1 概述

python-docx-example-docx-01

python 为脚本自动化操作 Word 提供了可能。最为常用是 python-docx .使用它可以方便地创建或更新 Microfoft Word(.docx) files.

下图是其官网给出的一个使用 python-docx 创建的 word 文档的 Demo:

文档地址:http://python-docx.readthedocs.io/en/latest/index.html

github: https://github.com/python-openxml/python-docx
这是官网给出的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
from docx import Document
from docx.shared import Inches

document = Document()

document.add_heading('Document Title', 0)

p = document.add_paragraph('A plain paragraph having some ')
p.add_run('bold').bold = True
p.add_run(' and some ')
p.add_run('italic.').italic = True

document.add_heading('Heading, level 1', level=1)
document.add_paragraph('Intense quote', style='IntenseQuote')

document.add_paragraph(
'first item in unordered list', style='ListBullet'
)
document.add_paragraph(
'first item in ordered list', style='ListNumber'
)

document.add_picture('monty-truth.png', width=Inches(1.25))

table = document.add_table(rows=1, cols=3)
hdr_cells = table.rows[0].cells
hdr_cells[0].text = 'Qty'
hdr_cells[1].text = 'Id'
hdr_cells[2].text = 'Desc'
for item in recordset:
row_cells = table.add_row().cells
row_cells[0].text = str(item.qty)
row_cells[1].text = str(item.id)
row_cells[2].text = item.desc

document.add_page_break()

document.save('demo.docx')

2 安装 python-docx

可以使用 pip 或 easy_install 来进行安装

1
2
3
4
5
pip install python-docx



easy_install python-docx

也可以直接下载安装文件来进行安装:

1
2
3
tar xvzf python-docx-{version}.tar.gz
cd python-docx-{version}
python setup.py install

要求Python 版本在2.6 以上或 3.3 以上,lxml 版本在 2.3.2及以上。 在 Windows 10 / Python 2.7 环境下安装时出现 lxml3.7.2 安装失败的问题,可降低版本进行尝试:

1
pip install lxml==3.4.2

3 快速上手

3.1 打开文档

1
2
from docx import Document
document = Document()

新建一个空的 word 文档。当然,也可以打开一个已存在的 word 文档,只要传入相应的路径就好。

3.2 添加段落

段落是 Word 的基本单元。使用 python-docx 添加段落:

1
paragraph = document.add_paragraph(u'段落是 Word 的基本单元。')

add_paragraph 会在文档末尾创建一个段落,并返回创建的段落的引用。 也可以在文档的某一个位置插入一个新的段落:

1
prior_paragraph = paragraph.insert_paragraph_before(u'段落是 Word 的')

3.3 添加标题

1
document.add_heading(u'使用 python 创建文档')

可以使用 level 参数为标题指定级别:

1
document.add_heading(u'添加一个2级标题',level=2)

level 的范围在 0 到 9 之间。默认为 1 级标题。

3.4 分页标记

1
document.add_page_break()

3.5 表格

3.5.1 创建表格

1
table = document.add_table(rows=2, cols=2)

使用默认样式在文档末尾创建一个 2 行 2 列的表格。不过默认样式相当不美观,我们可以通过 style 来为其设置样式。

3.5.2 访问单元格

通过 row 或 cell 可以访问单元格

1
2
3
4
5
6
7
8
row = table.rows[0]
row.cells[0].text = u'姓名'
row.cells[1].text = u'年龄'

cell = table.cell(1,0)
cell.text = 'Tom'
cell = table.cell(1,1)
cell.text = '24'

3.5.3 添加表格行

1
row = table.add_row()

3.6 图片

1
document.add_picture('image-filename.png')

可以在文档末尾添加一张图片。路径可以是本地路径或网络路径。默认添加图片的大小为原图片的大小。计算方式为 像素 / dpi .即一张 300*300 像素的图片在300dpi 分辨率下显示为 1 英寸。然后一般的图片是 72 dpi 分辨率的。我们可以直接使用英寸或厘米来指定大小:

1
2
from docx.shared import Inches
document.add_picture('image-filename.png', width=Inches(1.0))

3.7 样式

python-docx 的样式分为四种:字段、列表、段落、表格。可以分别为其指定样式。每种样式都有 name,type 等属性。

3.7.1 段落样式

在创建段落的时候可以为其指定样式,也可以在创建段落之后为其指定样式:

1
2
3
4
5
document.add_paragraph('Lorem ipsum dolor sit amet.', style='ListBullet')


paragraph = document.add_paragraph('Lorem ipsum dolor sit amet.')
paragraph.style = 'ListBullet'

这里的 ListBullet 为样式名称。如果你使用的 Word 是英文版 ,直接从 UI 上获取名称即可。如果是其它语言版本,则无法直接从 UI 上获取了。 为方便选择样式,这里将提供一个文档,列出各种样式对应的英文名称,详见本文附件。

3.7.2 字体样式

段落样式将格式化段落块。而字体样式将直接格式化指定的字块。 在使用 add_paragraph() 添加段落后,可以使用 add_run() 在段落末尾添加文字。

1
2
paragraph = document.add_paragraph('Lorem ipsum ')
paragraph.add_run('dolor sit amet.')

add_run 返回 run 对象,该对象包括 .blod 和 .italic 属性。

1
2
3
4
paragraph = document.add_paragraph('Lorem ipsum ')
run = paragraph.add_run('dolor')
run.bold = True
paragraph.add_run(' sit amet.')

该段代码将得到如下的样式: Lorem ipsum dolor sit amet.

也可以像下面这样简写:

1
paragraph.add_run('dolor').bold = True

除了这两个属性,还可以为 run 指定 Style:

1
2
paragraph = document.add_paragraph('Normal text, ')
paragraph.add_run('text with emphasis.', 'Emphasis')

1
2
3
paragraph = document.add_paragraph('Normal text, ')
run = paragraph.add_run('text with emphasis.')
run.style = 'Emphasis'

3.7.3 表格样式

和段落和字体一样,可以为表格设置样式 。详见本文附件。

3.7.4 列表样式

同上,详见本文附件。

4.附件

为方便地查找各种样式,这里使用了docx自带的样式生成了一份文档,用于速查:

python_docx_styles

[

python_docxs_tyles

](https://code.wandoer.com/wp-content/uploads/2017/01/python_docxs_tyles.png)