• 设为首页
  • 收藏本站
  • 积分充值
  • VIP赞助
  • 手机版
  • 微博
  • 微信
    微信公众号 添加方式:
    1:搜索微信号(888888
    2:扫描左侧二维码
  • 快捷导航
    福建二哥 门户 查看主题

    Python实现自动化Word排版

    发布者: 涵韵 | 发布时间: 2025-6-14 12:22| 查看数: 117| 评论数: 0|帖子模式

    Word是一款广泛使用的文档编辑工具,但在排版过程中可能会遇到繁琐的重复操作。幸运的是,借助Python编程语言的强大功能,我们可以实现自动化的Word排版,提升文档编辑的效率和质量。本文将介绍如何使用Python实现自动化的Word排版,让文档编辑变得更加高效便捷。

    一、导入必要的库

    在Python中,我们可以使用python-docx库来操作Word文档。它提供了丰富的函数和方法,用于创建、修改和格式化Word文档。我们可以通过以下代码导入python-docx库:
    1. import docx
    复制代码
    二、打开Word文档

    首先,我们需要打开要进行排版的Word文档。可以使用python-docx库提供的`Document`类来打开现有的文档。
    打开Word文档:
    1. doc = docx.Document('example.docx')
    复制代码
    三、自动化排版

    接下来,我们将使用python-docx库提供的功能来实现自动化的Word排版。以下是一些常见的排版操作示例:
    1. 设置页面大小和边距:
    1. doc.sections[0].page_width = docx.shared.Inches(8.5)
    2. doc.sections[0].page_height = docx.shared.Inches(11)
    3. doc.sections[0].left_margin = docx.shared.Inches(1)
    4. doc.sections[0].right_margin = docx.shared.Inches(1)
    5. doc.sections[0].top_margin = docx.shared.Inches(1)
    6. doc.sections[0].bottom_margin = docx.shared.Inches(1)
    复制代码
    2. 插入标题:
    1. doc.add_heading('自动化Word排版', level=1)
    复制代码
    3. 插入段落:
    1. doc.add_paragraph('在今天的文章中,我们将介绍如何使用Python实现自动化的Word排版。')
    复制代码
    4. 设置字体样式:
    1. paragraph = doc.add_paragraph()
    2. run = paragraph.add_run('这是一个示例文本。')
    3. font = run.font
    4. font.name = 'Arial'
    5. font.size = docx.shared.Pt(12)
    6. font.bold = True
    复制代码
    5. 插入图片:
    1. doc.add_picture('example.jpg', width=docx.shared.Inches(4), height=docx.shared.Inches(3))
    复制代码
    四、保存并关闭文档

    完成排版后,我们需要保存并关闭文档。
    1. 保存文档:
    1. doc.save('formatted_example.docx')
    复制代码
    2. 关闭文档:
    1. doc.close()
    复制代码
    五、总结

    通过使用Python的python-docx库,我们可以轻松地实现自动化的Word排版。通过打开文档、进行自动化排版操作,以及保存并关闭文档,我们能够提升文档编辑的效率和质量。
    参考代码:
    1. import docxdoc = docx.Document('example.docx')# 自动化排版操作示例doc.sections[0].page_width = docx.shared.Inches(8.5)
    2. doc.sections[0].page_height = docx.shared.Inches(11)
    3. doc.sections[0].left_margin = docx.shared.Inches(1)
    4. doc.sections[0].right_margin = docx.shared.Inches(1)
    5. doc.sections[0].top_margin = docx.shared.Inches(1)
    6. doc.sections[0].bottom_margin = docx.shared.Inches(1)doc.add_heading('自动化Word排版', level=1)doc.add_paragraph('在今天的文章中,我们将介绍如何使用Python实现自动化的Word排版。')paragraph = doc.add_paragraph()
    7. run = paragraph.add_run('这是一个示例文本。')
    8. font = run.font
    9. font.name = 'Arial'
    10. font.size = docx.shared.Pt(12)
    11. font.bold = Truedoc.add_picture('example.jpg', width=docx.shared.Inches(4), height=docx.shared.Inches(3))# 保存并关闭文档doc.save('formatted_example.docx')doc.close()
    复制代码
    六、方法补充

    用Python编写的Word一键排版工具
    1. import docx
    2. from docx.oxml.ns import qn
    3. from docx.shared import Pt, Cm, Mm
    4. from docx.enum.text import *
    5. import os
    6. import sys
    7. from docx import Document
    8. from PyQt5.QtWidgets import QApplication, QFileDialog
    9. # 删除段落
    10. def delete_paragraph(paragraph):
    11.     p = paragraph._element
    12.     p.getparent().remove(p)
    13. # p._p = p._element = None
    14.     paragraph._p = paragraph._element = None

    15. #判断是否为落款格式
    16. def LuoKuan(str):
    17.     for i in str:
    18.         if i in punc:
    19.             return False
    20.     if ((str[0] in num) and (str[-1] == "日") and (len(str) <= 12)) or ((str[0] in cn_num) and (str[-1] == "日") and (len(str) <= 12)):
    21.         return True
    22.     else:
    23.         return False
    24. def setMargin(docx):
    25.     section = docx.sections[0]
    26.     section.page_height = Cm(29.7)
    27.     section.page_width = Cm(21.0)
    28.     section.left_margin = Cm(2.8)
    29.     section.right_margin = Cm(2.6)
    30.     section.top_margin = Cm(3.7)
    31.     section.bottom_margin = Cm(3.5)

    32. #判断是否为一级标题格式(如:一、xxx)
    33. def GradeOneTitle(str):
    34.     if ((str[0] in cn_num) and (str[1] == "、")) or ((str[0] in cn_num) and (str[1] in cn_num) and (str[2] == "、")):
    35.         return True
    36.     else:
    37.         return False

    38. #判断是否为二级标题格式(如:(一)xxx)
    39. def GradeTwoTitle(str):
    40.     if ((str[0] == "(") and (str[1] in cn_num) and (str[2] == ")")) or ((str[0] == "(") and (str[1] in cn_num) and (str[2] in cn_num) and (str[3] == ")")):
    41.         return True
    42.     else:
    43.         return False
    44. #判断是否为三级标题格式(如:1.xxx)
    45. def GradeThreeTitle(str):
    46.     if ((str[0] in num) and (str[1] in punc)) or ((str[0] in num) and (str[1] in num) and (str[2] in punc)):
    47.         return True
    48.     else:
    49.         return False
    50. #判断是否为四级标题格式(如:(1)xxx)
    51. def GradeFourTitle(str):
    52.     if ((str[0] == "(") and (str[1] in num) and (str[2] == ")")) or ((str[0] == "(") and (str[1] in num) and (str[2] in num) and (str[3] == ")")):
    53.         return True
    54.     else:
    55.         return False

    56. #判断是否为五级标题格式(如:一是XXX)
    57. def GradeFiveTitle(str):
    58.     if ((str[0] in cn_num) and (str[1] in must)) or ((str[0] in cn_num) and (str[1] in cn_num) and (str[1] in must)):
    59.         return True
    60.     else:
    61.         return False

    62. def OneKeyWord():
    63.     global cn_num,num,punc,must
    64.     cn_num = ["一", "二", "三", "四", "五", "六", "七", "八", "九", "十"]
    65.     num = ["1", "2", "3", "4", "5", "6", "7", "8", "9", "0"]
    66.     punc = ["。", ",", "!", "?", ":", ";", "、", ".", "(", ")","."]
    67.     must = ["要", "是", "能"]
    68.     filecnt = 0
    69.     print('欢迎使用Word一键排版工具!创作者QQ:124500535')
    70.     confirm= input("是否打开Word文档?输入“Y”表示“打开”,输入“N”表示“取消”!")
    71.     if confirm == 'Y' or confirm == 'y':
    72.         a = QApplication([''])
    73.         files, stylel = QFileDialog.getOpenFileNames(caption="多文件选择", directory="/", filter="Word 文档(*.docx)")
    74.         print(files)  # 打印所选文件全部路径(包括文件名和后缀名)和文件类型
    75.         for file in files:
    76.             docx = Document(file)
    77.             paragraphcnt = 0
    78.             filecnt= filecnt+1
    79.             print('这是第%s个文件:%s' %(filecnt,file))
    80.             for paragraph in docx.paragraphs:
    81.                 paragraphcnt = paragraphcnt +1
    82.                 paragraph.text=paragraph.text.replace(",",",")
    83.                 paragraph.text=paragraph.text.replace(";",";")
    84.                 paragraph.text=paragraph.text.replace(":",":")
    85.                 paragraph.text=paragraph.text.replace("!","!")
    86.                 paragraph.text=paragraph.text.replace("?","?")
    87.                 paragraph.text=paragraph.text.replace("(","(")
    88.                 paragraph.text=paragraph.text.replace(")",")")
    89.                 paragraph.text=paragraph.text.replace(" ","")
    90.                 paragraph.text=paragraph.text.replace("\t", "")
    91.                 paragraph.text = paragraph.text.replace("\n", "")
    92.                 if paragraph.text == '':
    93.                     delete_paragraph(paragraph)
    94.                     paragraphcnt = paragraphcnt-1
    95.                     continue
    96.                 paragraph.paragraph_format.left_indent = 0  #预先对缩进赋值, 防止对象为空报错
    97.                 paragraph.paragraph_format.element.pPr.ind.set(qn("w:firstLineChars"), '0')  #并去除缩进
    98.                 paragraph.paragraph_format.element.pPr.ind.set(qn("w:firstLine"), '0')
    99.                 paragraph.paragraph_format.element.pPr.ind.set(qn("w:leftChars"), '0')
    100.                 paragraph.paragraph_format.element.pPr.ind.set(qn("w:left"), '0')
    101.                 paragraph.paragraph_format.element.pPr.ind.set(qn("w:rightChars"), '0')
    102.                 paragraph.paragraph_format.element.pPr.ind.set(qn("w:right"), '0')
    103.                 print('这是第%s段' %paragraphcnt)
    104.                 print(paragraph.text)
    105.                 if paragraphcnt == 1 and len(paragraph.text)<40:
    106.                     #处理头部空行
    107.                     #标题(方正小标宋_GBK、2号、加粗、居中、下端按2号字空一行)
    108.                     paragraph.paragraph_format.line_spacing=Pt(28)  #行距固定值28磅
    109.                     paragraph.paragraph_format.space_after = Pt(0)  #段后间距=0
    110.                     for run in paragraph.runs:
    111.                         run.font.size = Pt(22)  # 字体大小2号
    112.                         run.bold = False  # 加粗
    113.                         run.font.name = '方正小标宋_GBK'  # 控制是西文时的字体
    114.                         run.element.rPr.rFonts.set(qn('w:eastAsia'), '方正小标宋_GBK')  # 控制是中文时的字体
    115.                         paragraph.alignment = WD_ALIGN_PARAGRAPH.CENTER # 居中
    116.                     continue
    117.                 elif paragraphcnt == 2 and len(paragraph.text) < 30:
    118.                     # 作者单位、姓名
    119.                     paragraph.paragraph_format.line_spacing = Pt(28)  # 行距固定值28磅
    120.                     paragraph.paragraph_format.space_after = Pt(0)  # 段后间距=0
    121.                     for run in paragraph.runs:
    122.                         run.font.size = Pt(16)  # 字体大小2号
    123.                         run.bold = False  # 加粗
    124.                         run.font.name = '楷体'  # 控制是西文时的字体
    125.                         run.element.rPr.rFonts.set(qn('w:eastAsia'), '楷体')  # 控制是中文时的字体
    126.                         paragraph.alignment = WD_ALIGN_PARAGRAPH.CENTER  # 居中
    127.                     continue
    128.                 elif paragraphcnt == 3 and len(paragraph.text) < 30 and (paragraph.text[0] == "(") and (paragraph.text[1] in num):
    129.                     # 日期,如(2023年6月15日)
    130.                     paragraph.paragraph_format.line_spacing = Pt(28)  # 行距固定值28磅
    131.                     paragraph.paragraph_format.space_after = Pt(0)  # 段后间距=0
    132.                     for run in paragraph.runs:
    133.                         run.font.size = Pt(16)  # 字体大小2号
    134.                         run.bold = False  # 加粗
    135.                         run.font.name = '楷体'  # 控制是西文时的字体
    136.                         run.element.rPr.rFonts.set(qn('w:eastAsia'), '楷体')  # 控制是中文时的字体
    137.                         paragraph.alignment = WD_ALIGN_PARAGRAPH.CENTER  # 居中
    138.                     continue
    139.                     # #处理正文
    140.                 else:
    141.                     paragraph.paragraph_format.line_spacing = Pt(28)  # 行距固定值28磅
    142.                     paragraph.paragraph_format.space_after = Pt(0)  # 段后间距=0
    143.                     paragraph.paragraph_format.first_line_indent = Pt(32)
    144.                     for run in paragraph.runs:
    145.                         run.font.size = Pt(16)  # 字体大小3号
    146.                         run.bold = False  # 字体不加粗
    147.                         run.font.name = '仿宋_GB2312'
    148.                         run.element.rPr.rFonts.set(qn('w:eastAsia'), '仿宋_GB2312')
    149.                         if GradeOneTitle(run.text): #判断是否为一级标题格式(如:一、xxx)
    150.                             run.font.name = '黑体'
    151.                             run.element.rPr.rFonts.set(qn('w:eastAsia'), '黑体')
    152.                         elif GradeTwoTitle(run.text): #判断是否为二级标题格式(如:(一)xxx)
    153.                             if "。" not in run.text:
    154.                                 run.font.name = '楷体'
    155.                                 run.element.rPr.rFonts.set(qn('w:eastAsia'), '楷体')
    156.                             else:
    157.                                 run.text = run.text.split('。',1)
    158.                                 run.font.name = '楷体'
    159.                                 run.element.rPr.rFonts.set(qn('w:eastAsia'), '楷体')
    160.                         elif GradeThreeTitle(run.text): #判断是否为三级标题格式(如:1.xxx)
    161.                             if "。" not in run.text:
    162.                                 if (run.text[0] in num) and (run.text[1] in punc):
    163.                                     run.text = run.text.replace(run.text[1], ".",1)
    164.                                 if (run.text[0] in num) and (run.text[1] in num) and (run.text[2] in punc):
    165.                                     run.text = run.text.replace(run.text[2], ".", 1)
    166.                                 run.font.name = '仿宋_GB2312'
    167.                                 run.element.rPr.rFonts.set(qn('w:eastAsia'), '仿宋_GB2312')
    168.                                 run.bold = True  # 字体加粗
    169.                             else:
    170.                                 if (run.text[0] in num) and (run.text[1] in punc):
    171.                                     run.text = run.text.replace(run.text[1], ".", 1)
    172.                                 if (run.text[0] in num) and (run.text[1] in num) and (run.text[2] in punc):
    173.                                     run.text = run.text.replace(run.text[2], ".", 1)
    174.                                 sentence_to_bold = run.text.split('。')[0]+"。"
    175.                                 sentence_not_to_bold = run.text.split('。',1)[1]
    176.                                 paragraph.insert_paragraph_before(sentence_to_bold)
    177.                                 docx.paragraphs[paragraphcnt - 1].paragraph_format.first_line_indent = Pt(32)
    178.                                 docx.paragraphs[paragraphcnt - 1].paragraph_format.line_spacing = Pt(28)  # 行距固定值28磅
    179.                                 docx.paragraphs[paragraphcnt - 1].paragraph_format.space_after = Pt(0)  # 段后间距=0
    180.                                 docx.paragraphs[paragraphcnt - 1].runs[0].font.name = '仿宋_GB2312'
    181.                                 docx.paragraphs[paragraphcnt - 1].runs[0].font.size = Pt(16)  # 字体大小3号
    182.                                 docx.paragraphs[paragraphcnt - 1].runs[0].element.rPr.rFonts.set(qn('w:eastAsia'), '仿宋_GB2312')
    183.                                 docx.paragraphs[paragraphcnt - 1].runs[0].bold = True  # 字体加粗
    184.                                 docx.paragraphs[paragraphcnt - 1].add_run(sentence_not_to_bold).bold = False
    185.                                 docx.paragraphs[paragraphcnt - 1].runs[1].font.name = '仿宋_GB2312'
    186.                                 docx.paragraphs[paragraphcnt - 1].runs[1].font.size = Pt(16)  # 字体大小3号
    187.                                 docx.paragraphs[paragraphcnt - 1].runs[1].element.rPr.rFonts.set(qn('w:eastAsia'), '仿宋_GB2312')
    188.                                 delete_paragraph(paragraph)
    189.                         elif GradeFourTitle(run.text): #判断是否为四级标题格式(如:(1)xxx)
    190.                             if "。" not in run.text:
    191.                                 run.font.name = '仿宋_GB2312'
    192.                                 run.element.rPr.rFonts.set(qn('w:eastAsia'), '仿宋_GB2312')
    193.                                 run.bold = True  # 字体加粗
    194.                             else:
    195.                                 sentence_to_bold = run.text.split('。')[0]+"。"
    196.                                 sentence_not_to_bold = run.text.split('。',1)[1]
    197.                                 paragraph.insert_paragraph_before(sentence_to_bold)
    198.                                 docx.paragraphs[paragraphcnt - 1].paragraph_format.first_line_indent = Pt(32)
    199.                                 docx.paragraphs[paragraphcnt - 1].paragraph_format.line_spacing = Pt(28)  # 行距固定值28磅
    200.                                 docx.paragraphs[paragraphcnt - 1].paragraph_format.space_after = Pt(0)  # 段后间距=0
    201.                                 docx.paragraphs[paragraphcnt - 1].runs[0].font.name = '仿宋_GB2312'
    202.                                 docx.paragraphs[paragraphcnt - 1].runs[0].font.size = Pt(16)  # 字体大小3号
    203.                                 docx.paragraphs[paragraphcnt - 1].runs[0].element.rPr.rFonts.set(qn('w:eastAsia'), '仿宋_GB2312')
    204.                                 docx.paragraphs[paragraphcnt - 1].runs[0].bold = True  # 字体加粗
    205.                                 docx.paragraphs[paragraphcnt - 1].add_run(sentence_not_to_bold).bold = False
    206.                                 docx.paragraphs[paragraphcnt - 1].runs[1].font.name = '仿宋_GB2312'
    207.                                 docx.paragraphs[paragraphcnt - 1].runs[1].font.size = Pt(16)  # 字体大小3号
    208.                                 docx.paragraphs[paragraphcnt - 1].runs[1].element.rPr.rFonts.set(qn('w:eastAsia'), '仿宋_GB2312')
    209.                                 delete_paragraph(paragraph)
    210.                         elif GradeFiveTitle(run.text): #判断是否为五级标题格式(如:一是xxx)
    211.                             if "。" not in run.text:                                
    212.                                 run.font.name = '仿宋_GB2312'
    213.                                 run.element.rPr.rFonts.set(qn('w:eastAsia'), '仿宋_GB2312')
    214.                                 run.bold = True  # 字体加粗
    215.                             else:                                
    216.                                 sentence_to_bold = run.text.split('。')[0]+"。"
    217.                                 sentence_not_to_bold = run.text.split('。',1)[1]
    218.                                 paragraph.insert_paragraph_before(sentence_to_bold)
    219.                                 docx.paragraphs[paragraphcnt - 1].paragraph_format.first_line_indent = Pt(32)
    220.                                 docx.paragraphs[paragraphcnt - 1].paragraph_format.line_spacing = Pt(28)  # 行距固定值28磅
    221.                                 docx.paragraphs[paragraphcnt - 1].paragraph_format.space_after = Pt(0)  # 段后间距=0
    222.                                 docx.paragraphs[paragraphcnt - 1].runs[0].font.name = '仿宋_GB2312'
    223.                                 docx.paragraphs[paragraphcnt - 1].runs[0].font.size = Pt(16)  # 字体大小3号
    224.                                 docx.paragraphs[paragraphcnt - 1].runs[0].element.rPr.rFonts.set(qn('w:eastAsia'), '仿宋_GB2312')
    225.                                 docx.paragraphs[paragraphcnt - 1].runs[0].bold = True  # 字体加粗
    226.                                 docx.paragraphs[paragraphcnt - 1].add_run(sentence_not_to_bold).bold = False
    227.                                 docx.paragraphs[paragraphcnt - 1].runs[1].font.name = '仿宋_GB2312'
    228.                                 docx.paragraphs[paragraphcnt - 1].runs[1].font.size = Pt(16)  # 字体大小3号
    229.                                 docx.paragraphs[paragraphcnt - 1].runs[1].element.rPr.rFonts.set(qn('w:eastAsia'), '仿宋_GB2312')
    230.                                 delete_paragraph(paragraph)
    231.                         elif LuoKuan(run.text):  # 判断是否为落款格式
    232.                             run.font.name = '仿宋_GB2312'
    233.                             run.element.rPr.rFonts.set(qn('w:eastAsia'), '仿宋_GB2312')
    234.                             run.text = "\r" * 2 + run.text  # 前置空格,顶到最右,需手动调整空格
    235.                             paragraph.paragraph_format.left_indent = Pt(288)    #18B*16Pt=288Pt
    236.                         else: #普通正文格式
    237.                             run.font.name = '仿宋_GB2312'
    238.                             run.element.rPr.rFonts.set(qn('w:eastAsia'), '仿宋_GB2312')
    239.             setMargin(docx)
    240.             docx.save(file)
    241. if __name__ == '__main__':
    242.     OneKeyWord()
    243.     os.system("pause")
    复制代码
    到此这篇关于Python实现自动化Word排版的文章就介绍到这了,更多相关Python Word排版内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

    来源:https://www.jb51.net/python/340032dyz.htm
    免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

    最新评论

    QQ Archiver 手机版 小黑屋 福建二哥 ( 闽ICP备2022004717号|闽公网安备35052402000345号 )

    Powered by Discuz! X3.5 © 2001-2023

    快速回复 返回顶部 返回列表