参考博主: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/#
全局设置
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")