Python-docx处理word表格的好手

使用Python处理Word文档

1. 前言

2. 使用Document对象创建文档

3. 在word文档中使用标题

4. 在word文档中使用段落

5. 在word文档中使用列表

6. 在word文档中使用表格

7. 在word文档中使用章节

8. 在word文档中使用分页

9. 在word文档中使用图片

10. 读取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(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)

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

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> # 图片对象

举报
评论 0