python-docx操作word文档

参考博主:https://blog.csdn.net/zhouz92

下载模块

1.正常安装
pip install python-docx

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

3.源码安装
tar xvzf python-docx-{version}.tar.gz
cd python-docx-{version}
python setup.py install

4.其他安装方式
另外附上一个下载链接:
https://files.pythonhosted.org/packages/4a/8e/5a01644697b03016de339ef444cfff28367f92984dc74eddaab1ed60eada/docx-0.2.4.tar.gz
Linux用户可以使用wget来下载。windows用户可以打开浏览器,输入地址,使用浏览器下载。不建议使用迅雷等工具。

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

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

全局设置

import docx
from docx.enum.text import WD_ALIGN_PARAGRAPH
from docx.oxml.ns import qn
from docx.shared import Cm, Pt

document = Document()
# 设置一个空白样式
style = document.styles['Normal']
# 设置西文字体
style.font.name = 'Times New Roman'
# 设置中文字体
style.element.rPr.rFonts.set(qn('w:eastAsia'), '微软雅黑')

一 标题操作

1.标题写操作

from docx import Document
from docx.shared import Inches
#样式
from docx.enum.text import WD_ALIGN_PARAGRAPH

#1.创建 Document 对象,相当于打开一个 word 文档
document = Document()

#2.添加标题:add_heading(text="",level=1),text:标题内容 level:标题级别范围0-9
# t1 = document.add_heading(text='这是一级标题', level=1)
# t2 = document.add_heading(text='这是二级标题', level=2)
.....
# t9 = document.add_heading(text='这是九级标题', level=9)
# t10 = document.add_heading(text='这是九级标题', level=10) #报错:ValueError: level must be in range 0-9, got 10

#3.样式:居中
title_obj = document.add_heading(text='这是文档标题', level=0)
title_obj.alignment = WD_ALIGN_PARAGRAPH.CENTER #居中默认带下划线

#4.生成文件
document.save("1-使用标题.docx") #文件路径

2.标题读

3.标题样式

# 设置标题
title_ = document.add_heading(level=0)
# 标题居中
title_.alignment = WD_ALIGN_PARAGRAPH.CENTER
# 添加或追加标题内容
title_run = title_.add_run("title")
# 设置标题字体大小
title_run.font.size = Pt(14)
# 设置标题西文字体
title_run.font.name = 'Times New Roman'
# 设置标题中文字体
title_run.element.rPr.rFonts.set(qn('w:eastAsia'), '微软雅黑')

 二 段落操作

1.段落写

