Python自動化將Excel表格插入Word文檔的三種實用方案
在處理企業(yè)日常辦公、財務(wù)審計或數(shù)據(jù)報表時,國內(nèi)開發(fā)者經(jīng)常遇到需要將 Excel 中的數(shù)據(jù)或排版好的表格同步到 Word 報告中的情況。如果單純依靠人工復(fù)制粘貼,不僅效率低下,還極易出錯。
本文將分享如何使用 Spire.Doc for Python 和 Spire.XLS for Python 組件,通過代碼高效地將 Excel 表格集成到 Word 文檔中。我們將介紹數(shù)據(jù)流構(gòu)建、帶格式復(fù)制以及 OLE 對象嵌入三種不同的實現(xiàn)方案,并對比它們的具體應(yīng)用場景,幫助大家快速解決實際業(yè)務(wù)中的文檔合并問題。
三種實現(xiàn)方案的對比
了解不同方案差異是處理文檔自動化的第一步。下面我們通過一組對比,來看看三種方案的主要特點。
| 插入方式 | 底層實現(xiàn)原理 | 方案優(yōu)勢 | 性能與局限 | 常見應(yīng)用場景 |
|---|---|---|---|---|
| 數(shù)據(jù)流動態(tài)構(gòu)建 | 解析 Excel 單元格數(shù)據(jù),在 Word 中動態(tài)重建表格。 | 格式完全可控,生成的 Word 文件體積最小。 | 無法保留 Excel 原生的公式、圖表和底色。 | 自動化周報生成、后臺數(shù)據(jù)純文本導(dǎo)出。 |
| 帶格式復(fù)制 | 提取 Excel 的字體、邊框、背景色等樣式并渲染至 Word。 | 視覺還原度高,能保留 Excel 原本的排版色彩。 | 樣式解析較重,大批量處理時會占用較大內(nèi)存。 | 財務(wù)資產(chǎn)負債表、需要嚴格保留顏色的技術(shù)看板。 |
| 作為 OLE 對象內(nèi)嵌 | 將整個 Excel 文件作為二進制流直接內(nèi)嵌到 Word 中。 | 保持文件原樣,雙擊可喚起 Excel 進行二次編輯。 | 文件體積會明顯增大,非 Windows 環(huán)境支持有限。 | 技術(shù)文檔附件內(nèi)嵌、需要交付給業(yè)務(wù)微調(diào)的文檔。 |
環(huán)境準(zhǔn)備與組件安裝
在正式進入代碼實戰(zhàn)之前,我們需要在 Python 環(huán)境中部署相關(guān)的庫。本文核心依賴 Spire.Doc for Python 和 Spire.XLS for Python 兩個組件,它們分別負責(zé) Word 文檔的結(jié)構(gòu)解析與 Excel 數(shù)據(jù)的讀取。
這兩個組件具備完全的獨立性,純 Python 環(huán)境即可流暢運行,無需額外安裝 Microsoft Office。
我們可以通過標(biāo)準(zhǔn)的 pip 工具進行安裝,在終端或命令行中執(zhí)行以下命令即可:
# 安裝 Excel 處理組件 pip install Spire.XLS # 安裝 Word 處理組件 pip install Spire.Doc
安裝完成后,無需任何額外的環(huán)境變量配置,即可在腳本中直接通過 import 引入對應(yīng)的命名空間。
如果需要處理其它格式的文件,還可以直接使用 Spire.Office,除以上以上兩個組件外,它還包含 Spire.PDF、Spire.Presentation 和 Spire.Barcode 等。
提取 Excel 數(shù)據(jù)并在 Word 中重建表格
在不需要保留 Excel 復(fù)雜的底色或邊框,只需要將數(shù)據(jù)抽離出來并轉(zhuǎn)化為 Word 標(biāo)準(zhǔn)表格時,基于數(shù)據(jù)流的動態(tài)構(gòu)建是最實用的方法。用這種方法導(dǎo)入 Excel 表格數(shù)據(jù)到 Word 文檔,可以最大化減小對 Word 文檔體積大小的影響。
我們首先通過 Excel 組件讀取表格數(shù)據(jù),接著在 Word 中創(chuàng)建一個同等行列規(guī)模的空白表格,最后通過循環(huán)完成數(shù)據(jù)的對齊與填充。
具體實現(xiàn)代碼如下:
from spire.doc import Document, AutoFitBehaviorType, FileFormat, DefaultTableStyle
from spire.xls import Workbook
# 指定輸入與輸出的文件路徑
excel_file = "/示例文檔.xlsx"
word_file = "/ExcelDataToWord.docx"
# 創(chuàng)建 Workbook 實例并加載 Excel 文件
workbook = Workbook()
workbook.LoadFromFile(excel_file)
# 獲取第一個工作表以及已使用的單元格范圍
sheet = workbook.Worksheets.get_Item(0)
allocatedRange = sheet.AllocatedRange
# 創(chuàng)建 Document 實例用于生成 Word 文檔
doc = Document()
section = doc.AddSection()
table = section.AddTable()
# 根據(jù) Excel 的實際行數(shù)與列數(shù),重置 Word 表格的行列結(jié)構(gòu)
table.ResetCells(allocatedRange.RowCount, allocatedRange.ColumnCount)
# 遍歷已使用范圍的每一行和每一列進行數(shù)據(jù)填充
for rowIndex in range(allocatedRange.RowCount):
for colIndex in range(allocatedRange.ColumnCount):
# 定位 Word 目標(biāo)單元格并添加段落
cell = table.Rows.get_Item(rowIndex).Cells.get_Item(colIndex)
paragraph = cell.AddParagraph()
# 提取 Excel 單元格的格式化文本并追加至 Word
textRange = paragraph.AppendText(allocatedRange.get_Item(rowIndex + 1, colIndex + 1).NumberText)
textRange.CharacterFormat.FontName = "HarmonyOS Sans SC"
# 自動調(diào)整表格寬度以適應(yīng)窗口,并應(yīng)用內(nèi)置表格樣式
table.AutoFit(AutoFitBehaviorType.AutoFitToWindow)
table.ApplyStyle(DefaultTableStyle.GridTable1LightAccent6)
# 保存修改后的結(jié)果文檔并釋放資源
doc.SaveToFile(word_file, FileFormat.Docx2019)
doc.Dispose()
workbook.Dispose()

