前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用Python处理Word文档

使用Python处理Word文档

作者头像
LogicPanda
发布2019-09-03 20:06:37
7.2K0
发布2019-09-03 20:06:37
举报

使用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安装如下:

代码语言: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。 如下案例:

代码语言:javascript
复制
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:列宽
代码语言:javascript
复制
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()方法。

代码语言:javascript
复制
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> # 图片对象
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-09-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 编程杂艺 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 使用Python处理Word文档
    • 1. 前言
      • 2. 使用Document对象创建文档
        • 3. 在word文档中使用标题
          • 4. 在word文档中使用段落
            • 5. 在word文档中使用列表
              • 6. 在word文档中使用表格
                • 7. 在word文档中使用章节
                  • 8. 在word文档中使用分页
                    • 9. 在word文档中使用图片
                      • 10. 读取word文档中的内容
                      领券
                      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档