Python实现自动化Word排版

Written by

in

文章目录
  • 在Python中,我们可以使用python-docx库来操作Word文档。它提供了丰富的函数和方法,用于创建、修改和格式化Word文档。我们可以通过以下代码导入python-docx库: import docx
  • 首先,我们需要打开要进行排版的Word文档。可以使用python-docx库提供的`Document`类来打开现有的文档。  打开Word文档: doc = docx.Document(‘example.docx’)
  • 接下来,我们将使用python-docx库提供的功能来实现自动化的Word排版。以下是一些常见的排版操作示例: 1. 设置页面大小和边距: doc.sections[0].page_width = docx.shared.Inches(8.5) doc.sections[0].page_height = docx.shared.Inches(11) doc.sections[0].left_margin = docx.shared.Inches(1) doc.sections[0].right_margin = docx.shared.Inches(1) doc.sections[0].top_margin = docx.shared.Inches(1) doc.sections[0].bottom_margin = docx.shared.Inches(1) 2. 插入标题: doc.add_heading(‘自动化Word排版’, level=1) 3. 插入段落: doc.add_paragraph(‘在今天的文章中,我们将介绍如何使用Python实现自动化的Word排版。’) 4. 设置字体样式: paragraph = doc.add_paragraph() run = paragraph.add_run(‘这是一个示例文本。’) font = run.font font.name = ‘Arial’ font.size = docx.shared.Pt(12) font.bold = True 5. 插入图片: doc.add_picture(‘example.jpg’, width=docx.shared.Inches(4), height=docx.shared.Inches(3))
  • 完成排版后,我们需要保存并关闭文档。 1. 保存文档: doc.save(‘formatted_example.docx’) 2. 关闭文档: doc.close()
  • 通过使用Python的python-docx库,我们可以轻松地实现自动化的Word排版。通过打开文档、进行自动化排版操作,以及保存并关闭文档,我们能够提升文档编辑的效率和质量。 参考代码: import docx doc = docx.Document(‘example.docx’) # 自动化排版操作示例 doc.sections[0].page_width = docx.shared.Inches(8.5) doc.sections[0].page_height = docx.shared.Inches(11) doc.sections[0].left_margin = docx.shared.Inches(1) doc.sections[0].right_margin = docx.shared.Inches(1) doc.sections[0].top_margin = docx.shared.Inches(1) doc.sections[0].bottom_margin = docx.shared.Inches(1) doc.add_heading(‘自动化Word排版’, level=1) doc.add_paragraph(‘在今天的文章中,我们将介绍如何使用Python实现自动化的Word排版。’) paragraph = doc.add_paragraph() run = paragraph.add_run(‘这是一个示例文本。’) font = run.font font.name = ‘Arial’ font.size = docx.shared.Pt(12) font.bold = True doc.add_picture(‘example.jpg’, width=docx.shared.Inches(4), height=docx.shared.Inches(3)) # 保存并关闭文档 doc.save(‘formatted_example.docx’) doc.close()
  • 用Python编写的Word一键排版工具 import docx from docx.oxml.ns import qn from docx.shared import Pt, Cm, Mm from docx.enum.text import * import os import sys from docx import Document from PyQt5.QtWidgets import QApplication, QFileDialog # 删除段落 def delete_paragraph(paragraph): p = paragraph._element p.getparent().remove(p) # p._p = p._element = None paragraph._p = paragraph._element = None #判断是否为落款格式 def LuoKuan(str): for i in str: if i in punc: return False 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)): return True else: return False def setMargin(docx): section = docx.sections[0] section.page_height = Cm(29.7) section.page_width = Cm(21.0) section.left_margin = Cm(2.8) section.right_margin = Cm(2.6) section.top_margin = Cm(3.7) section.bottom_margin = Cm(3.5) #判断是否为一级标题格式(如:一、xxx) def GradeOneTitle(str): if ((str[0] in cn_num) and (str[1] == “、”)) or ((str[0] in cn_num) and (str[1] in cn_num) and (str[2] == “、”)): return True else: return False #判断是否为二级标题格式(如:(一)xxx) def GradeTwoTitle(str): 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] == “)”)): return True else: return False #判断是否为三级标题格式(如:1.xxx) def GradeThreeTitle(str): 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)): return True else: return False #判断是否为四级标题格式(如:(1)xxx) def GradeFourTitle(str): 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] == “)”)): return True else: return False #判断是否为五级标题格式(如:一是XXX) def GradeFiveTitle(str): 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)): return True else: return False def OneKeyWord(): global cn_num,num,punc,must cn_num = [“一”, “二”, “三”, “四”, “五”, “六”, “七”, “八”, “九”, “十”] num = [“1”, “2”, “3”, “4”, “5”, “6”, “7”, “8”, “9”, “0”] punc = [“。”, “,”, “!”, “?”, “:”, “;”, “、”, “.”, “(”, “)”,”.”] must = [“要”, “是”, “能”] filecnt = 0 print(‘欢迎使用Word一键排版工具!创作者QQ:124500535’) confirm= input(“是否打开Word文档?输入“Y”表示“打开”,输入“N”表示“取消”!”) if confirm == ‘Y’ or confirm == ‘y’: a = QApplication([”]) files, stylel = QFileDialog.getOpenFileNames(caption=”多文件选择”, directory=”/”, filter=”Word 文档(*.docx)”) print(files) # 打印所选文件全部路径(包括文件名和后缀名)和文件类型 for file in files: docx = Document(file) paragraphcnt = 0 filecnt= filecnt+1 print(‘这是第%s个文件:%s’ %(filecnt,file)) for paragraph in docx.paragraphs: paragraphcnt = paragraphcnt +1 paragraph.text=paragraph.text.replace(“,”,”,”) paragraph.text=paragraph.text.replace(“;”,”;”) paragraph.text=paragraph.text.replace(“:”,”:”) paragraph.text=paragraph.text.replace(“!”,”!”) paragraph.text=paragraph.text.replace(“?”,”?”) paragraph.text=paragraph.text.replace(“(“,”(”) paragraph.text=paragraph.text.replace(“)”,”)”) paragraph.text=paragraph.text.replace(” “,””) paragraph.text=paragraph.text.replace(“t”, “”) paragraph.text = paragraph.text.replace(“n”, “”) if paragraph.text == ”: delete_paragraph(paragraph) paragraphcnt = paragraphcnt-1 continue paragraph.paragraph_format.left_indent = 0 #预先对缩进赋值, 防止对象为空报错 paragraph.paragraph_format.element.pPr.ind.set(qn(“w:firstLineChars”), ‘0’) #并去除缩进 paragraph.paragraph_format.element.pPr.ind.set(qn(“w:firstLine”), ‘0’) paragraph.paragraph_format.element.pPr.ind.set(qn(“w:leftChars”), ‘0’) paragraph.paragraph_format.element.pPr.ind.set(qn(“w:left”), ‘0’) paragraph.paragraph_format.element.pPr.ind.set(qn(“w:rightChars”), ‘0’) paragraph.paragraph_format.element.pPr.ind.set(qn(“w:right”), ‘0’) print(‘这是第%s段’ %paragraphcnt) print(paragraph.text) if paragraphcnt == 1 and len(paragraph.text)<40: #处理头部空行 #标题(方正小标宋_GBK、2号、加粗、居中、下端按2号字空一行) paragraph.paragraph_format.line_spacing=Pt(28) #行距固定值28磅 paragraph.paragraph_format.space_after = Pt(0) #段后间距=0 for run in paragraph.runs: run.font.size = Pt(22) # 字体大小2号 run.bold = False # 加粗 run.font.name = ‘方正小标宋_GBK’ # 控制是西文时的字体 run.element.rPr.rFonts.set(qn(‘w:eastAsia’), ‘方正小标宋_GBK’) # 控制是中文时的字体 paragraph.alignment = WD_ALIGN_PARAGRAPH.CENTER # 居中 continue elif paragraphcnt == 2 and len(paragraph.text) < 30: # 作者单位、姓名 paragraph.paragraph_format.line_spacing = Pt(28) # 行距固定值28磅 paragraph.paragraph_format.space_after = Pt(0) # 段后间距=0 for run in paragraph.runs: run.font.size = Pt(16) # 字体大小2号 run.bold = False # 加粗 run.font.name = ‘楷体’ # 控制是西文时的字体 run.element.rPr.rFonts.set(qn(‘w:eastAsia’), ‘楷体’) # 控制是中文时的字体 paragraph.alignment = WD_ALIGN_PARAGRAPH.CENTER # 居中 continue elif paragraphcnt == 3 and len(paragraph.text) < 30 and (paragraph.text[0] == “(”) and (paragraph.text[1] in num): # 日期,如(2023年6月15日) paragraph.paragraph_format.line_spacing = Pt(28) # 行距固定值28磅 paragraph.paragraph_format.space_after = Pt(0) # 段后间距=0 for run in paragraph.runs: run.font.size = Pt(16) # 字体大小2号 run.bold = False # 加粗 run.font.name = ‘楷体’ # 控制是西文时的字体 run.element.rPr.rFonts.set(qn(‘w:eastAsia’), ‘楷体’) # 控制是中文时的字体 paragraph.alignment = WD_ALIGN_PARAGRAPH.CENTER # 居中 continue # #处理正文 else: paragraph.paragraph_format.line_spacing = Pt(28) # 行距固定值28磅 paragraph.paragraph_format.space_after = Pt(0) # 段后间距=0 paragraph.paragraph_format.first_line_indent = Pt(32) for run in paragraph.runs: run.font.size = Pt(16) # 字体大小3号 run.bold = False # 字体不加粗 run.font.name = ‘仿宋_GB2312’ run.element.rPr.rFonts.set(qn(‘w:eastAsia’), ‘仿宋_GB2312’) if GradeOneTitle(run.text): #判断是否为一级标题格式(如:一、xxx) run.font.name = ‘黑体’ run.element.rPr.rFonts.set(qn(‘w:eastAsia’), ‘黑体’) elif GradeTwoTitle(run.text): #判断是否为二级标题格式(如:(一)xxx) if “。” not in run.text: run.font.name = ‘楷体’ run.element.rPr.rFonts.set(qn(‘w:eastAsia’), ‘楷体’) else: run.text = run.text.split(‘。’,1) run.font.name = ‘楷体’ run.element.rPr.rFonts.set(qn(‘w:eastAsia’), ‘楷体’) elif GradeThreeTitle(run.text): #判断是否为三级标题格式(如:1.xxx) if “。” not in run.text: if (run.text[0] in num) and (run.text[1] in punc): run.text = run.text.replace(run.text[1], “.”,1) if (run.text[0] in num) and (run.text[1] in num) and (run.text[2] in punc): run.text = run.text.replace(run.text[2], “.”, 1) run.font.name = ‘仿宋_GB2312’ run.element.rPr.rFonts.set(qn(‘w:eastAsia’), ‘仿宋_GB2312’) run.bold = True # 字体加粗 else: if (run.text[0] in num) and (run.text[1] in punc): run.text = run.text.replace(run.text[1], “.”, 1) if (run.text[0] in num) and (run.text[1] in num) and (run.text[2] in punc): run.text = run.text.replace(run.text[2], “.”, 1) sentence_to_bold = run.text.split(‘。’)[0]+”。” sentence_not_to_bold = run.text.split(‘。’,1)[1] paragraph.insert_paragraph_before(sentence_to_bold) docx.paragraphs[paragraphcnt – 1].paragraph_format.first_line_indent = Pt(32) docx.paragraphs[paragraphcnt – 1].paragraph_format.line_spacing = Pt(28) # 行距固定值28磅 docx.paragraphs[paragraphcnt – 1].paragraph_format.space_after = Pt(0) # 段后间距=0 docx.paragraphs[paragraphcnt – 1].runs[0].font.name = ‘仿宋_GB2312’ docx.paragraphs[paragraphcnt – 1].runs[0].font.size = Pt(16) # 字体大小3号 docx.paragraphs[paragraphcnt – 1].runs[0].element.rPr.rFonts.set(qn(‘w:eastAsia’), ‘仿宋_GB2312’) docx.paragraphs[paragraphcnt – 1].runs[0].bold = True # 字体加粗 docx.paragraphs[paragraphcnt – 1].add_run(sentence_not_to_bold).bold = False docx.paragraphs[paragraphcnt – 1].runs[1].font.name = ‘仿宋_GB2312’ docx.paragraphs[paragraphcnt – 1].runs[1].font.size = Pt(16) # 字体大小3号 docx.paragraphs[paragraphcnt – 1].runs[1].element.rPr.rFonts.set(qn(‘w:eastAsia’), ‘仿宋_GB2312’) delete_paragraph(paragraph) elif GradeFourTitle(run.text): #判断是否为四级标题格式(如:(1)xxx) if “。” not in run.text: run.font.name = ‘仿宋_GB2312’ run.element.rPr.rFonts.set(qn(‘w:eastAsia’), ‘仿宋_GB2312’) run.bold = True # 字体加粗 else: sentence_to_bold = run.text.split(‘。’)[0]+”。” sentence_not_to_bold = run.text.split(‘。’,1)[1] paragraph.insert_paragraph_before(sentence_to_bold) docx.paragraphs[paragraphcnt – 1].paragraph_format.first_line_indent = Pt(32) docx.paragraphs[paragraphcnt – 1].paragraph_format.line_spacing = Pt(28) # 行距固定值28磅 docx.paragraphs[paragraphcnt – 1].paragraph_format.space_after = Pt(0) # 段后间距=0 docx.paragraphs[paragraphcnt – 1].runs[0].font.name = ‘仿宋_GB2312’ docx.paragraphs[paragraphcnt – 1].runs[0].font.size = Pt(16) # 字体大小3号 docx.paragraphs[paragraphcnt – 1].runs[0].element.rPr.rFonts.set(qn(‘w:eastAsia’), ‘仿宋_GB2312’) docx.paragraphs[paragraphcnt – 1].runs[0].bold = True # 字体加粗 docx.paragraphs[paragraphcnt – 1].add_run(sentence_not_to_bold).bold = False docx.paragraphs[paragraphcnt – 1].runs[1].font.name = ‘仿宋_GB2312’ docx.paragraphs[paragraphcnt – 1].runs[1].font.size = Pt(16) # 字体大小3号 docx.paragraphs[paragraphcnt – 1].runs[1].element.rPr.rFonts.set(qn(‘w:eastAsia’), ‘仿宋_GB2312’) delete_paragraph(paragraph) elif GradeFiveTitle(run.text): #判断是否为五级标题格式(如:一是xxx) if “。” not in run.text: run.font.name = ‘仿宋_GB2312’ run.element.rPr.rFonts.set(qn(‘w:eastAsia’), ‘仿宋_GB2312’) run.bold = True # 字体加粗 else: sentence_to_bold = run.text.split(‘。’)[0]+”。” sentence_not_to_bold = run.text.split(‘。’,1)[1] paragraph.insert_paragraph_before(sentence_to_bold) docx.paragraphs[paragraphcnt – 1].paragraph_format.first_line_indent = Pt(32) docx.paragraphs[paragraphcnt – 1].paragraph_format.line_spacing = Pt(28) # 行距固定值28磅 docx.paragraphs[paragraphcnt – 1].paragraph_format.space_after = Pt(0) # 段后间距=0 docx.paragraphs[paragraphcnt – 1].runs[0].font.name = ‘仿宋_GB2312’ docx.paragraphs[paragraphcnt – 1].runs[0].font.size = Pt(16) # 字体大小3号 docx.paragraphs[paragraphcnt – 1].runs[0].element.rPr.rFonts.set(qn(‘w:eastAsia’), ‘仿宋_GB2312’) docx.paragraphs[paragraphcnt – 1].runs[0].bold = True # 字体加粗 docx.paragraphs[paragraphcnt – 1].add_run(sentence_not_to_bold).bold = False docx.paragraphs[paragraphcnt – 1].runs[1].font.name = ‘仿宋_GB2312’ docx.paragraphs[paragraphcnt – 1].runs[1].font.size = Pt(16) # 字体大小3号 docx.paragraphs[paragraphcnt – 1].runs[1].element.rPr.rFonts.set(qn(‘w:eastAsia’), ‘仿宋_GB2312’) delete_paragraph(paragraph) elif LuoKuan(run.text): # 判断是否为落款格式 run.font.name = ‘仿宋_GB2312’ run.element.rPr.rFonts.set(qn(‘w:eastAsia’), ‘仿宋_GB2312’) run.text = “r” * 2 + run.text # 前置空格,顶到最右,需手动调整空格 paragraph.paragraph_format.left_indent = Pt(288) #18B*16Pt=288Pt else: #普通正文格式 run.font.name = ‘仿宋_GB2312’ run.element.rPr.rFonts.set(qn(‘w:eastAsia’), ‘仿宋_GB2312’) setMargin(docx) docx.save(file) if __name__ == ‘__main__’: OneKeyWord() os.system(“pause”) 到此这篇关于Python实现自动化Word排版的文章就介绍到这了,更多相关Python Word排版内容请搜索风君子博客以前的文章或继续浏览下面的相关文章希望大家以后多多支持风君子博客! 您可能感兴趣的文章: 如何基于Python实现word文档重新排版 Python实现自动化批量调整Word样式 python如何使用python-docx调整Word文档样式 使用python实现将excel数据导入word并设置字体样式的代码示例 Python实现Word文档样式批量处理 Python设置Word全局样式和文本样式的示例代码 Python快速优雅的批量修改Word文档样式
  • 目录
    • 一、导入必要的库
    • 二、打开Word文档
    • 三、自动化排版
    • 四、保存并关闭文档
    • 五、总结
    • 六、方法补充

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

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

    import docx

    首先,我们需要打开要进行排版的Word文档。可以使用python-docx库提供的`Document`类来打开现有的文档。

     打开Word文档:

    doc = docx.Document('example.docx')

    接下来,我们将使用python-docx库提供的功能来实现自动化的Word排版。以下是一些常见的排版操作示例:

    1. 设置页面大小和边距:

    doc.sections[0].page_width = docx.shared.Inches(8.5)
    doc.sections[0].page_height = docx.shared.Inches(11)
    doc.sections[0].left_margin = docx.shared.Inches(1)
    doc.sections[0].right_margin = docx.shared.Inches(1)
    doc.sections[0].top_margin = docx.shared.Inches(1)
    doc.sections[0].bottom_margin = docx.shared.Inches(1)

    2. 插入标题:

    doc.add_heading('自动化Word排版', level=1)

    3. 插入段落:

    doc.add_paragraph('在今天的文章中,我们将介绍如何使用Python实现自动化的Word排版。')

    4. 设置字体样式:

    paragraph = doc.add_paragraph()
    run = paragraph.add_run('这是一个示例文本。')
    font = run.font
    font.name = 'Arial'
    font.size = docx.shared.Pt(12)
    font.bold = True

    5. 插入图片:

    doc.add_picture('example.jpg', width=docx.shared.Inches(4), height=docx.shared.Inches(3))

    完成排版后,我们需要保存并关闭文档。

    1. 保存文档:

    doc.save('formatted_example.docx')

    2. 关闭文档:

    doc.close()

    通过使用Python的python-docx库,我们可以轻松地实现自动化的Word排版。通过打开文档、进行自动化排版操作,以及保存并关闭文档,我们能够提升文档编辑的效率和质量。

    参考代码:

    import docx
    doc = docx.Document('example.docx')
    # 自动化排版操作示例
    doc.sections[0].page_width = docx.shared.Inches(8.5)
    doc.sections[0].page_height = docx.shared.Inches(11)
    doc.sections[0].left_margin = docx.shared.Inches(1)
    doc.sections[0].right_margin = docx.shared.Inches(1)
    doc.sections[0].top_margin = docx.shared.Inches(1)
    doc.sections[0].bottom_margin = docx.shared.Inches(1)
    doc.add_heading('自动化Word排版', level=1)
    doc.add_paragraph('在今天的文章中,我们将介绍如何使用Python实现自动化的Word排版。')
    paragraph = doc.add_paragraph()
    run = paragraph.add_run('这是一个示例文本。')
    font = run.font
    font.name = 'Arial'
    font.size = docx.shared.Pt(12)
    font.bold = True
    doc.add_picture('example.jpg', width=docx.shared.Inches(4), height=docx.shared.Inches(3))
    # 保存并关闭文档
    doc.save('formatted_example.docx')
    doc.close()

    用Python编写的Word一键排版工具

    import docx
    from docx.oxml.ns import qn
    from docx.shared import Pt, Cm, Mm
    from docx.enum.text import *
    import os
    import sys
    from docx import Document
    from PyQt5.QtWidgets import QApplication, QFileDialog
    # 删除段落
    def delete_paragraph(paragraph):
        p = paragraph._element
        p.getparent().remove(p)
    # p._p = p._element = None
        paragraph._p = paragraph._element = None
     
    #判断是否为落款格式
    def LuoKuan(str):
        for i in str:
            if i in punc:
                return False
        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)):
            return True
        else:
            return False
    def setMargin(docx):
        section = docx.sections[0]
        section.page_height = Cm(29.7)
        section.page_width = Cm(21.0)
        section.left_margin = Cm(2.8)
        section.right_margin = Cm(2.6)
        section.top_margin = Cm(3.7)
        section.bottom_margin = Cm(3.5)
     
    #判断是否为一级标题格式(如:一、xxx)
    def GradeOneTitle(str):
        if ((str[0] in cn_num) and (str[1] == "、")) or ((str[0] in cn_num) and (str[1] in cn_num) and (str[2] == "、")):
            return True
        else:
            return False
     
    #判断是否为二级标题格式(如:(一)xxx)
    def GradeTwoTitle(str):
        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] == ")")):
            return True
        else:
            return False
    #判断是否为三级标题格式(如:1.xxx)
    def GradeThreeTitle(str):
        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)):
            return True
        else:
            return False
    #判断是否为四级标题格式(如:(1)xxx)
    def GradeFourTitle(str):
        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] == ")")):
            return True
        else:
            return False
     
    #判断是否为五级标题格式(如:一是XXX)
    def GradeFiveTitle(str):
        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)):
            return True
        else:
            return False
     
    def OneKeyWord():
        global cn_num,num,punc,must
        cn_num = ["一", "二", "三", "四", "五", "六", "七", "八", "九", "十"]
        num = ["1", "2", "3", "4", "5", "6", "7", "8", "9", "0"]
        punc = ["。", ",", "!", "?", ":", ";", "、", ".", "(", ")","."]
        must = ["要", "是", "能"]
        filecnt = 0
        print('欢迎使用Word一键排版工具!创作者QQ:124500535')
        confirm= input("是否打开Word文档?输入“Y”表示“打开”,输入“N”表示“取消”!")
        if confirm == 'Y' or confirm == 'y':
            a = QApplication([''])
            files, stylel = QFileDialog.getOpenFileNames(caption="多文件选择", directory="/", filter="Word 文档(*.docx)")
            print(files)  # 打印所选文件全部路径(包括文件名和后缀名)和文件类型
            for file in files:
                docx = Document(file)
                paragraphcnt = 0
                filecnt= filecnt+1
                print('这是第%s个文件:%s' %(filecnt,file))
                for paragraph in docx.paragraphs:
                    paragraphcnt = paragraphcnt +1
                    paragraph.text=paragraph.text.replace(",",",")
                    paragraph.text=paragraph.text.replace(";",";")
                    paragraph.text=paragraph.text.replace(":",":")
                    paragraph.text=paragraph.text.replace("!","!")
                    paragraph.text=paragraph.text.replace("?","?")
                    paragraph.text=paragraph.text.replace("(","(")
                    paragraph.text=paragraph.text.replace(")",")")
                    paragraph.text=paragraph.text.replace(" ","")
                    paragraph.text=paragraph.text.replace("t", "")
                    paragraph.text = paragraph.text.replace("n", "")
                    if paragraph.text == '':
                        delete_paragraph(paragraph)
                        paragraphcnt = paragraphcnt-1
                        continue
                    paragraph.paragraph_format.left_indent = 0  #预先对缩进赋值, 防止对象为空报错
                    paragraph.paragraph_format.element.pPr.ind.set(qn("w:firstLineChars"), '0')  #并去除缩进
                    paragraph.paragraph_format.element.pPr.ind.set(qn("w:firstLine"), '0')
                    paragraph.paragraph_format.element.pPr.ind.set(qn("w:leftChars"), '0')
                    paragraph.paragraph_format.element.pPr.ind.set(qn("w:left"), '0')
                    paragraph.paragraph_format.element.pPr.ind.set(qn("w:rightChars"), '0')
                    paragraph.paragraph_format.element.pPr.ind.set(qn("w:right"), '0')
                    print('这是第%s段' %paragraphcnt)
                    print(paragraph.text)
                    if paragraphcnt == 1 and len(paragraph.text)<40:
                        #处理头部空行
                        #标题(方正小标宋_GBK、2号、加粗、居中、下端按2号字空一行)
                        paragraph.paragraph_format.line_spacing=Pt(28)  #行距固定值28磅
                        paragraph.paragraph_format.space_after = Pt(0)  #段后间距=0
                        for run in paragraph.runs:
                            run.font.size = Pt(22)  # 字体大小2号
                            run.bold = False  # 加粗
                            run.font.name = '方正小标宋_GBK'  # 控制是西文时的字体
                            run.element.rPr.rFonts.set(qn('w:eastAsia'), '方正小标宋_GBK')  # 控制是中文时的字体
                            paragraph.alignment = WD_ALIGN_PARAGRAPH.CENTER # 居中
                        continue
                    elif paragraphcnt == 2 and len(paragraph.text) < 30:
                        # 作者单位、姓名
                        paragraph.paragraph_format.line_spacing = Pt(28)  # 行距固定值28磅
                        paragraph.paragraph_format.space_after = Pt(0)  # 段后间距=0
                        for run in paragraph.runs:
                            run.font.size = Pt(16)  # 字体大小2号
                            run.bold = False  # 加粗
                            run.font.name = '楷体'  # 控制是西文时的字体
                            run.element.rPr.rFonts.set(qn('w:eastAsia'), '楷体')  # 控制是中文时的字体
                            paragraph.alignment = WD_ALIGN_PARAGRAPH.CENTER  # 居中
                        continue
                    elif paragraphcnt == 3 and len(paragraph.text) < 30 and (paragraph.text[0] == "(") and (paragraph.text[1] in num):
                        # 日期,如(2023年6月15日)
                        paragraph.paragraph_format.line_spacing = Pt(28)  # 行距固定值28磅
                        paragraph.paragraph_format.space_after = Pt(0)  # 段后间距=0
                        for run in paragraph.runs:
                            run.font.size = Pt(16)  # 字体大小2号
                            run.bold = False  # 加粗
                            run.font.name = '楷体'  # 控制是西文时的字体
                            run.element.rPr.rFonts.set(qn('w:eastAsia'), '楷体')  # 控制是中文时的字体
                            paragraph.alignment = WD_ALIGN_PARAGRAPH.CENTER  # 居中
                        continue
                        # #处理正文
                    else:
                        paragraph.paragraph_format.line_spacing = Pt(28)  # 行距固定值28磅
                        paragraph.paragraph_format.space_after = Pt(0)  # 段后间距=0
                        paragraph.paragraph_format.first_line_indent = Pt(32)
                        for run in paragraph.runs:
                            run.font.size = Pt(16)  # 字体大小3号
                            run.bold = False  # 字体不加粗
                            run.font.name = '仿宋_GB2312'
                            run.element.rPr.rFonts.set(qn('w:eastAsia'), '仿宋_GB2312')
                            if GradeOneTitle(run.text): #判断是否为一级标题格式(如:一、xxx)
                                run.font.name = '黑体'
                                run.element.rPr.rFonts.set(qn('w:eastAsia'), '黑体')
                            elif GradeTwoTitle(run.text): #判断是否为二级标题格式(如:(一)xxx)
                                if "。" not in run.text:
                                    run.font.name = '楷体'
                                    run.element.rPr.rFonts.set(qn('w:eastAsia'), '楷体')
                                else:
                                    run.text = run.text.split('。',1)
                                    run.font.name = '楷体'
                                    run.element.rPr.rFonts.set(qn('w:eastAsia'), '楷体')
                            elif GradeThreeTitle(run.text): #判断是否为三级标题格式(如:1.xxx)
                                if "。" not in run.text:
                                    if (run.text[0] in num) and (run.text[1] in punc):
                                        run.text = run.text.replace(run.text[1], ".",1)
                                    if (run.text[0] in num) and (run.text[1] in num) and (run.text[2] in punc):
                                        run.text = run.text.replace(run.text[2], ".", 1)
                                    run.font.name = '仿宋_GB2312'
                                    run.element.rPr.rFonts.set(qn('w:eastAsia'), '仿宋_GB2312')
                                    run.bold = True  # 字体加粗
                                else:
                                    if (run.text[0] in num) and (run.text[1] in punc):
                                        run.text = run.text.replace(run.text[1], ".", 1)
                                    if (run.text[0] in num) and (run.text[1] in num) and (run.text[2] in punc):
                                        run.text = run.text.replace(run.text[2], ".", 1)
                                    sentence_to_bold = run.text.split('。')[0]+"。"
                                    sentence_not_to_bold = run.text.split('。',1)[1]
                                    paragraph.insert_paragraph_before(sentence_to_bold)
                                    docx.paragraphs[paragraphcnt - 1].paragraph_format.first_line_indent = Pt(32)
                                    docx.paragraphs[paragraphcnt - 1].paragraph_format.line_spacing = Pt(28)  # 行距固定值28磅
                                    docx.paragraphs[paragraphcnt - 1].paragraph_format.space_after = Pt(0)  # 段后间距=0
                                    docx.paragraphs[paragraphcnt - 1].runs[0].font.name = '仿宋_GB2312'
                                    docx.paragraphs[paragraphcnt - 1].runs[0].font.size = Pt(16)  # 字体大小3号
                                    docx.paragraphs[paragraphcnt - 1].runs[0].element.rPr.rFonts.set(qn('w:eastAsia'), '仿宋_GB2312')
                                    docx.paragraphs[paragraphcnt - 1].runs[0].bold = True  # 字体加粗
                                    docx.paragraphs[paragraphcnt - 1].add_run(sentence_not_to_bold).bold = False
                                    docx.paragraphs[paragraphcnt - 1].runs[1].font.name = '仿宋_GB2312'
                                    docx.paragraphs[paragraphcnt - 1].runs[1].font.size = Pt(16)  # 字体大小3号
                                    docx.paragraphs[paragraphcnt - 1].runs[1].element.rPr.rFonts.set(qn('w:eastAsia'), '仿宋_GB2312')
                                    delete_paragraph(paragraph)
                            elif GradeFourTitle(run.text): #判断是否为四级标题格式(如:(1)xxx)
                                if "。" not in run.text:
                                    run.font.name = '仿宋_GB2312'
                                    run.element.rPr.rFonts.set(qn('w:eastAsia'), '仿宋_GB2312')
                                    run.bold = True  # 字体加粗
                                else:
                                    sentence_to_bold = run.text.split('。')[0]+"。"
                                    sentence_not_to_bold = run.text.split('。',1)[1]
                                    paragraph.insert_paragraph_before(sentence_to_bold)
                                    docx.paragraphs[paragraphcnt - 1].paragraph_format.first_line_indent = Pt(32)
                                    docx.paragraphs[paragraphcnt - 1].paragraph_format.line_spacing = Pt(28)  # 行距固定值28磅
                                    docx.paragraphs[paragraphcnt - 1].paragraph_format.space_after = Pt(0)  # 段后间距=0
                                    docx.paragraphs[paragraphcnt - 1].runs[0].font.name = '仿宋_GB2312'
                                    docx.paragraphs[paragraphcnt - 1].runs[0].font.size = Pt(16)  # 字体大小3号
                                    docx.paragraphs[paragraphcnt - 1].runs[0].element.rPr.rFonts.set(qn('w:eastAsia'), '仿宋_GB2312')
                                    docx.paragraphs[paragraphcnt - 1].runs[0].bold = True  # 字体加粗
                                    docx.paragraphs[paragraphcnt - 1].add_run(sentence_not_to_bold).bold = False
                                    docx.paragraphs[paragraphcnt - 1].runs[1].font.name = '仿宋_GB2312'
                                    docx.paragraphs[paragraphcnt - 1].runs[1].font.size = Pt(16)  # 字体大小3号
                                    docx.paragraphs[paragraphcnt - 1].runs[1].element.rPr.rFonts.set(qn('w:eastAsia'), '仿宋_GB2312')
                                    delete_paragraph(paragraph)
                            elif GradeFiveTitle(run.text): #判断是否为五级标题格式(如:一是xxx)
                                if "。" not in run.text:                                
                                    run.font.name = '仿宋_GB2312'
                                    run.element.rPr.rFonts.set(qn('w:eastAsia'), '仿宋_GB2312')
                                    run.bold = True  # 字体加粗
                                else:                                
                                    sentence_to_bold = run.text.split('。')[0]+"。"
                                    sentence_not_to_bold = run.text.split('。',1)[1]
                                    paragraph.insert_paragraph_before(sentence_to_bold)
                                    docx.paragraphs[paragraphcnt - 1].paragraph_format.first_line_indent = Pt(32)
                                    docx.paragraphs[paragraphcnt - 1].paragraph_format.line_spacing = Pt(28)  # 行距固定值28磅
                                    docx.paragraphs[paragraphcnt - 1].paragraph_format.space_after = Pt(0)  # 段后间距=0
                                    docx.paragraphs[paragraphcnt - 1].runs[0].font.name = '仿宋_GB2312'
                                    docx.paragraphs[paragraphcnt - 1].runs[0].font.size = Pt(16)  # 字体大小3号
                                    docx.paragraphs[paragraphcnt - 1].runs[0].element.rPr.rFonts.set(qn('w:eastAsia'), '仿宋_GB2312')
                                    docx.paragraphs[paragraphcnt - 1].runs[0].bold = True  # 字体加粗
                                    docx.paragraphs[paragraphcnt - 1].add_run(sentence_not_to_bold).bold = False
                                    docx.paragraphs[paragraphcnt - 1].runs[1].font.name = '仿宋_GB2312'
                                    docx.paragraphs[paragraphcnt - 1].runs[1].font.size = Pt(16)  # 字体大小3号
                                    docx.paragraphs[paragraphcnt - 1].runs[1].element.rPr.rFonts.set(qn('w:eastAsia'), '仿宋_GB2312')
                                    delete_paragraph(paragraph)
                            elif LuoKuan(run.text):  # 判断是否为落款格式
                                run.font.name = '仿宋_GB2312'
                                run.element.rPr.rFonts.set(qn('w:eastAsia'), '仿宋_GB2312')
                                run.text = "r" * 2 + run.text  # 前置空格,顶到最右,需手动调整空格
                                paragraph.paragraph_format.left_indent = Pt(288)    #18B*16Pt=288Pt
                            else: #普通正文格式
                                run.font.name = '仿宋_GB2312'
                                run.element.rPr.rFonts.set(qn('w:eastAsia'), '仿宋_GB2312')
                setMargin(docx)
                docx.save(file)
    if __name__ == '__main__':
        OneKeyWord()
        os.system("pause")

    到此这篇关于Python实现自动化Word排版的文章就介绍到这了,更多相关Python Word排版内容请搜索风君子博客以前的文章或继续浏览下面的相关文章希望大家以后多多支持风君子博客!

    您可能感兴趣的文章:

    • 如何基于Python实现word文档重新排版
    • Python实现自动化批量调整Word样式
    • python如何使用python-docx调整Word文档样式
    • 使用python实现将excel数据导入word并设置字体样式的代码示例
    • Python实现Word文档样式批量处理
    • Python设置Word全局样式和文本样式的示例代码
    • Python快速优雅的批量修改Word文档样式

    站内搜索