2025年3月22日 星期六 甲辰(龙)年 月廿一 设为首页 加入收藏
rss
您当前的位置:首页 > 计算机 > 编程开发 > Python

python-docx操作word文件

时间:08-16来源:作者:点击数:77
城东书院 www.cdsy.xyz

该博客详细介绍了如何使用Python的`python-docx`库来读写Word文档,包括读取段落、指定段落、块、标题、正文以及样式。还展示了如何写入标题、正文、分页符、图片、表格,以及进行对齐、删除、插入和格式化操作。此外,还涵盖了将Word批量转换为PDF的方法。

装模块

  • pip install python-docx

读word ↓↓↓

读全部word段落

  • from docx import Document
  • a = Document(r'C:\Users\Administrator\Desktop\test1.docx') # word文件路径
  • for i in a.paragraphs: # word对象的item
  • print(i.text)

读指定word段落

  • from docx import Document
  • a = Document(r'C:\Users\Administrator\Desktop\test1.docx')
  • for i in a.paragraphs[0:3]: # 可以对word对象切片操作
  • print(i.text)

读word中每段落中的块

  • #块就是一个段落中的不同格式的文字
  • from docx import Document
  • a = Document(r'C:\Users\Administrator\Desktop\test1.docx')
  • b = a.paragraphs[0] # 取第一段落 -- 返回列表
  • c = b.runs # 取第一段落中每个块 -- 返回列表
  • for i in c: # 遍历段落中所有的对象,
  • print(i.text)

读word操作示例

  • #计算文档中所有段落出现'1'的次数
  • from docx import Document
  • a = Document(r'C:\Users\Administrator\Desktop\test1.docx')
  • numbers = 0
  • for i in a.paragraphs: # 这个只能拿到段落,(注意不能拿到表格)
  • if '1' in i.text:
  • numbers += 1
  • print(numbers)
  • #计算文档中的表格出现'1'的次数
  • from docx import Document
  • a = Document(r'C:\Users\Administrator\Desktop\test1.docx')
  • numbers = 0
  • for i in a.tables: #拿所有表格
  • forin i.rows: #根据'行'遍历,拿到每一行的数据
  • for 单元格 in 行.cells: #遍历'行',拿到每个单元格的数据
  • if '0' in 单元格.text:
  • numbers += 1
  • print(numbers)

只读word中标题

  • # 读段落中的指定标题
  • from docx import Document
  • a = Document(r'C:\Users\Administrator\Desktop\test1.docx')
  • for i in a.paragraphs:
  • if i.style.name == 'Heading 1': # Heading 1代表1级标题, 同理 Heading 2 代表2级,最高到9级
  • print(i.text)
  • #读所有标题(模块中暂无方法支持,这里用正则去写)
  • from docx import Document
  • import re
  • a = Document(r'C:\Users\Administrator\Desktop\test1.docx')
  • for i in a.paragraphs:
  • if re.match('^Heading \d+$', i.style.name): # 正则匹配数字
  • print(i.text)

只读word中正文

  • from docx import Document
  • a = Document(r'C:\Users\Administrator\Desktop\test1.docx') # word文件路径
  • for i in a.paragraphs: # word对象的item
  • if i.style.name == 'Normal': # Normal 代表正文
  • print(i.text)

读word中的所有样式类

  • from docx import Document
  • from docx.enum.style import WD_STYLE_TYPE
  • a = Document(r'C:\Users\Administrator\Desktop\test1.docx') # word文件路径
  • title = a.styles
  • for i in title:
  • if i.type == WD_STYLE_TYPE.PARAGRAPH:
  • print(i.name)

写word↓↓↓

#写入标题

  • from docx import Document
  • a = Document()
  • a.add_heading('添加的一级标题', level=0) # add_heading('标题内容', 标题的级数(支持0-9))
  • a.save(r'C:\Users\Administrator\Desktop\111.docx')

写入正文(段落)

  • from docx import Document
  • a = Document()
  • a.add_paragraph('正文')
  • a.save(r'C:\Users\Administrator\Desktop\111.docx')

写入分页符

  • from docx import Document
  • a = Document()
  • a.add_page_break() # 跳到下一页(分页符)
  • a.add_paragraph('正文')
  • a.save(r'C:\Users\Administrator\Desktop\111.docx')