import docx
from docx.enum.text import WD_ALIGN_PARAGRAPH
from docx.oxml.ns import qn
from docx.shared import Cm, Pt
#1.添加段落add_paragraph(text,style):text内容 style样式# 换行符,空格符
document = Document()
p1 = document.add_paragraph(text="这只是
段落	而已1")
print(paragraph1.text) #段部落内容

#2.追加段落:add_run(self, text=None, style=None)
p1.add_run(text="段落2追加的内容")

#3.指定插入段落:某个段落之前插入落:insert_paragraph_before(self, text=None, style=None)
p2 = p1.insert_paragraph_before('这是段落1之前插入的新段落')

#4.删除段落clear():将段落删除,并返回改段内容,但是格式和样式会保留
delete_p1 = p1.clear().text  #""
print(11,(delete_content,1),type(delete_content)#<docx.text.paragraph.Paragraph object at 0x00000204EAF04970> <class 'docx.text.paragraph.Paragraph'>

#5.保存
document.save("1-使用标题.docx") #文件路径

2.段落读

#1.获取Word文档所有段落对象:列表
paragraphs = doc.paragraphs
print(len(paragraphs),paragraphs)
# 注意:
# paragraphs 获取的是文档中所有段落对象的列表,严格来说是word文档中正文部分的段落对象列表。因为通过前文的介绍,许多除正文部分,如 表格,页面页脚等元素也包含 paragraph 对象。
# 而 doc.paragraphs 获取到的 paragraph 不包含这些段落对象。

#2.获取段落对象:索引0,默认是文档标题
par0 = paragraphs[0]
print(par0)
#3.获取段落文字
par0_string = par0.text
print(par0_string)
#获取所有段落文字信息
pars_string = [par.text for par in paragraphs]
print(pars_string)

#4.获取段落格式
print('段落对齐方式:',par0.paragraph_format.alignment)
# 段落对齐方式: LEFT (0)
print('左缩进:',par0.paragraph_format.left_indent)
# 左缩进: None
print('右缩进:',par0.paragraph_format.right_indent)
# 右缩进: None
print('首行缩进:',par0.paragraph_format.first_line_indent)
# 首行缩进: 304800
print('行间距:',par0.paragraph_format.line_spacing)
# 行间距: 1.5
print('段前间距:',par0.paragraph_format.space_before)
# 段前间距: 198120
print('段后间距:',par0.paragraph_format.space_after)

段落文字

# 1.获取段落的 run 对象列表
par1 = paragraphs[1]
runs = par1.runs#获取 runs列表
print(runs,len(runs))
# 获取run对象
run_0 = runs[0]
print(run_0.text) # 获取 run 对象文字信息

# 获取文字格式信息
print('字体名称:',run_0.font.name,par1.style.font.name) #分别获取段落和run对象字体名称,下同理
# 字体名称: 宋体
print('字体大小:',run_0.font.size)
# 字体大小: 152400
print('是否加粗:',run_0.font.bold)
# 是否加粗: None
print('是否斜体:',run_0.font.italic)
# 是否斜体: True
print('字体颜色:',run_0.font.color.rgb)
# 字体颜色: FF0000
print('字体高亮:',run_0.font.highlight_color)
# 字体高亮: YELLOW (7)
print('下划线:',run_0.font.underline)
# 下划线: True
print('删除线:',run_0.font.strike)
# 删除线: None
print('双删除线:',run_0.font.double_strike)
# 双删除线: None
print('下标:',run_0.font.subscript)
# 下标: None
print('上标:',run_0.font.superscript)

3.段落样式


from docx import Document
from docx.shared import Inches
#样式
from docx.enum.text import WD_ALIGN_PARAGRAPH
from docx.shared import Cm, Pt
from docx.oxml.ns import qn
##字体颜色
from docx.shared import RGBColor

document=Document( )
#添加段落
# paragraph=document.add_paragraph().add_run('this is test for left_indent with inches.111111111111111111111111111111111111111111111111111111111111111111111111111')
paragraph=document.add_paragraph('this is test for left_indent with inches')
#获取段落样式
paragraph_format=paragraph.paragraph_format
#1.段落整体缩进
# paragraph_format.left_indent=Inches(0.3) #调整左缩进0.3英寸
#paragraph_format.right_indent = Pt(20) #设置段落从右开始缩进,使用Pt来衡量

#2.首行缩进0.74厘米,即2个字符
paragraph_format.first_line_indent = Cm(0.74)
paragraph_format.alignment=WD_ALIGN_PARAGRAPH.CENTER #内容居中

#4.行间距
#设置与上一段间隔 Pt(5)
# paragraph.space_after = Pt(20)
#设置与下一段间隔 Pt(10)
# paragraph.space_before = Pt(10)

#5.字体操作
add_run1 = paragraph.add_run("追加段落") #追加段落

# paragraph.style.font.bold = True #整体段落加粗
add_run1.font.bold = True #追加段落加粗

# paragraph.style.font.italic = True #整体斜体
add_run1.font.italic = True #追加斜体

# paragraph.style.font.underline = True #整体下划线
add_run1.font.underline = True #追加内容下划线

# add_run1.font.color.rgb=RGBColor(0x42, 0x24 , 0xE9) #追加内容颜色
paragraph.style.font.color.rgb=RGBColor(0x42, 0x24 , 0xE9) #整体内容颜色

#字体大小
paragraph.style.font.size = Pt(20)
add_run1.font.size = Pt(20)

#字体样式
#设置西文字体
paragraph.style.font.name = '仿宋'
# add_run1.font.name = '仿宋'
# 设置中文字体
# paragraph.style.element.rPr.rFonts.set(qn('w:eastAsia'), '微软雅黑')

#6.设置段落内部文字在遇到需分页情况时处理状态
  par2.paragraph_format.keep_together = True # 段中不分页
  par2.paragraph_format.keep_with_next = True # 与下段同页
  par2.paragraph_format.page_break_before = True # 段前分页
  par2.paragraph_format.widow_control = True # 孤行控制

document.save('段落.docx')

三 表格

1.写

from docx import Document
from docx.shared import Inches
#样式
from docx.enum.text import WD_ALIGN_PARAGRAPH
from docx.shared import Cm, Pt
from docx.oxml.ns import qn
##字体颜色
from docx.shared import RGBColor
#5.操作表格

document=Document(  )
"""
在Word中使用表格是一个比较复杂的内容。这一点与使用Python操作Excel相差不大,本节不会涉及太多与样式有关的内容,关于样式会在《在word文档中使用样式》使用样式一节中做详述的说明。
如果想要熟练使用python-docx操作Word文档,需要认识Table()、_Cell()、 _Row()、 _Rows() _Column() 和 _Columns()五个类。
在Word文档中添加表格需要使用Document()对象的add_table()方法。
"""
#1。创建表格:add_table(rows, cols, style=None) add_table()方法会返回一个Table对象。rows代表行数,cols代表列数,style代表样式。
table_obj = document.add_table(3, 3,style='Table Grid')

# """
# 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对象)的列表
# """
#2.添加列
# table_obj.add_column(3)
#3.添加行
# table_obj.add_row()
#4.单个单元格操作
# """
# cell()方法实际上是返回了一个_Cell()对象。_Cell()对象代表的是一个具体的单元格,包含了操作一个单个单元格的方法与属性,如下:
# add_paragraph(text=u'', style=None):在单元格内添加段落。
# add_table(rows, cols):在单元格中添加表格
# merge(other_cell):合并单元格
# """
#4.1选取某一单元格
cell_obj = table_obj.cell(1,1)
print(cell_obj) #<docx.table._Cell object at 0x000001AD64AE0910>
#4.2添加段落
cell_obj.add_paragraph(text='11', style=None)
print(1,cell_obj.text,9)
#删除段落
table_obj.cell(1, 1).text = ''
print(2,cell_obj.text,10) #"11"
#4。3表格添加内容
paragraph = table_obj.cell(0, 1).text='33'
print(3, table_obj.cell(0, 1).text) #"33"
#删除单元格数据
paragraph = table_obj.cell(0, 1).text=''
print(4, table_obj.cell(0, 1).text) #"33"
#4.4合并单元格
# table_obj.cell(0,0).merge(table_obj.cell(2,2))
c2 =cell_obj.merge(table_obj.cell(2,2))
c2.add_paragraph(text='22', style=None)

# 5.3 行与列操作:rows,columns
"""
1.
rows:返回的是_Rows对象,是一个包含了所有行(_Row对象)的列表
columns:返回的是_Columns对象,是一个包含了所有列(_Column对象)的列表
2.方法
这时它的元素是表格中的每一行/列。_Rows/_Columns对象中包含了一个属性,如下:

table:用来返回它所属的列表
_Row对象代表是表格中的行,具有如下属性:

cells:即这一行所有的单元格,是个列表
height:行高
height_rule:行高规则,如果没有设置,则默认没有
table:用来返回它所属的列表
_Column对象代表的是表格中的列,具有如下属性:

cells:即这一列所有的单元格,是个列表
table:用来返回它所属的列表
width:列宽
"""
#1.获取行与列
row_ls = table_obj.rows

document.save('表格.docx')

# 获取文档中表格信息
tables = doc.tables # 获取文档中所有表格对象的列表
print(tables)
# [<docx.table.Table object at 0x000001957059CD48>]
print(len(tables)) # 查看文档中表格数量
# 1
table0 = tables[0]  # 获取表格对象

# 获取表格的样式信息
print(table0.style)
# _TableStyle('Normal Table') id: 190621384

# 获取一个表格的所有单元格
cells = table0._cells
print(len(cells)) # 表格中单元格数量
# 15

# 获取单元格内所有文字信息
cells_string = [cell.text for cell in cells]
print(cells_string)


# 获取表格对象行数量、列数量
col_num = len(table0.columns)
print(col_num) # 3
# 行数量
row_num = len(table0.rows)
print(row_num) # 5

# 获取行对象
row0 = table0.rows[0]
# 获取列对象
col0 = table0.columns[0]

# 获取行对象文字信息
'要用 row0.cells 获取行对象的 cell 才能获取其文字信息'
row0_string = [cell.text for cell in row0.cells]
print(row0_string)

# 获取列对象文字信息
col0_string = [cell.text for cell in col0.cells]
print(col0_string)

四 图片

1.写

from docx import Document,shared
from docx.shared import Inches
#样式
from docx.enum.text import WD_ALIGN_PARAGRAPH
from docx.shared import Cm, Pt
from docx.oxml.ns import qn
##字体颜色
from docx.shared import RGBColor

document = Document()

#1.添加图片:add_picture(self, image_path_or_stream, width=None, height=None)
# 在文档中增加图片,并对设置图片大小,当只设置一个方向的长度(宽或高)时,另一方向会自动缩放.
document.add_picture('编程杂艺.png',width=shared.Inches(1))  # 按英寸设置
document.add_picture('编程杂艺.png',height=shared.Cm(2))  # 按厘米设置


#4.生成文件
document.save("1-使用图片.docx") #文件路径

四 章节页眉页脚

1.新建章节

sec = document.sections
print(sec) # <docx.section.Sections object at 0x000000000B312E88>
print(len(sec)) # 1

# 新建一个章节
document.add_section()
print(len(sec)) # 2

2.获取文档页面边距:word 文档的页边距、页眉页脚的设置和章节对象有关:


from docx import Document
#1.读取文档
doc = Document('1-使用页.docx')
#2. 获取文档所有章节:列表
sections = doc.sections
print(sections)# <docx.section.Sections object at 0x000000000B2E1148>
# 查看章节数量
print(len(sections)) # 2
#3.获取单个章节
sec0 = sections[0]
# 获取页面边距值:(单位为像素)
print('左边距:',sec0.left_margin)
# 左边距: 1143000
print('右边距:',sec0.right_margin)
# 右边距: 1143000
print('上边距:',sec0.top_margin)
# 上边距: 914400
print('下边距:',sec0.bottom_margin)
# 下边距: 914400
print('页眉边距:',sec0.header_distance)
# 页眉边距: 457200
print('页脚边距:',sec0.footer_distance)
# 页脚边距: 457200

3.设置文档页面边距、页面大小

# 设置页面高度、宽度
sec0.page_height = shared.Inches(15)
sec0.page_width = shared.Inches(10)

# 也可以设置页面的边距:
sec0.left_margin = shared.Inches(1)
sec0.right_margin = shared.Inches(1)
sec0.top_margin = shared.Inches(2)
sec0.bottom_margin = shared.Inches(2)

4、设置页眉页脚和页面方向

设置页面页脚时,先获取页眉页脚对象:

#1. 设置页眉
head0 = sec0.header  # 返回页眉对象
font0 = sec0.footer  # 返回页脚对象
print(head0)
# <docx.section._Header object at 0x000000000B312E08>
print(font0)
# <docx.section._Footer object at 0x000000000B312B88>

"在设置word文档的页眉页脚时,有一个非常重要的是否与前一节相同"
# 查看页眉是否和上节一直
print(head0.is_linked_to_previous)  # 默认为 True

# 设置页眉
"页眉也是一个块级对象,里面也包含了 Paragraph 对象,"
"所以对齐方式,文字格式设置方式和前文介绍一致。"
#页眉页脚
sec = document.sections
sec0 = sec[0] # 获取章节对象
head0 = sec0.header # 返回页眉对象
font0 = sec0.footer # 返回页脚对象

#设置页眉
head0_par = head0.paragraphs[0]
head0_par.add_run('页眉')

# 设置页脚
font0_par = font0.paragraphs[0]
font0_par.add_run('页脚')
 # 注: 设置页脚按序列增加的方式暂未找到

# 导入设置页面方向所需模块
from docx.enum.section import WD_ORIENT
# 获取章节对象
section = document.sections[0]
# 设置页面方向
section.orientation = WD_ORIENT.LANDSCAPE # 横向

可设置项有横向( LANDSCAPE ) 和纵向 ( PORTRAIT )

 背景颜色设置方法: (与字体颜色设置方法有区别)

# 设置背景颜色
from  docx.enum.text import WD_COLOR_INDEX
run_2.font.highlight_color = WD_COLOR_INDEX.YELLOW

背景颜色可选值有:
'''
'AUTO', 0, 'default'
'BLACK', 1, 'black'
'BLUE', 2, 'blue'
'BRIGHT_GREEN', 4, 'green',
'DARK_BLUE', 9, 'darkBlue',
'DARK_RED', 13, 'darkRed'
'DARK_YELLOW', 14, 'darkYellow'
'GRAY_25', 16, 'lightGray'
'GRAY_50', 15, 'darkGray'
'GREEN', 11, 'darkGreen'
'PINK', 5, 'magenta'
'RED', 6, 'red'
'TEAL', 10, 'darkCyan'
'TURQUOISE', 3, 'cyan'
'VIOLET', 12, 'darkMagenta'
'WHITE', 8, 'white'
'YELLOW', 7, 'yellow'
'''

分页

from docx import Document
document = Document()
document.add_paragraph('这是第一页')
document.add_page_break()
document.add_paragraph('这是第二页')
document.save("5-使用分页.docx")
原文地址:https://www.cnblogs.com/tfzz/p/14676157.html