百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

Python操作Word文档神器:python-docx库从入门到精通

off999 2025-07-07 22:16 42 浏览 0 评论

Python操作Word文档神器:python-docx库从入门到精通


动动小手,点击关注,感谢您的阅读,您的关注是我最大的动力!!!!


在办公自动化场景中,处理 Word 文档是常见需求。python-docx库让你无需手动操作,即可通过 Python 代码轻松创建、修改和解析 Word 文档(.docx 格式)。本文将带你掌握其核心功能,并通过实用案例提升你的办公效率!

一、基础操作:创建与打开文档

1. 创建新文档

核心函数

  • Document():创建一个空白的 Word 文档对象。
  • add_heading(text,level=1):添加标题。level从0到9,默认为1;0为文章标题,大于1的为小标题。
  • add_paragraph(text):添加段落。
  • save(path):保存文档。生成的文件为.docx 格式,而非 .doc。

案例:创建简单的文档

from docx import Document

# 创建文档对象
doc = Document()

# 添加标题(级别1)
doc.add_heading('欢迎使用Python生成文档', level=1)

# 添加段落
doc.add_paragraph('这是使用python-docx库自动生成的文档。')
doc.add_paragraph('下面将展示更多功能...')

# 保存文档
doc.save('python-doc.docx')

2. 打开并修改现有文档

核心函数

  • Document('path.docx'):打开现有文档。
  • 属性paragraphs:获取所有段落对象(不是段落的内容)到列表,可通过段落对象的text属性获取段落内容,并支持修改内容。

案例:在已有文档中添加内容

from docx import Document

# 打开现有文档
doc = Document('python-doc.docx')

# 添加新段落
doc.add_paragraph('新增内容:这是后续添加的段落。')

# 修改第一段内容
doc.paragraphs[0].text = '更新后的标题:Python办公自动化'

# 保存修改
doc.save('updated.docx')

闭坑指南

操作前确保文档未被其他程序(如 Word)打开,否则会抛出权限错误。

二、文本格式化:段落、字体与样式

1. 段落格式化

核心函数

  • add_paragraph(text):添加段落。
  • add_run(text):在段落中添加文本块(可单独设置格式)。
  • alignment:设置段落对齐方式(0 = 左对齐,1 = 居中,2 = 右对齐)。

可以引用from docx.enum.text import WD_PARAGRAPH_ALIGNMENT,对应属性值如下:

案例:创建带格式的段落

from docx import Document
from docx.enum.text import WD_PARAGRAPH_ALIGNMENT

doc = Document()

# 添加居中对齐的标题
title = doc.add_heading(level=1)
title_run = title.add_run('居中标题')
title.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER  #设置CENTER居中

# 添加带格式的段落
p = doc.add_paragraph()
p.add_run('加粗文本').bold = True #设置为加粗
p.add_run(' 普通文本 ')
p.add_run('斜体文本').italic = True   #设置为斜体

# 右对齐段落
p.alignment = WD_PARAGRAPH_ALIGNMENT.RIGHT  #设置RIGHT靠右

doc.save('formatted.docx')

2. 字体样式设置

核心函数

函数 / 属性

功能描述

font.name

设置字体名称(如:'宋体'、'微软雅黑'、'黑体'、'Arial')

font.size

设置字体大小(单位:磅,如:Pt(12))

font.bold

设置加粗(True/False)

font.italic

设置斜体(True/False)

font.underline

设置下划线(True/False 或线型样式)

font.color.rgb

设置字体颜色(如:RGBColor(255, 0, 0),初始化3个int值(0-255),分别代表红,绿,蓝)

font.strike

设置删除线(True/False)

font.subscript

设置下标(True/False)

font.superscript

设置上标(True/False)

1. 基础字体设置

from docx import Document
from docx.shared import Pt
from docx.shared import RGBColor

doc = Document()
p = doc.add_paragraph()

# 添加文本并设置字体
run = p.add_run('这是宋体,16磅,加粗,红色')
run.font.name = '宋体'
run.font.size = Pt(16)
run.font.bold = True
run.font.color.rgb = RGBColor(255, 0, 0)

