乐于分享
好东西不私藏

Python+Word:一键对Word文件按公文格式统一排版

Python+Word:一键对Word文件按公文格式统一排版

分享一个程序,一键对Word文档按公文格式排版:
一、功能要求
要求对一篇word文档进行排版,设置页边距,字高,行间距等
原文档示例如下:
二、AI提示词

按顺序分别将下列功能定义为函数,函数名要求简洁易懂:

1、修改页边距(顶3.7cm,底3.5,左2.8,右2.6)、正文字体:仿宋_GB2312、字高:三号,行间距:固定28磅,首行缩进:2字符,段落对齐方式:两端对齐

2、设置文档标题:方正小标宋_GBK、二号字体、不加粗、居中、无缩进 

3、设置一级标题:黑体、三号字体,不加粗,目录级别:一级目录

4、设置二级标题:方正楷体_GBK,三号字体,不加粗,目录级别:二级目录

5、设置三级标题:仿宋_GB2312,加粗、目录级别:三级目录 

第一个函数执行,其余4个函数由用户决定是否执行,默认执行 

以上字体西文均为:Times New Roman

三、程序代码分享
from docx import Documentfrom docx.shared import Pt, Cmfrom docx.oxml.ns import qnfrom docx.enum.text import WD_ALIGN_PARAGRAPH, WD_LINE_SPACING# 核心配置:集中管理可自定义参数CONFIG = {    "margin": (3.73.52.82.6),       # 页边距(上/下/左/右) 单位:cm    "western_font""Times New Roman",    # 西文统一字体    "title_idx"0,                       # 文档标题段落索引(从0开始)    "line_height": Pt(28),                # 全局固定行高:28磅    "line_rule": WD_LINE_SPACING.EXACTLY }  # 行距规则:固定值def set_para_line(para):    # 通用函数:设置段落固定28磅行距(保证生效顺序)    pf = para.paragraph_format    pf.line_spacing_rule = CONFIG["line_rule"]    pf.line_spacing = CONFIG["line_height"]def set_basic(doc):    """必执行:设置页边距 + 全局段落行距   # 设置页边距"""    top, bottom, left, right = CONFIG["margin"]    for sec in doc.sections:        sec.top_margin, sec.bottom_margin = Cm(top), Cm(bottom)        sec.left_margin, sec.right_margin = Cm(left), Cm(right)    # 所有段落强制设置28磅固定行距    for p in doc.paragraphs:        set_para_line(p)def set_doc_title(doc):    """设置文档标题样式:方正小标宋_GBK、二号、居中、无缩进"""    if CONFIG["title_idx"] >= len(doc.paragraphs):        return    title_para = doc.paragraphs[CONFIG["title_idx"]]    if not title_para.text.strip():        return    # 段落格式    pf = title_para.paragraph_format    pf.first_line_indent = Pt(0)    title_para.alignment = WD_ALIGN_PARAGRAPH.CENTER    # 字体样式    for run in title_para.runs:        run.font.name = '方正小标宋_GBK'        run._element.rPr.rFonts.set(qn('w:eastAsia'), '方正小标宋_GBK')        run._element.rPr.rFonts.set(qn('w:ascii'), CONFIG["western_font"])        run.font.size = Pt(22)        run.font.bold = Falsedef set_l1_title(para):    """一级标题样式:黑体、三号、不加粗、无缩进、左对齐"""    pf = para.paragraph_format    pf.first_line_indent = Pt(0)    pf.alignment = WD_ALIGN_PARAGRAPH.LEFT    for run in para.runs:        run.font.name = ''  # 清空原有字体,确保新样式生效        run.font.name = '黑体'        run._element.rPr.rFonts.set(qn('w:eastAsia'), '黑体')        run._element.rPr.rFonts.set(qn('w:ascii'), CONFIG["western_font"])        run.font.size = Pt(16)        run.font.bold = Falsedef set_l2_title(para):    """二级标题样式:方正楷体_GBK、三号、不加粗、无缩进、左对齐"""    pf = para.paragraph_format    pf.first_line_indent = Pt(0)    pf.alignment = WD_ALIGN_PARAGRAPH.LEFT    for run in para.runs:        run.font.name = ''        run.font.name = '方正楷体_GBK'        run._element.rPr.rFonts.set(qn('w:eastAsia'), '方正楷体_GBK')        run._element.rPr.rFonts.set(qn('w:ascii'), CONFIG["western_font"])        run.font.size = Pt(16)        run.font.bold = Falsedef set_l3_title(para):    """三级标题样式:仿宋_GB2312、三号、加粗、无缩进、左对齐"""    pf = para.paragraph_format    pf.first_line_indent = Pt(0)    pf.alignment = WD_ALIGN_PARAGRAPH.LEFT    for run in para.runs:        run.font.name = ''        run.font.name = '仿宋_GB2312'        run._element.rPr.rFonts.set(qn('w:eastAsia'), '仿宋_GB2312')        run._element.rPr.rFonts.set(qn('w:ascii'), CONFIG["western_font"])        run.font.size = Pt(16)        run.font.bold = Truedef set_body_style(para):    """正文样式:仿宋_GB2312、三号、首行缩进2字符、两端对齐"""    pf = para.paragraph_format    pf.first_line_indent = Pt(32)    para.alignment = WD_ALIGN_PARAGRAPH.JUSTIFY    for run in para.runs:        run.font.name = ''        run.font.name = '仿宋_GB2312'        run._element.rPr.rFonts.set(qn('w:eastAsia'), '仿宋_GB2312')        run._element.rPr.rFonts.set(qn('w:ascii'), CONFIG["western_font"])        run.font.size = Pt(16)        run.font.bold = Falsedef set_content_style(doc):    """核心逻辑:按目录级别自动匹配标题/正文样式"""    for idx, para in enumerate(doc.paragraphs):        # 跳过文档标题和空段落        if idx == CONFIG["title_idx"or not para.text.strip():            continue        # 兼容多语言/多格式目录级别名称        style_name = para.style.name.strip().lower()        if style_name in ['heading 1''标题 1''一级标题''1 级目录(1)']:            set_l1_title(para)        elif style_name in ['heading 2''标题 2''二级标题''2 级目录(2)']:            set_l2_title(para)        elif style_name in ['heading 3''标题 3''三级标题''3 级目录(3)']:            set_l3_title(para)        else:            set_body_style(para)if __name__ == "__main__":    # 执行主流程    doc = Document("01:批量修改字体样式.docx")    set_basic(doc)  # 必执行:页边距+全局行距    set_doc_title(doc)  # 可选:文档标题样式(注释则关闭)    set_content_style(doc)  # 核心:按目录级别匹配样式    doc.save("01:批量修改字体样式_output.docx")  # 保存文档    print("✅ 文档格式设置完成!")
四、成果展示
设置好所有参数后,运行程序可一键对文档全文排版,大大提高人工操作效率。