写入正文中的块

  • from docx import Document
  • a = Document()
  • b = a.add_paragraph('我是正文在我后面添加的文字会被设置格式:')
  • b.add_run('加粗').bold = True
  • b.add_run('普通')
  • b.add_run('斜体').italic = True
  • a.save(r'C:\Users\Administrator\Desktop\111.docx')
在这里插入图片描述

定位word中某个段落进行操作

  • #定位方法
  • from docx import Document
  • a = Document(r'C:\Users\Administrator\Desktop\111.docx')
  • print(len(a.paragraph)) # 总共有多少段落
  • b = a.paragraph[0] # 定位到第一段
  • print(b.text)
  • #在段落中某一段落之前插入新的段落
  • from docx import Document
  • a = Document(r'C:\Users\Administrator\Desktop\111.docx')
  • print(len(a.paragraph)) # 总共有多少段落
  • b = a.paragraph[0] # 定位到第一段
  • b.insert_paragraph_before('这是新添加的段落在第一段之前')
  • b.save(r'C:\Users\Administrator\Desktop\111.docx')

插入图片与删除(获取插入图片的像素)

插入图片且设置图片的大小

  • from docx import Document
  • from docx.shared import Cm # 设置图片宽高的类
  • a = Document()
  • a.add_picture(r'C:\Users\Administrator\Desktop\微信图片_20210212222846.jpg', width=Cm(13), height=Cm(8))
  • # 添加图片宽高
  • a.save(r'C:\Users\Administrator\Desktop\111.docx')

给word中表格中添加图片

  • from docx import Document
  • from docx.shared import Cm
  • a = Document()
  • run = a.tables[0].cell(0, 0).paragraphs[0].add_run()
  • # 文档中第一个表格中0行0列的单元格,中第一个段落中添加一个块
  • run.add_picture(r'C:\Users\Administrator\Desktop\微信图片_20210212222846.jpg', width=Cm(13), height=Cm(8))
  • a.save(r'C:\Users\Administrator\Desktop\111.docx')

#删除图片

  • from docx import Document
  • a = Document(r'C:\Users\Administrator\Desktop\111.docx')
  • b = a.paragraphs[1]
  • photo = len(a.inline_shapes)
  • b.clear() # 注意这里只是删除了第2个段落中的图片

插入多张图片,以其中某一张图片的比例为基准插入图片

  • from docx import Document
  • a = Document()
  • a1 = a.paragraphs[0].add_run().add_picture('图片1路径.jpg')
  • a2 = a.paragraphs[1].add_run().add_picture('图片2路径.jpg')
  • a1.height = int(a.inline_shapes[0].height * (a.inline_shapes[1].height / a.inline_shapes[0].height))
  • a1.widht = int(a.inline_shapes[0].widht * (a.inline_shapes[1].widht / a.inline_shapes[0].widht))
  • # 逻辑: 图1高 = (图1的高 * (图1高 / 图2高))
  • a.save(r'C:\Users\Administrator\Desktop\111.docx')
  • print(a.inline_shapes[0].height) # 第一个图片的高度
  • print(a.inline_shapes[1].height) # 第二个图片的高度

对齐操作

  • from docx import Document
  • from docx.shared import Cm
  • from docx.enum.text import WD_PARAGRAPH_ALIGNMENT
  • a = Document()
  • photo = a.add_picture(r'C:\Users\Administrator\Desktop\微信图片_20210212222846.jpg', width=Cm(5), height=Cm(5))
  • a.paragraphs[0].alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
  • a.save(r'C:\Users\Administrator\Desktop\11.docx')
  • # CENTER(居中) LEFT(左对齐) RIGHT(右对齐) JUSTIFY(两端对齐) DISTRIBUTE(分散对齐)

word中插入表格

新建表格

  • from docx import Document
  • a = Document()
  • a1 = [
  • ['姓名', '性别', '年龄'],
  • ['王大锤', '男', 20],
  • ['白元芳', '女', 25]
  • ]
  • r = 3 # 行
  • c = 3
  • tables = a.add_table(rows=r, cols=c)
  • for rs in range(r):
  • r_num = tables.rows[rs].cells # 每一行的所有单元格
  • for cs in range(c):
  • r_num[cs].text = str(a1[rs][cs])
  • a.save(r'C:\Users\Administrator\Desktop\11.docx')

在原表的基础上增加表的行列数

  • from docx import Document
  • from docx.shared import Cm
  • a = Document(r'C:\Users\Administrator\Desktop\11.docx')
  • a.tables[0].add_row() # 在原表的基础上增加一行
  • a.tables[0].add_column(Cm(5)) # 添加列必须设置列宽
  • a.save(r'C:\Users\Administrator\Desktop\11.docx')