核心代碼解析
- 通過
sheet.AllocatedRange屬性自動識別 Excel 中所有包含數(shù)據(jù)的有效單元格范圍。 - 使用
table.ResetCells()方法重置 Word 表格的行數(shù)列數(shù),使其與 Excel 數(shù)據(jù)一致。 - 調(diào)用
.NumberText屬性確保讀取到的是經(jīng)過 Excel 格式化渲染后的最終文本(如千分位、百分比符號等)。 - 使用
table.AutoFit(AutoFitBehaviorType.AutoFitToWindow)自動調(diào)整列寬,確保表格在 Word 頁面內(nèi)能夠自適應(yīng)鋪滿,防止因列數(shù)過多影響展示效果。
將 Excel 表格帶格式復(fù)制到 Word 文檔中
如果是財務(wù)報表、審計報告或者帶有復(fù)雜合并單元格的工作表,單純將單元格的值填寫到 Word 表格中缺點明顯。這類場景通常要求我們還要將單元格的背景色、字號、加粗狀態(tài)以及對齊方式悉數(shù)同步到 Word 中,以保證視覺的一致性。
為了防止 Word 出現(xiàn)因行列不對齊導(dǎo)致的表格錯位,我們需要編寫輔助函數(shù)分別處理 Excel 復(fù)雜的合并單元格關(guān)系,并逐個復(fù)制字體與底色樣式。
代碼實現(xiàn)如下:
from spire.xls import Workbook, HorizontalAlignType, ExcelPatternType, VerticalAlignType
from spire.doc import Document, Color, HorizontalAlignment, VerticalAlignment, PageOrientation, FileFormat
def MergeCells(worksheet, wordTable):
# 檢查 Excel 中是否存在合并單元格
if not worksheet.HasMergedCells:
return
for cell_range in worksheet.MergedCells:
start_row, start_col = cell_range.Row, cell_range.Column
row_count, col_count = cell_range.RowCount, cell_range.ColumnCount
# 處理水平合并
if col_count > 1:
for row in range(start_row, start_row + row_count):
wordTable.ApplyHorizontalMerge(row - 1, start_col - 1, start_col - 1 + col_count - 1)
# 處理垂直合并
if row_count > 1:
wordTable.ApplyVerticalMerge(start_col - 1, start_row - 1, start_row - 1 + row_count - 1)
def CopyFormatting(tableTextRange, excelCell, wordCell):
# 復(fù)制字體樣式及顏色
font = excelCell.Style.Font
tableTextRange.CharacterFormat.TextColor = Color.FromRgb(font.Color.R, font.Color.G, font.Color.B)
tableTextRange.CharacterFormat.FontSize = float(font.Size)
tableTextRange.CharacterFormat.FontName = font.FontName
tableTextRange.CharacterFormat.Bold = font.IsBold
tableTextRange.CharacterFormat.Italic = font.IsItalic
# 復(fù)制背景顏色
if excelCell.Style.FillPattern != ExcelPatternType.none:
wordCell.CellFormat.BackColor = Color.FromRgb(excelCell.Style.Color.R, excelCell.Style.Color.G, excelCell.Style.Color.B)
# 映射并復(fù)制水平對齊方式
hAlignMap = {
HorizontalAlignType.Left: HorizontalAlignment.Left,
HorizontalAlignType.Center: HorizontalAlignment.Center,
HorizontalAlignType.Right: HorizontalAlignment.Right
}
if excelCell.HorizontalAlignment in hAlignMap:
tableTextRange.OwnerParagraph.Format.HorizontalAlignment = hAlignMap[excelCell.HorizontalAlignment]
# 映射并復(fù)制垂直對齊方式
vAlignMap = {
VerticalAlignType.Top: VerticalAlignment.Top,
VerticalAlignType.Center: VerticalAlignment.Middle,
VerticalAlignType.Bottom: VerticalAlignment.Bottom
}
if excelCell.VerticalAlignment in vAlignMap:
wordCell.CellFormat.VerticalAlignment = vAlignMap[excelCell.VerticalAlignment]
# 指定輸入與輸出文件名
excelFileName = "/示例文檔.xlsx"
wordFileName = "/ExcelDataFormatToWord.docx"
workbook = Workbook()
workbook.LoadFromFile(excelFileName)
sheet = workbook.Worksheets.get_Item(0)
doc = Document()
section = doc.AddSection()
section.PageSetup.Orientation = PageOrientation.Landscape # 寬表格推薦使用橫向排版
table = section.AddTable()
table.ResetCells(sheet.LastRow, sheet.LastColumn)
# 在填充數(shù)據(jù)前,先執(zhí)行單元格合并處理
MergeCells(sheet, table)
# 循環(huán)填充數(shù)據(jù)并復(fù)制格式
for r in range(1, sheet.LastRow + 1):
tableRow = table.Rows.get_Item(r - 1)
tableRow.Height = float(sheet.Rows.get_Item(r - 1).RowHeight) # 同步原表格行高
for c in range(1, sheet.LastColumn + 1):
eCell = sheet.Range.get_Item(r, c)
wCell = table.Rows.get_Item(r - 1).Cells.get_Item(c - 1)
textRange = wCell.AddParagraph().AppendText(eCell.NumberText)
CopyFormatting(textRange, eCell, wCell)
doc.SaveToFile(wordFileName, FileFormat.Docx2019)
doc.Dispose()
workbook.Dispose()

