Python辦公自動化之——調整Word樣式(二)

郝hai發表於2024-05-28

文件格式自動化是一個非常繁瑣但又不可或缺的工作,尤其是在特定場景中,例如每年畢業季的論文排版。在畢業季,學生們需要提交符合嚴格格式要求的畢業論文,這些要求通常包括封面格式、目錄、標題格式、頁首頁尾、行間距、段前段後距離、引用格式等。手動調整這些格式不僅耗時,而且容易出錯。每個細節都可能影響最終的排版效果,因此自動化處理這些格式就顯得尤為重要。
畢業論文通常包含多個層級的標題、圖表、引用和大量的文字內容。對於沒有經驗的學生來說,手動設定和調整這些格式可能需要耗費大量的時間。而且,即使是有經驗的人員,也可能會在大量重複性工作中出錯。使用Python等程式語言透過Word處理庫(如python-docx)來自動化文件格式設定,可以顯著提高效率和準確性。

Python辦公自動化之——調整Word樣式(二)

一、 文件格式檢查與輸出

要正確獲取並輸出文件中所有段落的樣式資訊,可以使用以下程式。這段程式碼會遍歷文件中的所有段落,並列印每個段落的樣式名稱及其文字內容。這樣可以幫助你檢查每個段落的樣式,以便進一步除錯和調整標題樣式。

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指令碼,辦公自動化將變得更加高效和智慧。

Python辦公自動化之——調整Word樣式(二)

相關文章