查看表中的行列数量

  • from docx import Document
  • a = Document(r'C:\Users\Administrator\Desktop\11.docx')
  • print(len(a.tables[0].rows)) # 多少行
  • print(len(a.tables[0].columns)) # 多少列
  • row = a.tables[0].rows[0] # 第一行 # 定位元素
  • col = a.tables[0].columns[0] # 第一列

删除表中数据

  • #删除指定行
  • from docx import Document
  • a = Document(r'C:\Users\Administrator\Desktop\11.docx')
  • print(len(a.tables)) # 查看有多少表格
  • table1 = a.tables[0] # 定位为第一张表
  • print(len(table1.rows), len(table1.columns)) # 查看行数与列数
  • t2 = table1.rows[1] # 定位到第二行
  • t2._element.getparent().remove(t2._element) # 删除指定行
  • print(print(len(table1.rows), len(table1.columns)))
  • a.save(r'C:\Users\Administrator\Desktop\11.docx')
  • #删除指定列
  • from docx import Document
  • a = Document(r'C:\Users\Administrator\Desktop\11.docx')
  • print(len(a.tables)) # 查看有多少表格
  • table1 = a.tables[0] # 定位为第一张表
  • cl = table1.columns[0] # 第一列
  • for i in cl.cells:
  • i._element.getparent().remove(i._element) # 删除第一列的所有数据
  • a.save(r'C:\Users\Administrator\Desktop\11.docx')
  • #删除整张表
  • from docx import Document
  • a = Document(r'C:\Users\Administrator\Desktop\11.docx')
  • t1 = a.tables[0]
  • t1._element.getparent().remove(t1._element)
  • a.save(r'C:\Users\Administrator\Desktop\11.docx')

给表格中指定单元格中录入内容

  • #方法1(不可做格式类的操作,比如对齐)
  • from docx import Document
  • a = Document()
  • t1 = a.add_table(3, 3)
  • t1.cell(0, 0).text = '赋值' # 0行0列
  • a.save(r'C:\Users\Administrator\Desktop\11.docx')
  • #方法2
  • from docx import Document
  • from docx.enum.text import WD_PARAGRAPH_ALIGNMENT
  • a = Document()
  • t1 = a.add_table(3, 3)
  • pa = t1.cell(0, 2).paragraphs[0] # 0行 2列 第一个段落添加
  • pa.text = '方法2'
  • pa.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER #居中对齐
  • a.save(r'C:\Users\Administrator\Desktop\11.docx')
  • #方法3 (从excel中拿内容录入word)
  • import pandas as pd
  • from docx import Document
  • a = pd.read_excel('excel路径', header=None)
  • file = Document('word路径')
  • t = file.add_table(3, 4)
  • for i in range(3):
  • for c in range(4):
  • t.cee(i, c).text = str(a.iloc[i, c])
  • file.save('保存后的路径.docx')

删除表中指定单元格的内容(删整行/整列)

  • 方法1(单个单元格)
  • from docx import Document
  • a = Document('word路径')
  • t = a.tables[0] # 第一张表
  • t.cell(0, 0).text = ''
  • 方法2(单个单元格)
  • from docx import Document
  • a = Document('word路径')
  • t = a.tables[0]
  • b = t.cell(0, 1).paragraphs[0].text = ''
  • a.save()
  • 方法3(删整行)
  • from docx import Document
  • a = Document('word路径')
  • t = a.tables[0]
  • for i in t.rows[0].cells:
  • i.text = ''
  • a.save()
  • 方法4(删整列)
  • from docx import Document
  • a = Document('word路径')
  • t = a.tables[0]
  • for i in t.columns[0].cells:
  • i.text = ''
  • a.save()

表的对齐方式

  • from docx import Document
  • from docx.enum.table import WD_TABLE_ALIGNMENT # 表格对齐方式
  • a = Document('word路径')
  • t = a.tables[0] # 取文档中第一个表格
  • t.alignment = WD_TABLE_ALIGNMENT.RIGHT # RIGHT(右) CENTER(居中) RIGHT(右)
  • a.save('c:/14.docx')