核心代碼解析
- 自定義函數(shù)
MergeCells通過提取 Excel 的MergedCells集合,分別調(diào)用 Word 表格的ApplyHorizontalMerge和ApplyVerticalMerge接口,以避免復(fù)雜網(wǎng)格在跨組件轉(zhuǎn)換時發(fā)生結(jié)構(gòu)崩潰。 - 使用
Color.FromRgb()提取底層顏色值并重新組裝,實現(xiàn)背景色與字體的跨文件同步。 - 在復(fù)制背景色前增加
ExcelPatternType.none條件攔截,防止沒有設(shè)置底色的標(biāo)準(zhǔn)單元格在轉(zhuǎn)換后被系統(tǒng)誤填涂為純黑色。 - 自定義函數(shù)
CopyFormatting是關(guān)鍵步驟。它通過逐一讀取 Excel 單元格的 Font 和 Style 屬性,并賦值給 Word 的字符格式與單元格格式,使表格在視覺上與 Excel 工作表保持一致。
將 Excel 表格作為 OLE 對象內(nèi)嵌到 Word 中
在一些特殊的工作中,用戶不僅希望在 Word 中看到 Excel 報表的外觀,還希望在有需要時可以直接通過點擊表格,在 Word 內(nèi)部喚起完整的 Excel 來修改公式或查看底層的圖表。這種文檔融合的需求,可以通過 OLE 技術(shù)來實現(xiàn)。
由于 OLE 對象在靜態(tài)未激活狀態(tài)下需要一張快照來做外觀占位,我們會先利用 Excel 模塊將表格渲染為一張圖片,隨后將該圖片作為封面,連同 Excel 的二進制文件一起嵌入到 Word 中。
具體實現(xiàn)代碼如下:
from spire.doc import Document, DocPicture, FileFormat, OleObjectType from spire.xls import Workbook # 指定路徑與文件名 excelFileName = "示例文檔.xlsx" wordFileName = "/ExcelOleToWord.docx" tempImageName = "SheetImage.png" # 創(chuàng)建 Workbook 實例并在后臺將工作表轉(zhuǎn)換為圖片 workbook = Workbook() workbook.LoadFromFile(excelFileName) sheet = workbook.Worksheets.get_Item(0) sheet.ToImage(1, 1, sheet.LastRow, sheet.LastColumn).Save(tempImageName) # 創(chuàng)建 Document 實例并構(gòu)建 Word 主體框架 doc = Document() section = doc.AddSection() paragraph = section.AddParagraph() # 加載生成的圖片作為 OLE 對象的顯示封面 pic = DocPicture(doc) pic.LoadImage(tempImageName) # 調(diào)整圖片寬度使其自適應(yīng) Word 頁面的正文區(qū)域?qū)挾? pic.Width = section.PageSetup.PageSize.Width - section.PageSetup.Margins.Left - section.PageSetup.Margins.Right # 將 Excel 文件作為 OLE 對象插入到 Word 段落中,并綁定封面圖 ole = paragraph.AppendOleObject(excelFileName, pic, OleObjectType.ExcelWorksheet) ole.DisplayAsIcon = False # 設(shè)置為不以冰冷的圖標(biāo)顯示,而是直接展示表格圖像 # 保存修改后的結(jié)果文檔并釋放資源 doc.SaveToFile(wordFileName, FileFormat.Docx2019) workbook.Dispose() doc.Dispose()

