Python如何提取Word文檔中的表格并導出為Excel
在日常辦公或數(shù)據(jù)處理任務(wù)中,我們經(jīng)常需要將 Word 文檔里分散的表格匯總到 Excel 中進行計算或分析。面對幾十頁甚至上百頁的文檔,手動復制+粘貼不僅效率低下,且極易出現(xiàn)單元格錯位、格式丟失等問題。本文將帶你探索如何利用 Python 實現(xiàn)數(shù)據(jù)從 Word 到 Excel 的自動化遷移。
為什么選擇自動化方案?常見技術(shù)方案對比
在處理 Word 表格導出任務(wù)時,開發(fā)者有多種選擇,比如手動復制、使用 VBA 等等。我們需要根據(jù)業(yè)務(wù)場景、開發(fā)成本以及處理效果來找到最適合的:
- 手動復制粘貼:適用于處理極少量的單一表格。缺點在于無法保持長文本的段落格式,且在處理含有合并單元格的復雜表格時,數(shù)據(jù)容易發(fā)生偏移。
- VBA (Visual Basic for Applications):Office 自帶的腳本語言,可以快速將 Word 中的表格導出。雖然無需安裝第三方庫,但其語法陳舊、調(diào)試困難,且高度依賴 Microsoft Office 環(huán)境,無法在沒有安裝 Office 的服務(wù)器或 Linux 環(huán)境上運行,具有一定的設(shè)備局限性。
- 開源 Python 庫(如 python-docx):這類工具靈活性高,但在處理復雜格式(如嵌套表格、復雜的行列跨度映射)時,往往需要編寫大量底層邏輯代碼,開發(fā)成本較高,需要具備一定的編程知識。
- 專業(yè)類庫(Spire 系列組件):功能強大、API 簡單易懂。它最大的優(yōu)勢在于獨立性(無需安裝 Office)和高集成度。它將復雜的 Word DOM 結(jié)構(gòu)映射與 Excel 坐標系轉(zhuǎn)換進行了底層封裝,開發(fā)者只需通過簡單的 API 調(diào)用,就可以精準保留原文檔的邏輯結(jié)構(gòu)和文本格式。
方案對比表:
| 維度 | 手動操作 | VBA 宏 | 開源 Python 庫 | Spire 系列專業(yè)組件 |
|---|---|---|---|---|
| 執(zhí)行效率 | 極低 | 中 | 高 | 極高 |
| 環(huán)境依賴 | 需人工參與 | 需安裝 Office | 需配置多種依賴 | 獨立運行(零依賴) |
| 合并單元格支持 | 差(易亂序) | 較好 | 一般(需自行實現(xiàn)邏輯) | 完美支持 |
| 復雜場景適配 | 難 | 較難 | 難 | 易(API 高級封裝) |
綜合來看,對于追求高效率和系統(tǒng)穩(wěn)定性的企業(yè)級開發(fā),使用 Spire.Doc for Python 配合 Spire.XLS for Python 是當前最優(yōu)的實戰(zhàn)選型。
環(huán)境準備
在開始編寫腳本之前,請確保你的 Python 環(huán)境中已安裝相關(guān)組件。這兩個庫分別負責解析 Word 的流式文檔結(jié)構(gòu)和構(gòu)建 Excel 的行列坐標體系:
pip install Spire.Doc pip install Spire.XLS
你可以分別安裝 Word 和 Excel 組件,也可以直接安裝 Spire.Office for Python,它包含了 Spire.Doc for Python,Spire.XLS for Python,Spire.Presentation for Python 和 Spire.PDF for Python。此外所有組件都提供免費版用于小項目或測試。
如何構(gòu)建 Python 導出表格的代碼
為了讓你更清晰地理解 Spire.Doc 和 Spire.XLS 導出 Word 表格的邏輯,我們將整個實現(xiàn)過程拆解為以下核心步驟:
1. 引入必要的類庫
首先,我們需要在腳本開頭引入 Spire 的核心模塊。通過引入 spire.doc 和 spire.xls 及其通用常量模塊,我們才能在 Python 中調(diào)用其封裝好的文檔處理引擎,從而實現(xiàn)對 Word DOM 樹的解析和 Excel 工作簿的構(gòu)建。
from spire.doc import * from spire.doc.common import * from spire.xls import * from spire.xls.common import * import os
2. 初始化對象與加載源文件
分別創(chuàng)建 Document 和 Workbook 對象。隨后,使用 LoadFromFile 方法加載待處理的源 Word 文檔,并調(diào)用 Worksheets.Clear() 移除工作簿中默認生成的空白表,以確保輸出結(jié)果不受默認工作表的干擾。
# 創(chuàng)建 Word 文檔對象并加載文件
document = Document()
document.LoadFromFile("E:/input/項目進度.docx")
# 創(chuàng)建 Excel 工作簿并清空默認工作表
workbook = Workbook()
workbook.Worksheets.Clear()
3. 遍歷 Word 文檔多層級結(jié)構(gòu)
Word 的數(shù)據(jù)存儲具有明顯的層級性(Section > Table > Row > Cell)。我們需要使用嵌套循環(huán)依次遍歷文檔中的 Section (節(jié)) 和 Table (表格)。對于每一個發(fā)現(xiàn)的表格,我們通過 workbook.Worksheets.Add() 動態(tài)創(chuàng)建一個工作表,并通過 sheet_index 實現(xiàn)自動命名,確保一表一頁。
sheet_index = 0
for s in range(document.Sections.Count):
section = document.Sections.get_Item(s)
tables = section.Tables
for t in range(tables.Count):
table = tables.get_Item(t)
# 動態(tài)創(chuàng)建工作表并遞增索引
sheet = workbook.Worksheets.Add(f"Table_{sheet_index + 1}")
# ... (后續(xù)數(shù)據(jù)提取)
sheet_index += 1
4. 提取單元格文本與格式映射
由于 Word 單元格內(nèi)可能包含多個段落,所以我們需要遍歷 Paragraphs 集合并手動拼接換行符 \n,以保留文本的原始換行結(jié)構(gòu)。最后,通過 Style.WrapText = True 開啟 Excel 的自動換行功能。
# 遍歷行與列
for r in range(table.Rows.Count):
row = table.Rows.get_Item(r)
for c in range(row.Cells.Count):
cell = row.Cells.get_Item(c)
cell_text = ""
for p in range(cell.Paragraphs.Count):
paragraph = cell.Paragraphs.get_Item(p)
cell_text += paragraph.Text.strip() + "\n"
# 寫入 Excel 坐標并設(shè)置換行
sheet.Range[r + 1, c + 1].Text = cell_text.strip()
sheet.Range[r + 1, c + 1].Style.WrapText = True
5. 自動化布局優(yōu)化與資源釋放
數(shù)據(jù)填充完成后,利用 AutoFitColumns() 和 AutoFitRows() 方法讓程序自動根據(jù)內(nèi)容調(diào)整列寬和行高。最后釋放內(nèi)存,確保系統(tǒng)資源回收。
完整代碼示例
將上述的步驟整合,即可得到這個高效的 Word 表格導出腳本:
from spire.doc import *
from spire.doc.common import *
from spire.xls import *
from spire.xls.common import *
import os
# 創(chuàng)建 Word 文檔對象并加載文件
document = Document()
document.LoadFromFile("/input/項目進度.docx")
# 創(chuàng)建 Excel 工作簿并刪除默認工作表
workbook = Workbook()
workbook.Worksheets.Clear()
# 遍歷 Word 文檔中的所有節(jié)
sheet_index = 0
for s in range(document.Sections.Count):
section = document.Sections.get_Item(s)
# 獲取當前節(jié)中的所有表格
tables = section.Tables
for t in range(tables.Count):
# 獲取當前表格
table = tables.get_Item(t)
# 新建工作表
sheet = workbook.Worksheets.Add(f"Table_{sheet_index + 1}")
# 遍歷表格行
for r in range(table.Rows.Count):
row = table.Rows.get_Item(r)
# 遍歷單元格
for c in range(row.Cells.Count):
cell = row.Cells.get_Item(c)
# 提取單元格中的文本
cell_text = ""
for p in range(cell.Paragraphs.Count):
paragraph = cell.Paragraphs.get_Item(p)
cell_text += paragraph.Text.strip() + "\n"
# 去除末尾換行
cell_text = cell_text.strip()
# 寫入 Excel 單元格
sheet.Range[r + 1, c + 1].Text = cell_text
# 設(shè)置自動換行
sheet.Range[r + 1, c + 1].Style.WrapText = True
# 自動調(diào)整列寬行高
sheet.AllocatedRange.AutoFitColumns()
sheet.AllocatedRange.AutoFitRows()
sheet_index += 1
# 保存為 Excel 文件
workbook.SaveToFile("/output/word表格.xlsx", ExcelVersion.Version2016)
document.Close()
workbook.Dispose()
下面是原始 Word 文檔與提取到的表格的對比示意圖:

