Python办公自动化之——调整Word样式(二)

文档格式自动化是一个非常繁琐但又不可或缺的工作,尤其是在特定场景中,例如每年毕业季的论文排版。在毕业季,学生们需要提交符合严格格式要求的毕业论文,这些要求通常包括封面格式、目录、标题格式、页眉页脚、行间距、段前段后距离、引用格式等。手动调整这些格式不仅耗时,而且容易出错。每个细节都可能影响最终的排版效果,因此自动化处理这些格式就显得尤为重要。
毕业论文通常包含多个层级的标题、图表、引用和大量的文本内容。对于没有经验的学生来说,手动设置和调整这些格式可能需要耗费大量的时间。而且,即使是有经验的人员,也可能会在大量重复性工作中出错。使用Python等编程语言通过Word处理库(如python-docx)来自动化文档格式设置,可以显著提高效率和准确性。

一、 文档格式检查与输出

要正确获取并输出文档中所有段落的样式信息,可以使用以下程序。这段代码会遍历文档中的所有段落,并打印每个段落的样式名称及其文本内容。这样可以帮助你检查每个段落的样式,以便进一步调试和调整标题样式。

from docx import Document

def print_paragraph_styles(doc_path):
    doc = Document(doc_path)
    
    for i, paragraph in enumerate(doc.paragraphs):
        style_name = paragraph.style.name
        text = paragraph.text
        print(f"Paragraph {i}: Style: {style_name}, Text: {text}")

# 请将下面路径替换为您要读取的Word文档的路径
file_path = 'target55.docx'
print_paragraph_styles(file_path)

这段代码会输出文档中每个段落的索引、样式名称和文本内容。通过检查这些输出,你可以了解每个段落的实际样式,以便发现那些未被识别为标题的段落的原因。

运行这段代码后,你可能会看到类似如下的输出:

Paragraph 0: Style: Normal, Text: This is some normal text.
Paragraph 1: Style: Heading 1, Text: 一级标题 1
Paragraph 2: Style: Normal, Text: This is some text under 一级标题 1.
Paragraph 3: Style: Heading 2, Text: 二级标题 1.1

通过这种方式,你可以确定每个段落的样式是否正确应用,从而找出那些未被识别为标题的段落,并进行相应的调整。如果有些段落应该是标题但显示为其他样式,你可以手动或通过程序将这些段落的样式调整为正确的标题样式。

二、定制样式修改段落格式

这段Python程序使用python-docx库来修改Word文档中的段落样式。具体来说,它将所有段落中的文本设置为宋体、小四号(12磅)和黑色,同时应用特定的段落格式设置。以下是程序的详细解释:

  • 导入模块
from docx import Document
from docx.shared import Pt, RGBColor
from docx.oxml.ns import qn

这里导入了处理Word文档的Document类,以及用于设置字体大小和颜色的PtRGBColor类。qn函数用于处理Word文档中的命名空间。

  • 定义设置自定义样式的函数
def set_custom_style(paragraph):
    # 设置段落中的所有run的字体为宋体,小四号,并且颜色为黑色
    for run in paragraph.runs:
        run.font.name = '宋体'
        run._element.rPr.rFonts.set(qn('w:eastAsia'), '宋体')
        run.font.size = Pt(12)  # 小四号对应12磅
        run.font.color.rgb = RGBColor(0, 0, 0)  # 字体颜色为黑色

此函数set_custom_style接受一个段落对象,并将段落中的每个run(一段文本的一个连续部分)的字体设置为宋体、大小设置为小四号(12磅),颜色设置为黑色。

# 设置段落格式
    paragraph_format = paragraph.paragraph_format
    paragraph_format.line_spacing = Pt(20)  # 行间距为20磅
    paragraph_format.space_before = Pt(0)  # 段前为0
    paragraph_format.space_after = Pt(0)  # 段后为0
    paragraph_format.first_line_indent = Pt(24)  # 首行缩进2个中文字符(每个中文字符宽度为12磅

该段代码设置段落的格式,包括:行间距为20磅;段前和段后间距为0;首行缩进2个中文字符(24磅)。

  • 定义应用自定义样式到整个文档的函数