调整表格的列宽(行高)

  • #列宽
  • from docx import Document
  • from docx.shared import Cm # 单位转换函数
  • a = Document('word路径')
  • t = a.tables[0]
  • forin t.columns:
  • for 单元格 in 列.cells:
  • 单元格.width = Cm(1)
  • a.save('c:/14.docx')
  • #行高
  • from docx import Document
  • from docx.shared import Cm # 单位转换函数
  • a = Document('word路径')
  • t = a.tables[0]
  • forin t.rows:
  • for 单元格 in 行.cells:
  • 单元格.height = Cm(1)
  • a.save('c:/14.docx')

表格中单元格的对齐方式

在这里插入图片描述
  • from docx import Document
  • from docx.enum.table import WD_CELL_VERTICAL_ALIGNMENT # 单元格垂直对齐
  • from docx.enum.text import WD_PARAGRAPH_ALIGNMENT # 段落对齐
  • a = Document('文件路径')
  • t = a.tables[0]
  • cl = t.cell(0, 1) # 指定第一行第二列的单元格
  • cl.vertical_alignment = WD_CELL_VERTICAL_ALIGNMENT.TOP # 顶部对齐
  • cl.paragraphs[0].alignment = WD_PARAGRAPH_ALIGNMENT.CENTER # 段落居中对齐
  • a.save('c:/11.docx')

表格样式

  • #查询代码中所有表格样式(生成表格样式)
  • from docx.enum.style import WD_STYLE_TYPE
  • from docx import Document
  • a = Document()
  • styles = a.styles
  • for i in styles:
  • if i.type == WD_STYLE_TYPE.TABLE:
  • a.add_paragraph('表格样式:' + i.name)
  • t = a.add_table(3, 3, style=i)
  • c5 = t.rows[0].cells
  • c5[0].text = '第一列内容'
  • c5[1].text = '第二列内容'
  • c5[2].text = '第三列内容'
  • a.add_paragraph('\n')
  • a.save(r'C:\Users\Administrator\Desktop\1.docx')
  • #创建带线的表格(参考上面的代码)
  • from docx import Document
  • a = Document()
  • t = a.add_table(3, 3, style='Medium Grid 1 Accent 1') # 根据上面的代码参考样式
  • t_name = t.rows[0].cells
  • t_name[0].text = '姓名'
  • t_name[1].text = '性别'
  • t_name[2].text = '年龄'
  • a.save('文件路径.docx')
  • # 修改单元格所有的字体
  • forin t.rows:
  • for 单元格 in 行.cells:
  • for 段落 in 单元格.paragraphs:
  • forin 段落.runs:
  • 块.font.name = 'Arial' # 英文字体设置
  • 块._element.rPr.rFonts.set(qn('w:eastAsia'), '微软雅黑') # 设置中文字体
  • a.save('文件路径.docx')

文字样式

修改文档中所有文字的样式

  • from docx.oxml.ns import qn
  • from docx import Document
  • from docx.shared import Pt, RGBColor # 字号,颜色
  • a = Document()
  • for 段落 in a.paragraphs:
  • forin 段落.runs:
  • 块.font.name = 'Arial' # 文档中非中文内容的字体
  • 块._element.rPr.rFonts.set(qn('w:eastAsia'), '微软雅黑') # 文档中中文字体的样式
  • 块.font.bold = True # 加粗
  • 块.font.italic = True # 斜体
  • 块.font.underline = True # 下划线
  • 块.font.strike = True # 删除线
  • 块.font.shadow = True # 阴影
  • 块.font.all_caps = True # 全部大写字母
  • 块.font.size = Pt(24) # 24号字
  • 块.font.color.rgb = RGBColor(255, 0, 0) # 颜色
  • a.save('文件.docx')

指定修改文档中样式

  • from docx.oxml.ns import qn
  • from docx import Document
  • a = Document()
  • a.styles['Normal'].font.name = 'Arial' # 正文
  • a.styles['Heading 1'].font.name = 'Arial' # 标题
  • a.styles['Normal']._element.rPr.rFonts.set(qn('w:eastAsia'), '微软雅黑') # 文档中正文文字体的样式
  • a.styles['Heading 1']._element.rPr.rFonts.set(qn('w:eastAsia'), '黑体') # 文档中标题文字体的样式
  • a.save('文件.docx')

正文对齐方式

  • from docx import Document
  • from docx.enum.text import WD_ALIGN_PARAGRAPH
  • a = Document()
  • for i in a.paragraphs:
  • if i.style.name == 'Normal': #如果想居中标题,这里改标题就行
  • i.alignment = WD_ALIGN_PARAGRAPH.CENTER # LEFT(左) RIGHT(右) CENTER(中) JUSTIFY(两端) DISTRIBUTE(分散)
  • a.save('文件.docx')

