Python-docx库实现Word文档自动化处理全流程
本文详解如何利用 Python 第三方库 python-docx 实现 Microsoft Word 文档的自动化读写、样式修改、页面排版、批量合并拆分及表格图像处理。提供完整可运行的代码示例与防错指南,助力开发者快速搭建办公提效脚本。
一、安装环境与核心模块
python-docx 是专为处理 .docx 格式设计的开源解析库,支持底层 XML 节点映射。执行安装命令如下:
pip install python-docx
二、读取与修改文档内容
第1步:加载并遍历段落提取文本
目的:验证文件路径有效性并获取基础结构。
入口:from docx import Document
动作:
from docx import Document
# 读取Word文档,需替换为实际路径
document = Document('example.docx')
# 遍历并打印段落内容
for paragraph in document.paragraphs:
print(paragraph.text)
完成状态:控制台按序输出文档内所有段落的纯文本,无报错即表示解析成功。
第2步:新增文本块并调整基础样式
目的:在指定位置插入带格式的字符。
入口:docx.shared.RGBColor, docx.shared.Pt
动作:
from docx import Document
from docx.shared import RGBColor, Pt
document = Document('example.docx')
paragraph = document.paragraphs[0]
# 附加运行对象并设置字体参数
run = paragraph.add_run("Hello, World!")
run.font.size = Pt(20)
run.bold = True
run.font.color.rgb = RGBColor(255, 0, 0)
# 同步覆盖原文件
document.save('example.docx')
重要参数:Pt() 用于磅值设定,RGBColor(R,G,B) 定义颜色通道。
注意:直接对 paragraph.text 赋值会清空原有 Run 对象及其隐藏样式。若需保留原有格式,应遍历 paragraph.runs 逐个替换文本。完成状态:指定段落末尾追加红色粗体文本,保存后打开文档视觉一致。
第3步:批量替换文本与清空段落
目的:实现关键字定位与范围清除。
动作:
from docx import Document
def modify_document(file_path):
document = Document(file_path)
# 追加新段落
document.add_paragraph('这是一个新的段落一。')
document.add_paragraph('这是一个新的段落二。')
document.add_paragraph('这是一个新的段落三:旧文本将被替换。')
# 清空首段内容
document.paragraphs[0].text = ""
# 全文本替换
for paragraph in document.paragraphs:
paragraph.text = paragraph.text.replace("旧文本", "新文本")
document.save(file_path)
modify_document('example.docx')
完成状态:遍历结束并执行 save() 后,源文件内容按规则更新。涉及文件覆盖操作前,请务必做好数据备份。
三、创建文档与页面排版
第4步:新建空白文档并插入混合元素
目的:从零构建标准化报告基底。
动作:
from docx import Document
from docx.shared import Inches
document = Document()
document.add_heading('欢迎使用Word自动化处理', level=1)
document.add_paragraph('这是一个新的段落。')
document.add_picture('image.jpg', width=Inches(1.25))
document.save('新文档.docx')
完成状态:生成包含一级标题、文本段落与固定宽度(1.25英寸)图片的 .docx 文件。
第5步:配置页面方向、页眉页脚与动态页码
目的:统一多文档排版规范。
入口:docx.enum.section, docx.oxml
动作:
from docx import Document
from docx.enum.text import WD_PARAGRAPH_ALIGNMENT
from docx.shared import Inches
from docx.oxml.ns import nsdecls
from docx.oxml import parse_xml
from docx.enum.section import WD_ORIENT
def set_layout_header_footer(file_path):
document = Document(file_path)
# 设置横向布局
for section in document.sections:
section.orientation = WD_ORIENT.LANDSCAPE
section.page_width = Inches(11)
section.page_height = Inches(8.5)
# 设置页眉页脚文本
for section in document.sections:
section.header.paragraphs[0].text = "这是页眉"
section.footer.paragraphs[0].text = "这是页脚"
# 插入自动页码域
for section in document.sections:
footer = section.footer
footer.is_linked_to_previous = False
p = footer.add_paragraph()
p.text = "页码:"
p.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
r = p.add_run()
fld = parse_xml(r'<w:fldSimple xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" w:instr="PAGE"><w:r><w:t>1</w:t></w:r></w:fldSimple>')
r._r.append(fld)
document.save(file_path)
set_layout_header_footer('新文档.docx')
关键机制:页码非普通文本,需通过解析 OpenXML 标签注入 w:fldSimple 节点,否则无法随翻页自动递增。完成状态:文档显示横向版面,页眉页脚居中分布,底部分页显示连续数字。
第6步:精细化调整字体与对齐方式
目的:控制单段落排版细节。
动作:
from docx import Document
from docx.shared import Pt
from docx.enum.text import WD_PARAGRAPH_ALIGNMENT
def adjust_font(file_path):
document = Document(file_path)
paragraph = document.add_paragraph('这是一个段落。')
run = paragraph.runs[0]
run.text = '这是调整字体样式和格式的例子。'
run.font.name = '宋体'
run.font.size = Pt(12)
run.font.bold = True
run.font.italic = True
run.font.underline = True
paragraph.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
document.save(file_path)
adjust_font('新文档.docx')
完成状态:新增段落应用宋体加粗斜体下划线样式,整体水平居中。
四、批量处理与文档重组
⚠️ 风险提示:批量覆写、清理或拆分操作不可逆,执行前请复制源文件至安全目录。
第7步:遍历目录批量读取元数据
目的:实现文件夹级流水线扫描。
动作:
from docx import Document
import os
folder_path = 'path/to/your/folder'
def process_document(file_path):
document = Document(file_path)
print(f"处理文档:{file_path}")
for title in document.paragraphs:
if title.style.name.lower().startswith('heading'):
print(f"标题: {title.text}")
break
for paragraph in document.paragraphs:
print(f"段落: {paragraph.text}")
print() # 分隔符
for file_name in os.listdir(folder_path):
if file_name.endswith('.docx'):
process_document(os.path.join(folder_path, file_name))
完成状态:终端按文件顺序输出标题与正文快照,适用于日志审计或数据清洗前置校验。
第8步:合并多份文档
目的:整合分散报告。
动作:
from docx import Document
def merge_documents(file_paths, output_path):
merged = Document()
for fp in file_paths:
doc = Document(fp)
for element in doc.element.body:
merged.element.body.append(element)
merged.save(output_path)
print("文档合并完成!")
merge_documents(['doc1.docx', 'doc2.docx'], 'merged_documents.docx')
第9步:按节拆分文档
目的:解耦独立章节。
动作:
from docx import Document
def split_document(source_path):
document = Document(source_path)
for i, section in enumerate(document.sections):
new_doc = Document()
for element in section._sectPr:
new_doc._element.append(element)
out_path = f"output_{i}.docx"
new_doc.save(out_path)
print(f"已保存拆分的文档:{out_path}")
split_document('source_document.docx')
第10步:批量匹配并替换样式标记
目的:统一历史文档视觉规范。
动作:
from docx import Document
def replace_text_and_style(file_path, old_text, new_text, old_style, new_style):
document = Document(file_path)
for paragraph in document.paragraphs:
if old_text in paragraph.text:
paragraph.text = paragraph.text.replace(old_text, new_text)
for run in paragraph.runs:
if run.bold and old_style in run.style.name:
run.style = new_style
document.save(file_path)
print(f"替换完成:{file_path}")
replace_text_and_style('document.docx', '老标题', '新标题', 'Bold', 'Heading 1')
五、表格、图像与高级扩展
第11步:表格单元格的增删改查
目的:结构化数据录入与校验。
动作:
from docx import Document
def add_table(file_path, rows, cols):
document = Document(file_path)
table = document.add_table(rows, cols)
for row in table.rows:
for cell in row.cells:
cell.text = "单元格"
document.save(file_path)
def read_table_data(file_path, t_idx, r_idx, c_idx):
document = Document(file_path)
if t_idx < len(document.tables):
return document.tables[t_idx].cell(r_idx, c_idx).text
return None
add_table('document.docx', 2, 3)
data = read_table_data('document.docx', 0, 1, 2)
完成状态:新增 rows×cols 矩阵填充默认值,索引访问返回对应字符串。
第12步:图像插入、比例缩放与物理移除
目的:媒体资源管理。
动作:
from docx import Document
from docx.shared import Inches
def insert_image(file_path, img_path):
document = Document(file_path)
document.add_picture(img_path, width=Inches(2), height=Inches(3))
document.save(file_path)
def resize_image(file_path, img_index, w_in, h_in):
document = Document(file_path)
shapes = document.inline_shapes
if img_index < len(shapes):
shapes[img_index].width = Inches(w_in)
shapes[img_index].height = Inches(h_in)
document.save(file_path)
def delete_image(file_path, img_index):
document = Document(file_path)
shapes = document.inline_shapes
if img_index < len(shapes):
shapes[img_index]._inline.getparent().remove(shapes[img_index]._inline)
document.save(file_path)
insert_image('document.docx', 'image.jpg')
resize_image('document.docx', 1, 3, 4)
delete_image('document.docx', 2)
第13步:生成静态目录骨架
目的:搭建报告框架。
动作:
from docx import Document
document = Document()
document.add_page_break()
document.add_heading("目录", level=1)
document.add_paragraph("一、简介")
document.add_paragraph("二、方法")
document.add_paragraph("三、结果")
document.save('report.docx')
说明:此方法生成固定文本目录。实际业务中如需自动生成带跳转锚点的动态 TOC,建议结合模板变量渲染或调用系统宏。
六、运行排查与注意事项
Document('path')抛出OSError多为路径权限不足或文件头损坏,建议使用os.path.abspath()获取绝对路径。- 循环内频繁调用
document.save()会导致磁盘 IO 拥堵,建议采用内存聚合后单次落盘。 .doc二进制格式不被该库原生支持,预处理阶段需通过 WPS 或 Office 另存为.docx。
以上就是Python中Word文件自动化处理的详细内容,更多关于python-docx库进阶技巧与办公场景集成的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