# 添加另一段文本,设置不同字体
run = p.add_run(' 这是Arial,12磅,斜体,蓝色')
run.font.name = 'Arial'
run.font.size = Pt(12)
run.font.italic = True
run.font.color.rgb = RGBColor(0, 0, 255)

doc.save('font_example.docx')

2. 混合字体样式(上标、下标、下划线)

from docx import Document
from docx.shared import Pt

doc = Document()
p = doc.add_paragraph()

# 上标示例:X^2
p.add_run('X').font.size = Pt(12)
sup = p.add_run('2')
sup.font.superscript = True
sup.font.size = Pt(8)

p.add_run(' + ')

# 下标示例:HO
p.add_run('H').font.size = Pt(12)
sub = p.add_run('2')
sub.font.subscript = True
sub.font.size = Pt(8)
p.add_run('O')

# 下划线示例
p.add_run(' 这是下划线文本').font.underline = True

doc.save('font_special.docx')

3.批量设置多个 Run 的字体

from docx import Document
from docx.shared import Pt

def set_font(run, font_name, size, bold=False, italic=False):
    run.font.name = font_name
    run.font.size = Pt(size)
    run.font.bold = bold
    run.font.italic = italic
    return run

doc = Document()
p = doc.add_paragraph()

# 批量设置
set_font(p.add_run('标题1'), '黑体', 16, bold=True)
p.add_run('\n')  # 换行
set_font(p.add_run('正文内容...'), '宋体', 12)

doc.save('batch_font.docx')

4. 读取并修改现有文档的字体

from docx import Document
from docx.shared import Pt

doc = Document('existing.docx')

# 遍历所有段落和Run,修改字体
for p in doc.paragraphs:
    for run in p.runs:
        run.font.name = '宋体'
        run.font.size = Pt(12)

doc.save('modified_font.docx')

PS:

段落与 Run 的区别:段落(Paragraph)是文档的基本结构单位,而Run是段落内具有相同格式的文本块。若直接对段落设置字体,会影响整个段落:

p = doc.add_paragraph() p.style.font.name = '宋体' # 整个段落使用宋体

体颜色设置:使用RGBColor时,值范围为 0-255。常见颜色的 RGB值:

颜色名称

RGB 值(Red, Green, Blue)

黑色

(0, 0, 0)

白色

(255, 255, 255)

红色

(255, 0, 0)

绿色

(0, 255, 0)

蓝色

(0, 0, 255)

黄色

(255, 255, 0)

青色

(0, 255, 255)

品红色

(255, 0, 255)

灰色

(128, 128, 128)

橙色

(255, 165, 0)

紫色

(128, 0, 128)

字体大小单位:使用Pt()指定磅值,而非像素(如:Pt(12) 对应Word中的12号字体)。

三、表格与列表操作

1. 创建表格

核心函数

  • add_table(rows, cols):创建表格。
  • cell(row, col).text:设置单元格文本。
Document.add_table(rows, cols, style=None)

参数说明:rows:表格的行数(整数),cols:表格的列数(整数),style:表格样式(可选,如'Table Grid')

返回值:返回一个Table对象,可用于后续操作(如填充数据、设置格式)。

from docx import Document

doc = Document()

# 创建4行4列的表格
table = doc.add_table(rows=4, cols=4, style='Table Grid')

# 填充表头 table.rows[0]表示第1行,table.rows[0].cells表示第1行的列对象
hdr_cells = table.rows[0].cells
hdr_cells[0].text = '姓名'  #填充第1列的内容
hdr_cells[1].text = '年龄'  #填充第2列的内容
hdr_cells[2].text = '性别'  #填充第3列的内容
hdr_cells[3].text = '职业'  #填充第4列的内容

# 填充数据
data = [
    ('张三', 25, '男', '工程师'),
    ('李四', 30, '女', '设计师'),
    ('王五', 28, '男', '产品经理')
]