核心代碼解析
- 調(diào)用
sheet.ToImage()方法將指定的表格區(qū)域轉(zhuǎn)換為快照圖片。 - 采用了
PageSize.Width - Margins.Left - Margins.Right自適應(yīng)縮放,使插入的 Excel 快照能夠橫向鋪滿正文。 - 通過
paragraph.AppendOleObject()將 Excel 文件以 OLE 對象的形式插入到 Word 的段落對象中。 - 將
ole.DisplayAsIcon設(shè)置為False,以保證 OLE 對象在編輯后動態(tài)更新。
總結(jié)
今天的指南主要介紹了將 Excel 表格嵌入到 Word 文檔的三種方法,使用簡潔的表格對三種方法進行對比,還給出了三種方案的 Python 代碼實現(xiàn)示例。你可以根據(jù)不同的需求選擇適合的方法,輕松讓表格為 Word 文本提供數(shù)據(jù)支撐!
到此這篇關(guān)于Python自動化將Excel表格插入Word文檔的三種實用方案的文章就介紹到這了,更多相關(guān)Python Excel表格插入Word內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Python如何提取Word文檔中的表格并導(dǎo)出為Excel
- Python多場景下實現(xiàn)Word轉(zhuǎn)Excel詳解
- Python調(diào)用Tika實現(xiàn)一站式提取PDF/Word/Excel
- Python自動化辦公之從Excel/Word處理到瀏覽器操控的全面指南
- Python實現(xiàn)將Word、Excel、PDF轉(zhuǎn)換為Markdown格式
- Python操作Office(Word/Excel/PowerPoint)文檔的功能庫使用詳解
- Python文件解析之Excel/Word/PDF的解析、處理、預(yù)覽與下載
- Python高效轉(zhuǎn)換Word表格為Excel的方案全解析
相關(guān)文章
python備份文件以及mysql數(shù)據(jù)庫的腳本代碼
最近正在學(xué)習(xí)python,看了幾天了,,所以寫個小腳本練習(xí)練習(xí),沒什么含金量,只當(dāng)練手2013-06-06
Python pip安裝依賴redis被自動降級的問題及解決
安裝Redis 7.1.0時因版本過舊與Python3.10不兼容,通過pip安裝依賴時遵循“版本約束”,導(dǎo)致Redis降級到<3.0,Booktype 項目依賴Redis <3.0,與Python3.10不兼容,解決方法是刪除Booktype依賴,以避免版本沖突2025-12-12
python利用paramiko連接遠程服務(wù)器執(zhí)行命令的方法
下面小編就為大家?guī)硪黄猵ython利用paramiko連接遠程服務(wù)器執(zhí)行命令的方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-10-10
Blender Python編程創(chuàng)建發(fā)光材質(zhì)示例詳解
這篇文章主要為大家介紹了Blender Python編程創(chuàng)建發(fā)光材質(zhì)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-08-08