正文的行间距

  • from docx import Document
  • a = Document()
  • for i in a.paragraphs:
  • if i.style.name == 'Normal': # 正文 (如果要改全部就取消if语句)
  • i.paragraph_format.line_spacing = 9.0 # 行间距
  • a.save('文件.docx')

正文缩进

正文整体缩进

  • from docx import Document
  • from docx.shared import Inches # pt磅 cm厘米 inches英寸 mm毫米
  • a = Document()
  • for i in a.paragraphs:
  • if i.style.name == 'Normal': # 如果等于正文
  • i.paragraph_format.left_indent = Inches(0.3) # 右缩进right_indent
  • a.save('文件.docx')

首行缩进

  • from docx import Document
  • from docx.shared import Inches
  • a = Document()
  • for i in a.paragraphs:
  • if i.style.name == 'Normal': # 如果等于正文
  • i.paragraph_format.first_line_indent = Inches(0.3) # 首行缩进
  • a.save('文件.docx')

悬挂缩进(首行不缩进,其余缩进)

  • from docx import Document
  • from docx.shared import Inches # pt磅 cm厘米 inches英寸 mm毫米
  • a = Document()
  • for i in a.paragraphs:
  • if i.style.name == 'Normal': # 如果等于正文
  • i.paragraph_format.first_line_indent = Inches(-0.3) # 改为负数即可悬挂缩进
  • a.save('文件.docx')

节、段落

查询空文档的节和段落

  • from docx import Document
  • a = Document()
  • print(len(a.sections)) # 节
  • print(len(a.paragraphs)) # 段落

添加节

  • from docx import Document
  • a = Document()
  • print(len(a.sections)) # 节
  • print(len(a.paragraphs)) # 段落
  • a.add_section() # 添加一个节
  • print(len(a.sections)) # 节
  • print(len(a.paragraphs)) # 段落

每节中添加段落

  • from docx import Document
  • a = Document()
  • print(len(a.sections)) # 节
  • print(len(a.paragraphs)) # 段落
  • a.add_section() # 添加一个节
  • print(len(a.sections)) # 节
  • print(len(a.paragraphs)) # 段落
  • a.paragraphs[0].add_run('第一节中的块')
  • a.paragraphs[1].add_run('第二节中的块')
  • a.save('c:/18.docx')

对节的定位

  • from docx import Document
  • a = Document('文件路径')
  • b = a.sections[0] # 切片

改分节符

  • from docx import Document
  • from docx.enum.section import WD_SECTION_START
  • a = Document('路径')
  • b = a.sections[1]
  • print('改前分解符类型:', b.start_type) # 更改分节符之前
  • b.start_type = WD_SECTION_START.ODD_PAGE # 奇数分节符
  • print('改分节符之后:', b.start_type)
  • # CONTINUOUS 连续分隔符
  • # NEW_COLUMN 新列分隔符
  • # NEW_PAGE 新页的分隔符
  • # EVEN_PAGE 偶数页的分隔符
  • # ODD_PAGE 奇数页的分隔符

word批量转pdf

装模块

  • pip install comtypes

示例代码

  • import os
  • import comtypes.client
  • def get_path():
  • # 指定路径
  • path = 'C:/word'
  • # 获取所有文件名列表
  • filename_list = os.listdir(path)
  • # 获取所有word文件名列表
  • wordname_list = [filename for filename in filename_list if filename.endswith(('doc', 'docx'))]
  • for wordname in wordname_list:
  • # 分离word文件名和后缀,转化为pdf名
  • pafname = os.path.splitext(wordname)[0] + 'pdf'
  • # 如果当前word文件对应的pdf文件存在,则不转化
  • if pafname in filename_list:
  • continue
  • # 拼接路径和文件名
  • wordpath = os.path.join(path, wordname)
  • pdfpath = os.path.join(path, pafname)
  • # 生成器
  • yield wordpath, pdfpath
  • def convert_word_to_pdf():
  • word = comtypes.client.CreateObject('Word.Application')
  • word.Visible = 0
  • for wordpath, pdfpath in get_path():
  • newpdf = word.Documents.Open(wordpath)
  • newpdf.SaveAs(pdfpath, FileFormat=17)
  • newpdf.Close()
  • if __name__ == '__main__':
  • convert_word_to_pdf()
城东书院 www.cdsy.xyz
方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门
本栏推荐