您当前的位置:首页 > 计算机 > 编程开发 > Python

python-docx操作word文件

时间:08-16来源:作者:点击数:
城东书院 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:                   #拿所有表格
    for 行 in 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]
for 列 in 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]
for 行 in 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')



# 修改单元格所有的字体
for 行 in t.rows:
    for 单元格 in 行.cells:
        for 段落 in 单元格.paragraphs:
            for 块 in 段落.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:
    for 块 in 段落.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
方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门
本栏推荐