for row_idx, row_data in enumerate(data, 1):
    row_cells = table.rows[row_idx].cells
    for col_idx, cell_data in enumerate(row_data):
        row_cells[col_idx].text = str(cell_data)

doc.save('simple_table.docx')

程序执行后,打开docx文档,表格如下:

1). 合并单元格

# 合并第1行的前两列
table.cell(0, 0).merge(table.cell(0, 1))
table.cell(0, 0).text = '个人信息'

2). 设置单元格格式

from docx.shared import RGBColor

# 设置字体颜色
cell = table.cell(1, 0)  # 第2行第1列
cell.paragraphs[0].runs[0].font.color.rgb = RGBColor(255, 0, 0)  # 红色文本
cell.paragraphs[0].alignment = WD_PARAGRAPH_ALIGNMENT.CENTER         #居中
cell.paragraphs[0].runs[0].font.bold = True                      #加粗
 

3). 添加图片到表格

from docx.shared import Inches

# 在表格中插入图片
cell = table.cell(1, 3)  # 第2行第4列
cell.paragraphs[0].add_run().add_picture('photo.jpg', width=Inches(1.0))

以上几个场景,在主场景中增加后,执行结果如下:

2. 添加列表

核心函数

  • add_paragraph(text, style='List Bullet'):添加无序列表。
  • add_paragraph(text, style='List Number'):添加有序列表。

案例:创建购物清单

from docx import Document

doc = Document()
doc.add_heading('购物清单', level=2)

# 无序列表
doc.add_paragraph('水果', style='List Bullet')   #1级
doc.add_paragraph('苹果', style='List Bullet 2') #2级 
doc.add_paragraph('香蕉', style='List Bullet 2') #2级 

# 有序列表
doc.add_paragraph('步骤', style='List Number')
doc.add_paragraph('选择商品', style='List Number 2')
doc.add_paragraph('结账付款', style='List Number 2')

doc.save('shopping_list.docx')

四、高级操作:插入图片与页面设置

1. 插入图片

核心函数

  • add_picture(image_path, width, height):插入图片并设置尺寸。

案例:创建产品介绍文档

from docx import Document
from docx.shared import Inches

doc = Document()
doc.add_heading('产品介绍', level=1)

# 添加文本说明
doc.add_paragraph('这是我们的最新产品,具有以下特点:')

# 添加图片
doc.add_picture('product.jpg', width=Inches(4), height=Inches(3))

# 添加产品特性列表
features = ['高性能', '低功耗', '易操作', '长寿命']
for feature in features:
    doc.add_paragraph(feature, style='List Bullet')

doc.save('product_intro.docx')

2. 页面设置

核心函数

  • section.page_height:设置页面高度。
  • section.page_width:设置页面宽度。
  • section.orientation:设置页面方向(纵向 / 横向)。

案例:创建横向页面文档

from docx import Document
from docx.enum.section import WD_ORIENT

doc = Document()

# 获取第一个节(默认只有一个节)
section = doc.sections[0]

# 计算横向页面尺寸(交换宽高)
new_width, new_height = section.page_height, section.page_width
section.orientation = WD_ORIENT.LANDSCAPE
section.page_width = new_width
section.page_height = new_height

# 添加内容
doc.add_heading('横向页面示例', level=1)
doc.add_paragraph('这是一个横向页面的文档。')

doc.save('landscape_page.docx')

5、总结

python-docx 库为Word 文档自动化提供了强大支持,无论是简单的文本处理,还是复杂的表格、图片操作,都能轻松应对。通过本文的案例,你可以快速上手并应用到实际工作中,提升办公效率! 其他请参考官方文档:
https://python-docx.readthedocs.io/

相关推荐

Linux 网络协议栈_linux网络协议栈

前言;更多学习资料(包含视频、技术学习路线图谱、文档等)后台私信《资料》免费领取技术点包含了C/C++,Linux,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,Z...

揭秘 BPF map 前生今世_bpfdm

1.前言众所周知,map可用于内核BPF程序和用户应用程序之间实现双向的数据交换,为BPF技术中的重要基础数据结构。在BPF程序中可以通过声明structbpf_map_def...