結(jié)語
通過 Python 結(jié)合 Spire.Doc 與 Spire.XLS 庫,我們僅需幾十行代碼就能解決復雜的文檔數(shù)據(jù)提取難題。這種方案不僅保留了原始數(shù)據(jù)的段落結(jié)構(gòu),還通過自動化布局極大提升了結(jié)果文件的可用性。如果你正在處理大批量的文檔自動化工作,不妨嘗試這種更專業(yè)、更穩(wěn)健的開發(fā)路徑。
到此這篇關(guān)于Python如何提取Word文檔中的表格并導出為Excel的文章就介紹到這了,更多相關(guān)Python提取Word表格并導出內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
在python中獲取div的文本內(nèi)容并和想定結(jié)果進行對比詳解
今天小編就為大家分享一篇在python中獲取div的文本內(nèi)容并和想定結(jié)果進行對比詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-01-01
Pandas數(shù)據(jù)填充的具體實現(xiàn)
在數(shù)據(jù)分析與預處理過程中,臟數(shù)據(jù)幾乎不可避免,本文主要介紹了Pandas數(shù)據(jù)填充的具體實現(xiàn),也稱為缺失值處理,使數(shù)據(jù)清洗工作更加高效,感興趣的可以了解一下2024-07-07
pandas中fillna()函數(shù)填充NaN和None的實現(xiàn)
本文主要介紹了pandas中fillna()函數(shù)填充NaN和None的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-01-01

