本文目录导读:

在Python中操作Word文档,最常用的库是python-docx,它支持创建、修改和读取.docx文件。
安装
pip install python-docx
基本操作
1 创建和保存文档
from docx import Document
# 创建新文档
doc = Document()
doc.add_heading('Python操作Word文档', level=0)
# 添加段落
doc.add_paragraph('这是一个使用python-docx创建的Word文档。')
# 保存文档
doc.save('example.docx')
2 读取和修改现有文档
from docx import Document
# 打开现有文档
doc = Document('example.docx')
# 读取所有段落
for paragraph in doc.paragraphs:
print(f"段落内容: {paragraph.text}")
print(f"段落样式: {paragraph.style.name}")
# 读取表格
for table in doc.tables:
for row in table.rows:
for cell in row.cells:
print(cell.text)
for heading in doc.headings:
print(f"标题: {heading.text}, 级别: {heading.style.name}")
高级操作
1 格式化文本
from docx import Document
from docx.shared import Pt, Inches, RGBColor
from docx.enum.text import WD_ALIGN_PARAGRAPH
doc = Document()
# 添加带格式的段落
paragraph = doc.add_paragraph()
run = paragraph.add_run('加粗文本')
run.bold = True
run = paragraph.add_run('\n斜体文本')
run.italic = True
run = paragraph.add_run('\n带下划线文本')
run.underline = True
# 设置字体大小和颜色
run = paragraph.add_run('\n红色大号字体')
run.font.size = Pt(24)
run.font.color.rgb = RGBColor(255, 0, 0)
# 设置段落对齐方式
paragraph.alignment = WD_ALIGN_PARAGRAPH.CENTER
doc.save('formatted.docx')
2 插入图片
from docx import Document
from docx.shared import Inches, Pt
doc = Document()
doc.add_heading('图片插入示例', level=1)
# 插入图片
doc.add_picture('image.jpg', width=Inches(5))
# 在图片下方添加说明文字
caption = doc.add_paragraph('图1: 示例图片')
caption.alignment = 1 # 居中
# 设置图片大小(可选择不同单位)
from docx.shared import Cm, Emu
# 使用厘米
doc.add_picture('image.jpg', width=Cm(10))
# 保持原图比例,只设置宽度
doc.add_picture('image.jpg', width=Inches(4))
doc.save('image_example.docx')
3 表格操作
from docx import Document
from docx.shared import Pt, Cm
from docx.enum.table import WD_TABLE_ALIGNMENT
doc = Document()
doc.add_heading('表格示例', level=1)
# 创建表格(3行4列)
table = doc.add_table(rows=3, cols=4, style='Table Grid')
table.alignment = WD_TABLE_ALIGNMENT.CENTER
# 填充表头
headers = ['姓名', '年龄', '城市', '职业']
for i, header in enumerate(headers):
cell = table.rows[0].cells[i]
cell.text = header
# 设置表头加粗
for paragraph in cell.paragraphs:
for run in paragraph.runs:
run.bold = True
# 填充数据
data = [
['张三', '28', '北京', '工程师'],
['李四', '25', '上海', '设计师']
]
for i, row_data in enumerate(data, start=1):
for j, value in enumerate(row_data):
table.rows[i].cells[j].text = value
# 设置列宽
for column in table.columns:
column.width = Cm(4)
# 合并单元格
table.cell(0, 0).merge(table.cell(0, 1)) # 合并第一行的前两个单元格
doc.save('table_example.docx')
4 列表和项目符号
from docx import Document
from docx.enum.text import WD_ALIGN_PARAGRAPH
doc = Document()
doc.add_heading('列表操作', level=1)
# 无序列表
doc.add_paragraph('项目1', style='List Bullet')
doc.add_paragraph('项目2', style='List Bullet')
doc.add_paragraph('项目3', style='List Bullet')
# 有序列表
doc.add_paragraph('第一项', style='List Number')
doc.add_paragraph('第二项', style='List Number')
doc.add_paragraph('第三项', style='List Number')
# 多级列表(手动缩进)
indented_para = doc.add_paragraph('子项目', style='List Bullet 2')
doc.save('list_example.docx')
5 添加页眉页脚
from docx import Document
from docx.shared import Pt
doc = Document()
# 添加页眉
section = doc.sections[0]
header = section.header
header_para = header.paragraphs[0]
header_para.text = "这是页眉"
header_para.alignment = 1 # 居中
# 添加页脚
footer = section.footer
footer_para = footer.paragraphs[0]
footer_para.text = "页码:"
# 添加自动页码
from docx.oxml.ns import qn
run = footer_para.add_run()
fldChar1 = run._r.makeelement(qn('w:fldChar'), {qn('w:fldCharType'): 'begin'})
run._r.append(fldChar1)
run2 = footer_para.add_run()
instrText = run2._r.makeelement(qn('w:instrText'), {})
instrText.text = ' PAGE '
run2._r.append(instrText)
run3 = footer_para.add_run()
fldChar2 = run3._r.makeelement(qn('w:fldChar'), {qn('w:fldCharType'): 'end'})
run3._r.append(fldChar2)
doc.save('header_footer.docx')
实用案例
案例1:批量生成报表
from docx import Document
from docx.shared import Inches, Pt, RGBColor
from docx.enum.text import WD_ALIGN_PARAGRAPH
import datetime
def generate_report(data, template_file=None):
"""
生成Word报告
Args:
data: 包含报告数据的字典
template_file: 可选模板文件路径
"""
if template_file:
doc = Document(template_file)
else:
doc = Document()
# 添加标题= doc.add_heading('销售报告', level=0)alignment = WD_ALIGN_PARAGRAPH.CENTER
# 添加日期
date_para = doc.add_paragraph(f'生成日期:{datetime.datetime.now().strftime("%Y-%m-%d")}')
date_para.alignment = WD_ALIGN_PARAGRAPH.RIGHT
# 添加摘要
doc.add_paragraph(f'总销售额:{data["total_sales"]}')
doc.add_paragraph(f'订单数量:{data["order_count"]}')
# 添加表格
table = doc.add_table(rows=1, cols=len(data['columns']))
table.style = 'Light Shading Accent 1'
# 表头
for i, col in enumerate(data['columns']):
table.rows[0].cells[i].text = col
# 数据行
for row_data in data['rows']:
row = table.add_row()
for i, value in enumerate(row_data):
row.cells[i].text = str(value)
# 保存
filename = f'sales_report_{datetime.datetime.now().strftime("%Y%m%d")}.docx'
doc.save(filename)
return filename
# 使用示例
sales_data = {
'total_sales': '$50,000',
'order_count': 150,
'columns': ['产品', '销量', '金额'],
'rows': [
['产品A', '100', '$20,000'],
['产品B', '50', '$30,000']
]
}
report_file = generate_report(sales_data)
print(f"报告已生成:{report_file}")
案例2:提取文档内容
from docx import Document
import re
def extract_document_content(file_path):
"""
提取Word文档内容
Args:
file_path: Word文档路径
Returns:
包含提取内容的字典
"""
doc = Document(file_path)
content = {
'text': [],
'tables': [],
'images': 0,
'headings': []
}
# 提取段落文本
for paragraph in doc.paragraphs:
if paragraph.text.strip():
content['text'].append({
'text': paragraph.text,
'style': paragraph.style.name
})
# 提取标题
for heading in doc.headings:
content['headings'].append({
'text': heading.text,
'level': heading.style.name
})
# 提取表格数据
for table in doc.tables:
table_data = []
for row in table.rows:
row_data = [cell.text for cell in row.cells]
table_data.append(row_data)
content['tables'].append(table_data)
# 统计图片数量(通过检查内联形状)
for shape in doc.inline_shapes:
if shape.type == 3: # 图片类型
content['images'] += 1
return content
# 使用示例
content = extract_document_content('example.docx')
print(f"段落数:{len(content['text'])}")
print(f"表格数:{len(content['tables'])}")
print(f"图片数:{content['images']}")
注意事项
- 性能优化:处理大型文档时,建议逐段读取而不是一次性加载整个文档
- 编码问题:确保使用UTF-8编码处理中文
- 兼容性:python-docx只支持.docx格式,不支持旧的.doc格式
常用第三方库对比
| 库名称 | 优势 | 劣势 |
|---|---|---|
| python-docx | API友好,文档完善 | 只支持.docx |
| win32com | 支持所有Word功能 | 仅Windows,需要安装Office |
| pywin32 | 全面控制Word | 学习曲线陡峭 |
python-docx是最推荐的选择,对于大多数应用场景已经足够使用。