def apply_custom_style_to_document(doc_path):
    # 打开文档
    doc = Document(doc_path)
    
    # 对文档中的每个段落应用自定义样式
    for paragraph in doc.paragraphs:
        set_custom_style(paragraph)
    
    # 保存修改后的文档
    doc.save('modified_' + doc_path)` 

此函数apply_custom_style_to_document接受文档路径作为参数。它执行以下操作:打开指定路径的Word文档;对文档中的每个段落调用set_custom_style函数,应用自定义样式;保存修改后的文档,文件名为modified_加上原始文档名。

  • 调用函数修改目标文档的格式
apply_custom_style_to_document('target.docx')

这行代码调用apply_custom_style_to_document函数,传入文档target.docx的路径,修改其格式并保存修改后的文档。

这个程序自动化地调整Word文档中的段落样式,使每个段落的文本格式统一为宋体、小四号(12磅)、黑色,行间距为20磅,段前段后间距为0,首行缩进2个中文字符。这在处理大量需要统一格式的文档时非常有用,特别是对于学术论文、报告等要求严格格式的文档。

三、自动生成目录

程序使用 python-docx 库来修改现有的 Word 文档,在文档的开头插入一个目录,并为文档中的标题设置特定的样式。

import os
from docx import Document
from docx.enum.text import WD_PARAGRAPH_ALIGNMENT
from docx.oxml.ns import qn
from docx.shared import Pt, RGBColor
from docx.oxml import OxmlElement

def add_toc(paragraph):
    run = paragraph.add_run()
    fldChar1 = OxmlElement('w:fldChar')
    fldChar1.set(qn('w:fldCharType'), 'begin')
    run._r.append(fldChar1)

    instrText = OxmlElement('w:instrText')
    instrText.set(qn('xml:space'), 'preserve')
    instrText.text = 'TOC \\o "1-3" \\h \\z \\u'
    run._r.append(instrText)

    fldChar2 = OxmlElement('w:fldChar')
    fldChar2.set(qn('w:fldCharType'), 'separate')
    run._r.append(fldChar2)

    fldChar3 = OxmlElement('w:fldChar')
    fldChar3.set(qn('w:fldCharType'), 'end')
    run._r.append(fldChar3)

def set_heading_style(paragraph, level):
    if paragraph.runs:
        run = paragraph.runs[0]
        run.font.name = '黑体'
        run._element.rPr.rFonts.set(qn('w:eastAsia'), '黑体')
        
        if level == 1:
            run.font.size = Pt(16)  # 三号字
            paragraph.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
            paragraph.paragraph_format.space_before = Pt(18)
            paragraph.paragraph_format.space_after = Pt(30)
            paragraph.paragraph_format.line_spacing = Pt(20)
        elif level == 2:
            run.font.size = Pt(14)  # 四号字
            paragraph.alignment = WD_PARAGRAPH_ALIGNMENT.LEFT
            paragraph.paragraph_format.space_before = Pt(10)  # 0.5行(10磅)
            paragraph.paragraph_format.space_after = Pt(10)   # 0.5行(10磅)
            paragraph.paragraph_format.line_spacing = Pt(20)
        elif level == 3:
            run.font.size = Pt(12)  # 小四号字
            paragraph.alignment = WD_PARAGRAPH_ALIGNMENT.LEFT
            paragraph.paragraph_format.space_before = Pt(10)  # 0.5行(10磅)
            paragraph.paragraph_format.space_after = Pt(10)   # 0.5行(10磅)
            paragraph.paragraph_format.line_spacing = Pt(20)
        
        # 设置序号与标题之间空一格
        run.text = run.text.split(' ')[0] + ' ' + ' '.join(run.text.split(' ')[1:])

def generate_toc_for_existing_document(doc_path):
    doc = Document(doc_path)
    
    # 插入目录到文档的开头
    toc_paragraph = doc.paragraphs[0].insert_paragraph_before()
    add_toc(toc_paragraph)
    toc_paragraph.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
    
    # 插入分页符,使文件内容自动后移
    doc.add_page_break()
    
    # 为所有的标题设置样式
    for paragraph in doc.paragraphs:
        if paragraph.style.name.startswith('Heading'):
            level = int(paragraph.style.name.split()[-1])
            if level in [1, 2, 3]:  # 仅对一、二、三级标题应用样式
                set_heading_style(paragraph, level)
    
    # 保存修改后的文档
    modified_doc_path = 'modified_' + os.path.basename(doc_path)
    doc.save(modified_doc_path)
    print(f"Document saved as {modified_doc_path}. Please open it in Word and update the TOC fields.")

# 请将下面路径替换为您要读取的Word文档的路径
file_path = 'target55.docx'
generate_toc_for_existing_document(file_path)

注意!!!:程序处理完后,并不能在文档中看到生成的目录,需要选中更新才能看到。(Document saved as modified_target55.docx. Please open it in Word and update the TOC fields.)

直接打开文档 选中更新后的文档
选中右键选择更新域

该程序自动化地为现有的 Word 文档添加目录,并根据标题级别调整标题样式。它简化了手动操作的繁琐过程,特别适用于需要大量文档格式统一的场景,如学术论文、报告和项目文档的处理。

总结

Python办公自动化的应用在现代办公环境中越来越重要,尤其在文档处理方面。通过Python,可以实现对文档的检查、修改段落格式以及自动生成目录等功能,从而极大地提高了工作效率。这里通过Python进行文档检查、修改段落格式和自动生成目录,不仅提高了文档处理的效率,还确保了文档格式的标准化和一致性。这些功能在学术、企业、出版等领域有广泛的应用,充分展示了Python在办公自动化中的强大能力。通过不断扩展和优化Python脚本,办公自动化将变得更加高效和智能。

posted @ 2024-05-28 08:39  郝hai  阅读(562)  评论(0编辑  收藏  举报