首頁 > 軟體

Python實現自動化處理Word檔案的方法詳解

2022-08-30 22:00:45

使用Python實現Word檔案的自動化處理,包括批次生成Word檔案、在Word檔案中批次進行查詢和替換、將Word檔案批次轉換成PDF等。

1. 批次生成Word檔案

安裝openpyxl模組

pip install openpyxl

安裝python-docx模組

pip install python-docx

openpyxl模組可以讀寫擴充套件名為.xlsx/.xlsm/.xltx/.xltm的Excel檔案。

python-docx模組可以讀寫擴充套件名為.docx的Word檔案,但不能處理擴充套件名為.doc的Word檔案。

import re

from docx.enum.table import WD_CELL_VERTICAL_ALIGNMENT, WD_TABLE_ALIGNMENT
from openpyxl import load_workbook
from docx import Document


def info_update(doc, old_info, new_info):
    """
    檔案內容替換
    :param doc: Word模板檔案
    :param old_info: 源文字
    :param new_info: 新文字
    :return:
    """
    # 遍歷Word檔案中的所有段落
    for para in doc.paragraphs:
        # 遍歷每個段落中的run物件
        for run in para.runs:
            # 替換run物件的文字內容
            # run.text = run.text.replace(r'《'+old_info+'》', new_info)
            run.text = run.text.replace(old_info, new_info)
            run.text = re.sub(r'[《》]', '', run.text)

    # 遍歷Word檔案中的所有表格
    for table in doc.tables:
        # 遍歷表格中的所有行
        for row in table.rows:
            # 遍歷行中的所有單元格
            for cell in row.cells:
                # 替換單元格內容
                cell.text = cell.text.replace('《' + old_info + '》', new_info)

        # 設定表格中的內容居中顯示
        # 計算表格的rows和cols的長度
        rows = len(table.rows)
        cols = len(table.columns)
        # 迴圈將每一行,每一列都設定為居中
        for r in range(rows):
            for c in range(cols):
                table.cell(r, c).vertical_alignment = WD_CELL_VERTICAL_ALIGNMENT.CENTER  # 垂直居中
                table.cell(r, c).paragraphs[0].paragraph_format.alignment = WD_TABLE_ALIGNMENT.CENTER  # 水平居中


wb = load_workbook('學生成績表.xlsx')  # 開啟工作簿
ws = wb.active  # 啟用工作簿中的工作表
# 遍歷工作表的行,從第2行開始
for row in range(2, ws.max_row + 1):
    doc = Document('成績通知書.docx')  # 建立檔案物件
    # 遍歷工作表的列
    for col in range(1, ws.max_column + 1):
        # 讀取當前列的第一行,即列標題,單元格的值轉換成字串
        old_info = str(ws.cell(row=1, column=col).value)
        # 讀取當前列的資料,單元格的值需要轉換成字串
        new_info = str(ws.cell(row=row, column=col).value)
        # 進行內容替換
        info_update(doc, old_info, new_info)
        student_name = str(ws.cell(row=row, column=1).value)
        doc.save(f'scores\成績單--致{student_name}.docx')

測試檔案:

測試效果:

2. 將Word檔案批次轉換成PDF

安裝pywin32模組

pip install pywin32
from pathlib import Path
from win32com.client import constants, gencache

# 建立Path物件
# 路徑要使用絕對路徑
src_folder = Path(r'E:pythonProjectpython辦公自動化第5章 自動化處理Word檔案scores')
output_folder = Path(r'E:pythonProjectpython辦公自動化第5章 自動化處理Word檔案PDF')
# 判斷輸出目錄是否存在
if not output_folder.exists():
    # 不存在則建立
    output_folder.mkdir(parents=True)

file_list = list(src_folder.glob('*[.docx|.doc]'))  # 獲得要轉換的Word檔案的路徑列表

word = gencache.EnsureDispatch('Word.Application')  # 建立Word程式物件
# word = win32com.client.Dispatch('Word.Application')
for word_path in file_list:
    # 生成轉換後的PDF檔案的儲存路徑
    pdf_path = output_folder / word_path.with_suffix('.pdf').name  # with_suffix()返回檔案字尾已更改的新路徑
    # 判斷pdf檔案路徑是否已存在
    if pdf_path.exists():
        continue
    else:
        # 路徑需要是絕對路徑,否則會報錯
        doc = word.Documents.Open(str(word_path), ReadOnly=1)  # 開啟Word檔案
        # 設定匯出格式為pdf
        doc.ExportAsFixedFormat(str(pdf_path), constants.wdExportFormatPDF)  # 將開啟的Word檔案另存為PDF檔案,儲存到給定的路徑
        doc.Close()  # 關閉Word檔案
word.Quit()  # 關閉Word程式視窗

測試檔案:

測試效果:

3. 在Word檔案中批次標記關鍵詞

import win32com.client as win32

