一.以Word形式存储
1.环境安装
安装python-docx库,使用命令:
pip install python-docx
如果需要在Windows下调用Word应用程序本身,比如处理.doc格式或者加密,需要用到pywin32库
pip install pywin32
但是使用python-docx是最主流的方式,虽然只使用于.docx格式的Word文件,但是python-docx支持跨平台使用,并且容易上手。
两种库的对比:
| 特性 | python-docx |
win32com.client |
|---|---|---|
| 跨平台性 | ✅ 支持 Windows/Linux/Mac | ❌ 仅支持 Windows |
| 文件格式 | 仅支持 .docx |
支持 .doc 和 .docx |
| 学习难度 | 简单,API 直观 | 较难,需了解 COM 对象 |
| 主要优势 | 轻量级,适合生成和修改内容 | 功能极强,可加密、转PDF、调用宏 |
| 适用场景 | 自动生成报告、简历、批量替换 | 办公自动化(OA)深度集成、文档加密 |
2.python-docx库的使用
前言:
python-docx将Word文档看成一个树形结构,主要有三个层级:
- Document(文档):代表整个.docx文件,是容器
- Paragraph(段落):表示文本中的文本块,注意:每次回车都会产生一个新段落
- Run(文本块):段落中具有相同样式的一段文本。比如一个段落里既有粗体又有斜体,它们就是不同的Run
1.基本使用:创建和保存文档
python
from docx import Document
#创建文件对象(创建一个新的空白文档)
doc = Document()
# print(doc)#<docx.document.Document object at 0x000001644C502270>
# print(type(doc))#<class 'docx.document.Document'>
#保存文档,填写文档的名称
doc.save('output.docx')
2.基本使用:写入文本与标题
python
from docx import Document
#创建文件对象(创建一个新的空白文档)
doc = Document()
#---添加标题---
#level=0是文档标题,无缩进;level=1是标题1;以此类推...
doc.add_heading("这是我的第一个Word文档",level=0)
doc.add_heading("第一章:入门指南",level=1)
#---添加普通段落---
doc.add_paragraph("这是一个普通段落")
#保存文档,填写文档的名称
doc.save('output.docx')
效果:

3.Paragraph类的.add_run方法
Paragraph类的.add_run()方法用于:
在一个段落(Paragraph)里添加一段具有独立样式的文本块(Run)
python
from docx import Document
from docx.shared import RGBColor
#打开一个.docx文件
doc = Document('output.docx')
#创建一个空的段落
paragraph = doc.add_paragraph()
#在该段落中添加多个Run
run1 = paragraph.add_run('普通文本')
run2 = paragraph.add_run('加粗文本')
run2.bold = True#设置加粗
run3 = paragraph.add_run('红色文本')
run3.font.color.rgb = RGBColor(255,0,0)
#注意:python-docx对文档的修改只存在于内存中,必须显式调用.save()才会将修改的内容存入磁盘
doc.save("output.docx")
效果:

4.插入表格
1.最基础的:插入空表格
python
from docx import Document
#读入存在的docx文件
doc = Document('output.docx')
#添加一个3行2列的表格
table = doc.add_table(rows=3, cols=2)#创建的是空表格
doc.save('output.docx')
效果:

2.填充表格内容
方法1:通过cell(row,col).text直接赋值(最常用)
python
from docx import Document
#读入存在的docx文件
doc = Document('output.docx')
#添加一个3行2列的表格
table = doc.add_table(rows=3, cols=2)
#填充表格内容
##设置表头
table.cell(0,0).text = "姓名"
table.cell(0,1).text = "年龄"
##设置数据行
table.cell(1,0).text = "张三"
table.cell(1,1).text = '25'
table.cell(2,0).text = "李四"
table.cell(2,1).text = '30'
doc.save('output.docx')
效果:

方法2:遍历并批量填充
python
from docx import Document
doc = Document('output.docx')
data = [
['姓名', '年龄', '城市'],
['张三', '25', '北京'],
['李四', '30', '上海'],
['王五', '28', '广州']
]
# 先创建表格(行数 = len(data),列数 = len(data[0]))
table = doc.add_table(rows=len(data), cols=len(data[0]))
# 填充数据
for i, row_data in enumerate(data):
for j, cell_text in enumerate(row_data):
table.cell(i, j).text = cell_text
doc.save('output.docx')
效果:

5.设置表格样式
📌 常用内置样式名(注意大小写!)
| 样式名称(英文) | 效果 |
|---|---|
'Table Grid' |
最常用!带完整边框的网格表 |
'Light Shading' |
表头浅灰底纹 |
'Colorful Grid' |
彩色边框(依赖 Office 主题) |
'Medium Shading 1' |
表头深色底纹 + 隔行变色 |
'Plain Table 1' ~ 'Plain Table 5' |
简洁无底纹,不同边框风格 |
💡 如何获取准确的样式名?
- 在 Word 中手动创建一个表格
- 应用你想要的样式
- 右键表格 → "表格属性" → "边框和底纹" → 查看"样式"名称
- 或直接使用上面列出的通用名称(跨版本兼容性好)
这里就只为第2个表格设置样式
python
from docx import Document
doc = Document('output.docx')
#遍历所有表格?可以!但我只想为第二个表格设置样式
if doc.tables:#确保文档中有表格
seconde_table = doc.tables[1]
seconde_table.style = 'Table Grid'#最常用的样式,带完整边框的网格表
doc.save('output.docx')#也可以换一个新的文件名,即把修改的内容存储到新的文件中,避免对原始文件进行修改
效果:

