使用Python处理Word文档

好久不见. 提交于 2020-12-13 19:33:59


使用Python处理Word文档

1. 前言2. 使用Document对象创建文档3. 在word文档中使用标题4. 在word文档中使用段落5. 在word文档中使用列表6. 在word文档中使用表格7. 在word文档中使用章节8. 在word文档中使用分页9. 在word文档中使用图片10. 读取word文档中的内容

本文将从下面两个方向来讲述如何使用Python操作Word文档:

  1. 使用Python读写Word文档

  2. 与Word文档中各个元素相关的类

1. 前言

这一节中主要是讲解关的内容与做好准备工作,首先是安装需要用到的工具,也就是python-docx模块。使用pip安装如下:

pip install python-docx

相信这一步大家都没问题,部分环境可能会有不能使用pip的情况,也可以使用easy_install或者源码来进行安装:

使用easy_install安装如下:

easy_install python-docx

使用源码安装如下:

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

另外附上一个下载链接:

https://files.pythonhosted.org/packages/4a/8e/5a01644697b03016de339ef444cfff28367f92984dc74eddaab1ed60eada/docx-0.2.4.tar.gz

Linux用户可以使用wget来下载。windows用户可以打开浏览器,输入地址,使用浏览器下载。不建议使用迅雷等工具。

如果您具备一定的英语水平,可以直接阅读官方的用户手册,地址如下:

https://python-docx.readthedocs.io/en/latest/#   

最后,关于本文内容的组织结构如下:

  • 创建一个docx文件

  • 在word文档中使用标题

  • 在word文档中使用段落

  • 在word文档中使用列表

  • 在word文档中使用表格

  • 在word文档中使用章节

  • 在word文档中使用分页

  • 在word文档中使用图片

  • 读取word文档中的内容

下面我们开始进入正文。

2. 使用Document对象创建文档

创建一个Word文档使用Document对象。如:

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()方法。

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()方法。

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:返回文本

实例如下:

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()对象中列表是段落的一种样式。示例代码如下:

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()方法。

add_table(rows, cols, style=None)

add_table()方法会返回一个Table对象。rows代表行数,cols代表列数,style代表样式,暂时不谈。

如:

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(33).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)

可以接收一个参数,默认是增加一个新页。

from docx import Document
document = Document()
add_section()
document.save("4-使用章节.docx")

8. 在word文档中使用分页

要在Word文档中使用分页,要使用Document()对象中的add_page_break()方法,会返回一个包含一个分页符的Paragraph对象。

示例如下:

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()方法。

add_picture(image_path_or_stream, width=None, height=None)

add_picture()方法可以接收三个参数,即图片来源(可以是一个路径,或者流),宽度和长度。示例如下:

from docx import Document
document = Document()
document.add_picture('编程杂艺.png')
document.save("6-使用图片.docx")

10. 读取word文档中的内容

在前面我们已经讲了足够多的内容,读者基本已经可以根据自己的需求向文档中插入相关的内容。

那么应该如何读取文档中的内容呢?

那就是利用属性。先来读取段落试试看吧:

from docx import Document
document = Document("1-使用段落.docx")
for each in document.paragraphs:
    print(each.text)

# ----------------------------------
新贵妃醉酒
那一年的雪花飘落梅花开枝头
那一年的华清池旁留下太多愁
不要说谁是谁非感情错与对
只想梦里与你一起再醉一回
爱恨就在一瞬间
举杯对月情似天
爱恨两茫茫
问君何时恋
新贵妃醉酒
那一年的雪花飘落梅花开枝头
那一年的华清池旁留下太多愁
不要说谁是谁非感情错与对
只想梦里与你一起再醉一回
爱恨就在一瞬间
举杯对月情似天
爱恨两茫茫
问君何时恋

document的paragraphs属性,会返回一个列表,列表内容为文档中所有段落(为Paragraph对象)的合集。需要注意的是,对于一个Document来说,标题也是Paragraph。如果你这样用:

from docx import Document
document = Document("0-使用标题.docx")
for each in document.paragraphs:
    print(each.text)
# --------------------------------------
这是文档标题
这是一级标题
这是二级标题
这是三级标题
这是四级标题
这是五级标题
这是六级标题
这是七级标题
这是八级标题

所谓标题,严格上说是一种带了格式的段落。

同理,使用tables属性,可以读取所有的表格。

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属性。

from docx import Document
document = Document("7-使用图片.docx")
for each in document.inline_shapes:
    print(each)
# -----------------------------------
<docx.shape.InlineShape object at 0x00000196D29F0A58# 图片对象

今天的内容就到这里,我们下期再见!

如果您对本文或者本公众号感兴趣,欢迎关注我的公众号,留言您想看的内容,在这里,我们一起成长!

"不止于编程"



本文分享自微信公众号 - Zechen的小本本(NotesOfZechen)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!