教你简单 提取fmpeg 视频,音频,字幕 方法

ffmpeg提取视频,音频,字幕方法(HowtoExtractVideo,Audio,SubtitlefromOriginalVideo?)1.提取视频(ExtractVi...

Linux内核原理到代码详解《内核视频教程》

Linux内核原理-进程入门进程进程不仅仅是一段可执行程序的代码,通常进程还包括其他资源,比如打开的文件,挂起的信号,内核内部的数据结构,处理器状态,内存地址空间,或多个执行线程,存放全局变量的数据段...

Linux C Socket UDP编程详解及实例分享

1、UDP网络编程主要流程UDP协议的程序设计框架,客户端和服务器之间的差别在于服务器必须使用bind()函数来绑定侦听的本地UDP端口,而客户端则可以不进行绑定,直接发送到服务器地址的某个端口地址。...

libevent源码分析之bufferevent使用详解

libevent的bufferevent在event的基础上自己维护了一个buffer,这样的话,就不需要再自己管理一个buffer了。先看看structbufferevent这个结构体struct...

一次解决Linux内核内存泄漏实战全过程

什么是内存泄漏:程序向系统申请内存,使用完不需要之后,不释放内存还给系统回收,造成申请的内存被浪费.发现系统中内存使用量随着时间的流逝,消耗的越来越多,例如下图所示:接下来的排查思路是:1.监控系统中...

彻底搞清楚内存泄漏的原因,如何避免内存泄漏,如何定位内存泄漏

作为C/C++开发人员,内存泄漏是最容易遇到的问题之一,这是由C/C++语言的特性引起的。C/C++语言与其他语言不同,需要开发者去申请和释放内存,即需要开发者去管理内存,如果内存使用不当,就容易造成...

linux网络编程常见API详解_linux网络编程视频教程

Linux网络编程API函数初步剖析今天我们来分析一下前几篇博文中提到的网络编程中几个核心的API,探究一下当我们调用每个API时,内核中具体做了哪些准备和初始化工作。1、socket(family...

Linux下C++访问web—使用libcurl库调用http接口发送解析json数据

一、背景这两天由于一些原因研究了研究如何在客户端C++代码中调用web服务端接口,需要访问url,并传入json数据,拿到返回值,并解析。 现在的情形是远程服务端的接口参数和返回类型都是json的字符...

平衡感知调节:“系统如人” 视角下的架构设计与业务稳定之道

在今天这个到处都是数字化的时代,系统可不是一堆冷冰冰的代码。它就像一个活生生的“数字人”,没了它,业务根本转不起来。总说“技术要为业务服务”,但实际操作起来问题不少:系统怎么才能快速响应业务需求?...

谈谈分布式文件系统下的本地缓存_什么是分布式文件存储

在分布式文件系统中,为了提高系统的性能,常常会引入不同类型的缓存存储系统(算法优化所带来的的效果可能远远不如缓存带来的优化效果)。在软件中缓存存储系统一般可分为了两类:一、分布式缓存,例如:Memca...

进程间通信之信号量semaphore--linux内核剖析

什么是信号量信号量的使用主要是用来保护共享资源,使得资源在一个时刻只有一个进程(线程)所拥有。信号量的值为正的时候,说明它空闲。所测试的线程可以锁定而使用它。若为0,说明它被占用,测试的线程要进入睡眠...

Qt编写推流程序/支持webrtc265/从此不用再转码/打开新世界的大门

一、前言在推流领域,尤其是监控行业,现在主流设备基本上都是265格式的视频流,想要在网页上直接显示监控流,之前的方案是,要么转成hls,要么魔改支持265格式的flv,要么265转成264,如果要追求...

30 分钟搞定 SpringBoot 视频推拉流!实战避坑指南

30分钟搞定SpringBoot视频推拉流!实战避坑指南在音视频开发领域,SpringBoot凭借其快速开发特性,成为很多开发者实现视频推拉流功能的首选框架。但实际开发中,从环境搭建到流处理优...

取消回复欢迎 发表评论: