使用Python处理Word文档
1. 前言2. 使用Document对象创建文档3. 在word文档中使用标题4. 在word文档中使用段落5. 在word文档中使用列表6. 在word文档中使用表格7. 在word文档中使用章节8. 在word文档中使用分页9. 在word文档中使用图片10. 读取word文档中的内容
本文将从下面两个方向来讲述如何使用Python操作Word文档:
- 使用Python读写Word文档
- 与Word文档中各个元素相关的类
1. 前言
这一节中主要是讲解相关的内容与做好准备工作,首先是安装需要用到的工具,也就是python-docx模块。使用pip安装如下:
代码语言:javascript复制pip install python-docx
相信这一步大家都没问题,部分环境可能会有不能使用pip的情况,也可以使用easy_install或者源码来进行安装:
使用easy_install安装如下:
代码语言:javascript复制easy_install python-docx
使用源码安装如下:
代码语言:javascript复制tar xvzf python-docx-{version}.tar.gz
cd python-docx-{version}
python setup.py install
另外附上一个下载链接:
代码语言:javascript复制https://files.pythonhosted.org/packages/4a/8e/5a01644697b03016de339ef444cfff28367f92984dc74eddaab1ed60eada/docx-0.2.4.tar.gz
Linux用户可以使用wget来下载。windows用户可以打开浏览器,输入地址,使用浏览器下载。不建议使用迅雷等工具。
如果您具备一定的英语水平,可以直接阅读官方的用户手册,地址如下:
代码语言:javascript复制https://python-docx.readthedocs.io/en/latest/#
最后,关于本文内容的组织结构如下:
- 创建一个docx文件
- 在word文档中使用标题
- 在word文档中使用段落
- 在word文档中使用列表
- 在word文档中使用表格
- 在word文档中使用章节
- 在word文档中使用分页
- 在word文档中使用图片
- 读取word文档中的内容
下面我们开始进入正文。
2. 使用Document对象创建文档
创建一个Word文档使用Document对象。如:
代码语言:javascript复制from docx import Document
document = Document()
document.save("演示如何操作Word文档.docx")
# 要打开一个已存在的文件
document = Document("已存在的文件名.docx")
案例说明:第一行为为从docx模块中引入Document类,第二行是声明一个Document()对象,相当于创建了一个docx文档,这个对象中包含了操作Word文档的方法,我们对这个对象进行的操作就是对文档进行操作,比如增加一些内容。第三行进行了一些操作的文档保存到一个文件中。
Document()对象中主要包含以下几个方法:
add_heading()
:在文档中添加标题add_page_break()
:在文档中添加分页add_paragraph()
:在文档中添加段落add_picture()
:在文档中添加图片add_section()
:在文档中添加章节add_table()
:在文档中添加表格save()
:将文档保存为文件或者保存到流
3. 在word文档中使用标题
若要在Word文档中添加标题,需要使用Document()对象的add_heading()方法。
代码语言:javascript复制add_heading(text=u'', level=1)
add_heading()方法会在文档的末尾添加标题,可以带两个参数,参数text是标题的文本,level是标题的级别,可以设置的范围是0-9,0代表文档标题,从1开始分别对应一级标题、二级标题一直到九级标题,默认值是1。如果设置的数字超过这个范围,编译器会报ValueError
。
如下案例:
from docx import Document
document = Document()
document.add_heading(text=u'这是文档标题', level=0)
document.add_heading(text=u'这是一级标题', level=1)
document.add_heading(text=u'这是二级标题', level=2)
document.add_heading(text=u'这是三级标题', level=3)
document.add_heading(text=u'这是四级标题', level=4)
document.add_heading(text=u'这是五级标题', level=5)
document.add_heading(text=u'这是六级标题', level=6)
document.add_heading(text=u'这是七级标题', level=7)
document.add_heading(text=u'这是八级标题', level=8)
document.add_heading(text=u'这是九级标题', level=9)
document.save("0-使用标题.docx")
4. 在word文档中使用段落
若要在文档中添加一段文字或一个段落,需要使用Document()对象的add_paragraph()方法。
代码语言:javascript复制add_paragraph(text=u'', style=None)
add_paragraph()会在文档末尾添加段落,此方法可以接受两个参数,text为段落的文本内容,这个文本内容可以包含t
、n
等特殊字符。style参数用来设置样式,关于样式会在《在word文档中使用样式》使用样式一节中做详述的说明,在这里仅做一般性的说明。
add_paragraph()方法会返回Paragraph()对象。该对象包含了对此段文本进行操作的一些方法和属性,如下:
add_run()
:用来追加段落内容,设置样式等。clear()
:将段落删除,并返回改段内容,但是格式和样式会保留insert_paragraph_before()
:在本段落之前插入新段落。- alignment:设置对齐方式
- paragraph_format:设置段落格式
- style:返回样式
- text:返回文本
实例如下:
代码语言:javascript复制from docx import Document
lyric = "那一年的雪花飘落梅花开枝头n那一年的华清池旁留下太多愁n"
lyric = lyric "不要说谁是谁非感情错与对n只想梦里与你一起再醉一回n"
lyric_add = "爱恨就在一瞬间n举杯对月情似天n"
lyric_add = lyric_add "爱恨两茫茫n问君何时恋"
document = Document()
paragraph = document.add_paragraph(text=lyric)
paragraph.add_run(text= lyric_add)
prior_paragraph = paragraph.insert_paragraph_before('新贵妃醉酒')
document.save("1-使用段落.docx")
如上述代码会在会在文档那个中添加一串歌词。
5. 在word文档中使用列表
列表分为有序列表和无序列表,还有使用特殊样式的列表,在这里仅讲述如何使用有序列表和无序列表。
实际在Document()对象中列表是段落的一种样式。示例代码如下:
代码语言:javascript复制from docx import Document
document = Document()
document.add_paragraph('这是无序列表第一行', style='List Bullet')
document.add_paragraph('这是无序列表第二行', style='List Bullet')
document.add_paragraph('这是有序列表第一行', style='List Number')
document.add_paragraph('这是有序列表第二行', style='List Number')
document.save("2-使用列表.docx")
第一行引入Document类,第二行实例化一个Document对象,第三行添加无序列表第一行,第四行添加无序列表第二行,第五行添加有序列表第一行,第六行添加有序列表第二行。
关键在于设置样式,‘List Bullet’为将段落设置为无序列表,‘List Number’为将段落设置为有序列表。
6. 在word文档中使用表格
在Word中使用表格是一个比较复杂的内容。这一点与使用Python操作Excel相差不大,本节不会涉及太多与样式有关的内容,关于样式会在《在word文档中使用样式》使用样式一节中做详述的说明。
如果想要熟练使用python-docx操作Word文档,需要认识Table()、_Cell()、 _Row()、 _Rows() _Column() 和 _Columns()五个类。
在Word文档中添加表格需要使用Document()对象的add_table()方法。
代码语言:javascript复制add_table(rows, cols, style=None)
add_table()方法会返回一个Table对象。rows代表行数,cols代表列数,style代表样式,暂时不谈。
如:
代码语言:javascript复制add_table(3, 3) # 添加一个三行三列的表格
Table()对象中报了对表格进行操作的方法和属性,如下:
add_column(width)
:如果你想添加列,可以使用此方法,使用此方法需要设置列宽add_row()
:如果你想添加行,可以添加此方法cell(row_idx, col_idx)
:如果你想访问单个单元格,可以使用此方法row_cells(row_idx)
:返回一个序列,序列包含的是行号为row_idx的行内所有单元格column_cells(column_idx)
:返回一个序列,序列包含的是列号为column_idx的列内所有单元格- rows:返回的是_Rows对象,是一个包含了所有行(_Row对象)的列表
- columns:返回的是_Columns对象,是一个包含了所有列(_Column对象)的列表
cell()方法实际上是返回了一个_Cell()对象。_Cell()对象代表的是一个具体的单元格,包含了操作一个单个单元格的方法与属性,如下:
add_paragraph(text=u'', style=None)
:在单元格内添加段落。add_table(rows, cols)
:在单元格中添加表格merge(other_cell)
:合并单元格
_Rows/_Columns
对象返回的是一个包含了_Rows/_Column
对象的列表,可以当做一般列表使用索引来访问,这时它的元素是表格中的每一行/列。_Rows/_Columns对象中包含了一个属性,如下:
- table:用来返回它所属的列表
_Row对象代表是表格中的行,具有如下属性:
- cells:即这一行所有的单元格,是个列表
- height:行高
- height_rule:行高规则,如果没有设置,则默认没有
- table:用来返回它所属的列表
_Column
对象代表的是表格中的列,具有如下属性:
- cells:即这一列所有的单元格,是个列表
- table:用来返回它所属的列表
- width:列宽
from docx import Document
document = Document()
rowc = 3 # 初始行数
colc = 3 # 初始列数
table = document.add_table(rows=rowc, cols=colc)
for i in range(rowc):
for j in range(colc):
table.cell(i, j).text = str((i 1)*(j 1))
# content
# 1 2 3
# 2 4 6
# 3 6 9
# -------
table.add_row() # 在最下方添加行
table.add_column(10) # 在最右边添加列,列宽设置为10
print(len(table.rows)) # 4
print(len(table.columns)) # 4
table.cell(3, 3).text = str(3*3)
row0 = table.row_cells(0)
col2 = table.column_cells(2)
for each in row0:
print(each.text,end = ' ') # 1 2 3
print('n')
for each in col2:
print(each.text) # 3 6 9
for row in table.rows:
for cell in row.cells:
print(cell.text, end=' ')
print()
document.save("3-使用表格.docx")
7. 在word文档中使用章节
要在Word文档中使用章节,要使用Document()对象中的add_section()
方法。
add_section(start_type=2)
可以接收一个参数,默认是增加一个新页。
代码语言:javascript复制from docx import Document
document = Document()
add_section()
document.save("4-使用章节.docx")
8. 在word文档中使用分页
要在Word文档中使用分页,要使用Document()对象中的add_page_break()
方法,会返回一个包含一个分页符的Paragraph对象。
示例如下:
代码语言:javascript复制from docx import Document
document = Document()
document.add_paragraph('这是第一页')
document.add_page_break()
document.add_paragraph('这是第二页')
document.save("5-使用分页.docx")
9. 在word文档中使用图片
要在Word文档中添加图片,需要使用Document()对象中的add_picture()方法。
代码语言:javascript复制add_picture(image_path_or_stream, width=None, height=None)
add_picture()方法可以接收三个参数,即图片来源(可以是一个路径,或者流),宽度和长度。示例如下:
代码语言:javascript复制from docx import Document
document = Document()
document.add_picture('编程杂艺.png')
document.save("6-使用图片.docx")
10. 读取word文档中的内容
在前面我们已经讲了足够多的内容,读者基本已经可以根据自己的需求向文档中插入相关的内容。
那么应该如何读取文档中的内容呢?
那就是利用属性。先来读取段落试试看吧:
代码语言:javascript复制from docx import Document
document = Document("1-使用段落.docx")
for each in document.paragraphs:
print(each.text)
# ----------------------------------
新贵妃醉酒
那一年的雪花飘落梅花开枝头
那一年的华清池旁留下太多愁
不要说谁是谁非感情错与对
只想梦里与你一起再醉一回
爱恨就在一瞬间
举杯对月情似天
爱恨两茫茫
问君何时恋
新贵妃醉酒
那一年的雪花飘落梅花开枝头
那一年的华清池旁留下太多愁
不要说谁是谁非感情错与对
只想梦里与你一起再醉一回
爱恨就在一瞬间
举杯对月情似天
爱恨两茫茫
问君何时恋
document的paragraphs属性,会返回一个列表,列表内容为文档中所有段落(为Paragraph对象)的合集。需要注意的是,对于一个Document来说,标题也是Paragraph。如果你这样用:
代码语言:javascript复制from docx import Document
document = Document("0-使用标题.docx")
for each in document.paragraphs:
print(each.text)
# --------------------------------------
这是文档标题
这是一级标题
这是二级标题
这是三级标题
这是四级标题
这是五级标题
这是六级标题
这是七级标题
这是八级标题
所谓标题,严格上说是一种带了格式的段落。
同理,使用tables属性,可以读取所有的表格。
代码语言:javascript复制from docx import Document
document = Document("3-使用表格.docx")
for each in document.tables:
print(each)
print(document.tables[0].cell(0,0).text)
# -------------------------------------
<docx.table.Table object at 0x0000025F43F97390> # 表格对象
1 # 第一个表格中第一个单元格的内容
如果要读取图片,需要使用inline_shapes属性。
代码语言:javascript复制from docx import Document
document = Document("7-使用图片.docx")
for each in document.inline_shapes:
print(each)
# -----------------------------------
<docx.shape.InlineShape object at 0x00000196D29F0A58> # 图片对象