Python-docx库实现Word文档自动化处理全流程

慢慢来
慢慢来
发布时间:2026-10-11 | 3人浏览过
原创

本文详解如何利用 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库进阶技巧与办公场景集成的资料请关注本站其它相关文章!

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表