6.插入图片
1.最基本的插入
python
from docx import Document
doc = Document('output.docx')
#插入图片(自动按原始比例进行缩放)
doc.add_picture('../../Picture/OIP-C.jpg')#这里的路径很容易搞错
doc.save('output.docx')
注意:我的py文件是在"文件存储"这个文件夹下的子文件夹"Word文件"中的,而图片是存放在与文件存储这个文件夹的同级目录的"Picture"这个文件夹中的
使用".."(表示上级目录)来表示图片的正确路径!!!
效果:

2.控制图片尺寸
可以指定插入图片的宽度(width)或高度(height),另一个维度会自动按比例缩放
如果同时指定宽高,图片会被拉伸(可能变形)
python
from docx import Document
from docx.shared import Cm#也可以导入Inches用英寸来设置
doc = Document('output.docx')
doc.add_picture("../../Picture/OIP-C.jpg", width=Cm(5))#设置图片宽度为5cm
doc.save('output.docx')
效果:

3.将图片插入到特定位置
Document类的add_picture()方法默认在文档末尾添加一个独立段落来用于插入图片
如果希望图片出现在某段文字中间,需要:
- 先创建段落
- 在段落中通过add_run().add_picture()插入
1.设置图片位于文字中间
python
from docx import Document
from docx.shared import Cm
doc = Document("output.docx")
p = doc.add_paragraph()#先创建一个空段落
# print(type(p))#<class 'docx.text.paragraph.Paragraph'>
# print(type(p.add_run()))#<class 'docx.text.run.Run'>
p.add_run("这是左边文字")
p.add_run().add_picture('../../Picture/OIP-C.jpg', width=Cm(5))#add_run()后要直接调用add_picture()
p.add_run("这是右边文字")
doc.save("output.docx")
为什么add_run()后要直接调用add_picture()方法?
因为Run类的对象(由add_run()返回)本身是没有add_picture()方法的!
python
run = p.add_run()
run.add_picture(...) # ❌ 这样会报错!
效果:

2.设置图片对齐方式
其他对齐选项:
- WD_ALIGN_PARAGRAPH.LEFT(默认)
- WD_ALIGN_PARAGRAPH.RIGHT
- WD_ALIGN_PARAGRAPH.CENTER
- WD_ALIGN_PARAGRAPH.JUSTIFY(设置段落对齐方式为两端对齐)
图片本身在一个段落当中,所以通过该段落设置对齐即可
python
from docx import Document
from docx.shared import Cm
from docx.enum.text import WD_ALIGN_PARAGRAPH
doc = Document("output.docx")
#插入图片并居中
p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
p.add_run().add_picture('../../Picture/picture1.png', width=Cm(5))
doc.save('output.docx')
效果:

4.插入图片的常见问题
❗ 常见问题
| 问题 | 解决方案 |
|---|---|
| 图片不显示 / 显示为红叉 | 路径错误,或保存后移动了图片文件(Word 嵌入图片,但调试时注意路径) |
| 图片太大超出页面 | 用 width=Cm(15) 限制宽度(A4 纸宽约 18cm) |
| 想环绕文字? | python-docx 不支持文字环绕(Word 的"嵌入型"以外的布局),图片只能独占一行或在行内 |
| 插入网络图片? | 需先下载到本地,再插入 |
5.插入网络图片
python-docx的add_picture()不支持直接传入URL,如果有网络图片需要插入,需先下载到本地
或者:
python-docx支持BytesIO对象!所以可以从内存中插入图片,无需保存到磁盘!
python
import requests
from docx import Document
from docx.shared import Cm
from docx.enum.text import WD_ALIGN_PARAGRAPH
from io import BytesIO#导入BytesIO类,用于在内存中创建一个类似文件的对象(file-like object),但不实际读写磁盘文件而是操作字节数据(bytes)
response = requests.get('https://www.baidu.com/img/PCtm_d9c8750bed0b3c7d089fa7d55720d6cf.png')
image_stream = BytesIO(response.content)
doc = Document('output.docx')
p = doc.add_paragraph()
p.add_run('百度logo:')
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
p.add_run().add_picture(image_stream, width=Cm(10))
doc.save('output.docx')
效果:

✅ 总结:from io import BytesIO 的作用
| 用途 | 说明 |
|---|---|
| 内存中模拟文件 | 创建一个像文件一样可读写的对象,但数据存在 RAM 中 |
| 避免临时文件 | 下载/生成图片后直接使用,无需写入磁盘再读取 |
与 python-docx 配合 |
让 add_picture() 支持从内存插入图片 |
| 提高性能 & 安全性 | 减少磁盘操作,适合 Web 服务、自动化脚本 |
7.设置文字样式与大小
在 python-docx 中,不能直接对段落(Paragraph)整体设置字体样式和大小 ,而是要通过 Run(文本运行)对象 来控制文字的格式。
需导入:
python
from docx.shared import Pt, RGBColor
from docx.enum.text import WD_COLOR_INDEX # 用于高亮
🎨 常用文字样式设置
| 属性 | 说明 | 示例 |
|---|---|---|
run.bold |
加粗 | run.bold = True |
run.italic |
斜体 | run.italic = True |
run.underline |
下划线 | run.underline = True |
run.font.size |
字号 | run.font.size = Pt(12) |
run.font.color.rgb |
颜色 | RGBColor(0, 0, 255)(蓝) |
run.font.name |
西文字体 | 'Arial', 'Times New Roman' |
run.font.highlight_color |
高亮背景 | WD_COLOR_INDEX.YELLOW |
✅ 总结
| 目标 | 操作 |
|---|---|
| 设置文字样式 | 操作 Run 对象,不是 Paragraph |
| 设置字号 | run.font.size = Pt(14) |
| 设置中文字体 | 同时设置 font.name 和 eastAsia |
| 加粗/颜色等 | run.bold = True, run.font.color.rgb = RGBColor(...) |