python 操作 MS Word
目录
1 概述
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 表格样式
和段落和字体一样,可以为表格设置样式 。详见本文附件。