引言
在文檔處理中,我們經常需要將Word文檔中的內容轉換成其他格式,如Excel,以便更好地進行數據分析和報告。針對這一需求,我編寫了一個Python腳本,能夠批量處理指定目錄下的Word文檔,將其內容結構化并轉換為Excel文件。
功能概述
這個腳本的主要功能包括:
- 批量讀取Word文檔:自動檢索指定目錄下的所有Word文檔(.docx格式)。
- 內容抽取和組織:根據Word文檔中的標題層級(Heading),抽取和組織內容。
- 關鍵信息提取:自動從Word文檔的文件名中提取關鍵信息,作為Excel表格中的一級節點名稱。
- 結構化DataFrame創建:將抽取的信息轉化為DataFrame,包含一級至四級節點及其對應內容。
- Excel文件保存:將每個Word文檔轉換得到的DataFrame保存為同名的Excel文件,位于原始Word文檔所在的同一目錄。
使用方法
- 準備文檔:確保所有待處理的Word文檔位于同一目錄下,并且每個文檔中要有定義好的標題樣式(一級標題、二級標題等)。
- 指定目錄:修改腳本中的
batch_process_word_to_excel
函數中的directory
參數,指定Word文檔所在目錄。 - 運行腳本:執行腳本,等待處理完成。腳本將在指定目錄下生成對應的Excel文件,文件名與原Word文檔一致,但擴展名為’.xlsx’。
代碼解析
以下是腳本的完整代碼,包含了所需的庫和函數定義:
# -*- coding: utf-8 -*-
"""
此Python腳本旨在自動化處理目錄下所有的Word文檔(.docx),將其內容結構化并轉換為Excel文件(.xlsx)。主要功能:
1. 批量讀取指定目錄下的所有Word文檔。
2. 對每個Word文檔,根據文檔內的標題層級(Heading)結構,抽取和組織內容。
3. 自動從Word文檔的文件名中提取關鍵信息作為Excel表格中的一級節點名稱,特別關注“分冊”和“細則”之間的文本。
4. 將抽取的信息轉化為結構化的DataFrame,其中包含一級至四級節點及其對應內容。具體轉換規則如下:填充說明:1.word文件名為一級標題,作為Excel中的一級節點;2.word中的一級標題作為Excel中的二級節點,一級標題和當前一級標題下的第一個二級標題之間的正文內容作為Excel的二級內容;3.word中的二級標題作為Excel中的三級節點,二級標題和當前二級標題下的第一個三級標題之間的正文內容作為Excel的三級內容;4.word中的三級標題作為Excel中的四級節點,三級標題和當前三級標題下的第一個四級標題之間的正文內容作為Excel的四級內容;
5. 將每個Word文檔轉換得到的DataFrame保存為同名的Excel文件,位于原始Word文檔所在的同一目錄。使用方法:
- 確保所有待處理的Word文檔位于同一目錄下。并且,每個word中要有樣式:一級標題、二級標題、三級標題等
- 修改'batch_process_word_to_excel'函數中的'directory'參數,指定Word文檔所在目錄。
- 運行腳本,腳本將在指定目錄下生成對應的Excel文件,文件名與原Word文檔一致,但擴展名為'.xlsx'。依賴庫:
- os: 提供與操作系統交互的功能,如文件和目錄操作。
- docx: 用于讀取Word文檔的庫。
- pandas: 用于數據處理和分析的庫,創建DataFrame和保存Excel文件。注意事項:
- 代碼假設Word文檔中的標題層級不超過四級。
- 一級節點名稱的提取邏輯基于文件名中包含“分冊”和“細則”的特定格式。
- 如需處理不同層級或文件命名規則,需相應調整代碼邏輯。"""
import os
import docx
import pandas as pddef extract_title_from_filename(filename):# 分割文件名找到"分冊"和"細則"parts = filename.split('分冊')if len(parts) > 1:title_part = parts[1].split('細則')[0]return title_part.strip() # 去除前后空格else:return filename # 如果沒有找到"分冊"或"細則",返回原文件名def process_word_to_excel(file_path):doc = docx.Document(file_path)columns = ['一級節點', '二級節點', '二級內容', '三級節點', '三級內容', '四級節點', '四級內容']df = pd.DataFrame(columns=columns)# 獲取Word文檔的文件名,并從中提取一級節點名稱filename = os.path.basename(file_path)word_file_name = extract_title_from_filename(filename)current_level2 = ""current_level3 = ""current_level4 = ""current_content = ""last_level = 0for paragraph in doc.paragraphs:if paragraph.style.name.startswith('Heading'):heading_level = int(paragraph.style.name[-1])if heading_level <= last_level:if current_level4:new_row = pd.DataFrame({'一級節點': [word_file_name],'二級節點': [current_level2],'三級節點': [current_level3],'四級節點': [current_level4],'四級內容': [current_content]})elif current_level3:new_row = pd.DataFrame({'一級節點': [word_file_name],'二級節點': [current_level2],'三級節點': [current_level3],'三級內容': [current_content]})elif current_level2:new_row = pd.DataFrame({'一級節點': [word_file_name],'二級節點': [current_level2],'二級內容': [current_content]})df = pd.concat([df, new_row], ignore_index=True)current_content = ""if heading_level == 1:current_level2 = paragraph.textcurrent_level3 = ""current_level4 = ""last_level = 1elif heading_level == 2:current_level3 = paragraph.textcurrent_level4 = ""last_level = 2elif heading_level == 3:current_level4 = paragraph.textlast_level = 3else:current_content += paragraph.text + '\n'if current_content:if current_level4:new_row = pd.DataFrame({'一級節點': [word_file_name],'二級節點': [current_level2],'三級節點': [current_level3],'四級節點': [current_level4],'四級內容': [current_content]})elif current_level3:new_row = pd.DataFrame({'一級節點': [word_file_name],'二級節點': [current_level2],'三級節點': [current_level3],'三級內容': [current_content]})elif current_level2:new_row = pd.DataFrame({'一級節點': [word_file_name],'二級節點': [current_level2],'二級內容': [current_content]})df = pd.concat([df, new_row], ignore_index=True)return dfdef batch_process_word_to_excel(directory):for filename in os.listdir(directory):if filename.endswith('.docx'):file_path = os.path.join(directory, filename)df = process_word_to_excel(file_path)excel_filename = os.path.splitext(filename)[0] + '.xlsx'excel_path = os.path.join(directory, excel_filename)df.to_excel(excel_path, index=False)print(f'Processed {filename} to {excel_filename}')# 調用函數,指定目錄
batch_process_word_to_excel('D:\\test')