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

按顺序分别将下列功能定义为函数,函数名要求简洁易懂:
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.7, 3.5, 2.8, 2.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_formatpf.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):returntitle_para = doc.paragraphs[CONFIG["title_idx"]]if not title_para.text.strip():return# 段落格式pf = title_para.paragraph_formatpf.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_formatpf.first_line_indent = Pt(0)pf.alignment = WD_ALIGN_PARAGRAPH.LEFTfor 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_formatpf.first_line_indent = Pt(0)pf.alignment = WD_ALIGN_PARAGRAPH.LEFTfor 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_formatpf.first_line_indent = Pt(0)pf.alignment = WD_ALIGN_PARAGRAPH.LEFTfor 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_formatpf.first_line_indent = Pt(32)para.alignment = WD_ALIGN_PARAGRAPH.JUSTIFYfor 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("✅ 文档格式设置完成!")

夜雨聆风