# 路徑要使用絕對路徑
input_file = r'E:pythonProjectpython辦公自動化第5章 自動化處理Word檔案勞動合同.docx'
output_file = r'E:pythonProjectpython辦公自動化第5章 自動化處理Word檔案勞動合同1.docx'
word = win32.gencache.EnsureDispatch('Word.Application')  # 開啟一個Word程式視窗
word.Visible = False  # 設定視窗為隱藏狀態,即在後臺執行
cs = win32.constants  # 匯入Word開發介面提供的預設常數集合
doc = word.Documents.Open(input_file)  # 開啟要處理的Word檔案
# 設定要標記的關鍵詞列表
keyword_list = ['報酬', '保險', '培訓', '解除', '終止']
# 設定每個關鍵詞的突出顯示顏色
color_list = [cs.wdYellow, 14, cs.wdGreen, cs.wdRed, 13]
"""
值--顏色常數--含義:
1--wdBlack--黑色
2--wdBlue--藍色
3--wdTurquoise--青綠色
4--wdBrightGreen--鮮綠色
5--wdPink--粉紅色
6--wdRed--紅色
7--wdYellow--黃色
8--wdWhite--白色
9--wdDarkBlue--深藍色
10--wdTeal--青色
11--wdGreen--綠色
12--wdViolet--紫羅蘭色
13--wdDarkRed--深紅色
14--wdDarkYellow--深黃色
15--wdGray50--50%灰色
16--wdGray25--25%灰色
"""

for w, c in zip(keyword_list, color_list):  # 使用zip()函數將關鍵詞列表和標記顏色列表中的元素一一配對分別賦給w和c
    word.Options.DefaultHighlightColorIndex = c  # 設定突出顯示的顏色
    findObj = word.Selection.Find  # 建立Find物件
    findObj.ClearFormatting()  # 清除查詢文字的格式,表示查詢文字時不限制文字格式
    findObj.Text = w  # 設定查詢文字
    findObj.Replacement.ClearFormatting()  # 清除替換文字的格式設定
    findObj.Replacement.Text = w  # 將替換文字設定為與查詢文字相同的值
    findObj.Replacement.Font.Bold = True  # 設定替換文字的格式為加粗
    findObj.Replacement.Font.Italic = True  # 設定替換文字的格式為斜體
    findObj.Replacement.Font.Underline = cs.wdUnderlineDouble  # 設定替換文字加雙下劃線
    findObj.Replacement.Highlight = True  # 設定替換時對文字做突出顯示
    findObj.Execute(Replace=cs.wdReplaceAll)  # 執行查詢和替換,wdReplaceAll表示全部替換
# 將處理後的word檔案以新的檔名另存
doc.SaveAs(output_file)
# 關閉Word檔案
doc.Close()
# 關閉Word程式視窗
word.Quit()

測試效果:

4. 在Word檔案中批次替換關鍵詞

from pathlib import Path
import win32com.client as win32

# 建立Path物件
src_folder = Path(r'E:pythonProjectpython辦公自動化第5章 自動化處理Word檔案Files')
output_folder = Path(r'E:pythonProjectpython辦公自動化第5章 自動化處理Word檔案output_files')
# 判斷輸出資料夾是否存在
if not output_folder.exists():
    # 建立資料夾
    output_folder.mkdir(parents=True)
file_list = list(src_folder.glob('*.docx'))  # 獲得給定檔案的word檔案路徑列表
# 以替換前的關鍵詞作為建,以替換後的內容作為值,建立字典
replace_dict = {'確定': '確認', '訂立': '簽訂', '執行': '履行'}
word = win32.gencache.EnsureDispatch('Word.Application')  # 開啟Word程式視窗
word.Visible = False  # 設定視窗隱藏
cs = win32.constants  # 匯入Word開發介面提供的預設常數集合
for file in file_list:
    doc = word.Documents.Open(str(file))  # 開啟Word檔案
    print(file.name)
    for old_txt, new_txt in replace_dict.items():
        findObj = word.Selection.Find  # 建立Find物件
        findObj.ClearFormatting()  # 清除查詢文字的格式,表示查詢文字時不限制文字格式
        findObj.Text = old_txt  # 設定查詢文字
        findObj.Replacement.ClearFormatting()  # 清除替換文字的格式設定
        findObj.Replacement.Text = new_txt  # 設定替換文字
        # 判斷Find物件的Execute()函數在檔案中是否找到關鍵詞
        if findObj.Execute(Replace=cs.wdReplaceAll):  # 執行查詢和替換,wdReplaceAll表示全部替換
            print(f'{old_txt}-->{new_txt}')
    new_file = output_folder / file.name  # 生成輸出檔案的路徑
    doc.SaveAs(str(new_file))  # # 將處理後的word檔案以新的檔名另存
    doc.Close()  # 關閉Word檔案
word.Quit()  # 關閉Word程式視窗

測試效果:

以上就是Python實現自動化處理Word檔案的方法詳解的詳細內容,更多關於Python自動化處理Word的資料請關注it145.com其它相關文章!


IT145.com E-mail:sddin#qq.com