在日常辦公場景中,通過Python腳本自動化整合Excel數據與Word文檔,能夠實現表格的智能遷移,滿足不同場景下數據呈現的專業性要求。直接提取表格內容插入Word適用於需要快速傳遞核心數據的場景,確保信息精準直達;完整複製表格樣式及格式則能保留原數據可視化效果,匹配正式報告對排版美觀的嚴苛標準;而將表格作為OLE對象嵌入則兼顧了文檔的動態更新能力,當源數據發生變更時,用户可通過雙擊對象直接調取Excel進行編輯,這種交互式設計特別適用於需要長期維護的協作文件。
本文將介紹如何使用Python通過以上三種方式將Excel表格插入到Word文檔中。
- 提取Excel工作表數據插入Word文檔
- 複製Excel工作表數據及格式插入Word文檔
- 將Excel工作表作為OLE對象嵌入Word文檔
本文所使用的Word文檔操作方法需要用到Free Spire.Doc for Python(PyPI:pip install spire.doc.free),讀取Excel工作表數據需要用到Free Spire.XLS for Python(PyPI:pip install spire.xls.free)。
提取Excel工作表數據插入Word文檔
我們可以通過直接讀取Excel工作表數據,然後在Word文檔中創建表格並插入讀取的數據,來實現Excel表格到Word文檔的插入。
以下是操作步驟:
-
加載 Excel 文件
- 創建
Workbook實例並使用LoadFromFile()讀取 Excel 文件。 - 通過
Worksheets.get_Item(0)獲取第一個工作表。 - 使用
AllocatedRange獲取已使用的單元格範圍。
- 創建
-
創建 Word 文檔並添加表格
- 創建
Document實例,並使用AddSection()添加節。 - 使用
AddTable()添加表格。
- 創建
-
複製 Excel 的表頭到 Word
- 使用
AddRow()添加表頭行。 - 通過
AddCell().AddParagraph().AppendText()填充表頭文本。
- 使用
-
複製 Excel 的數據行到 Word
- 遍歷 Excel 的數據行,使用
AddRow()添加數據行。 - 通過
Cells.get_Item(col).AddParagraph().AppendText()填充單元格內容。 - 如果單元格包含公式,則使用
FormulaValue,否則使用Value。
- 遍歷 Excel 的數據行,使用
-
調整表格樣式並保存 Word 文檔
- 使用
AutoFit(AutoFitBehaviorType.AutoFitToWindow)讓表格適應窗口。 - 使用
ApplyStyle(DefaultTableStyle.GridTable1LightAccent6)設置表格樣式。 - 使用
SaveToFile(path, FileFormat.Docx2019)保存 Word 文檔。
- 使用
代碼示例:
from spire.doc import Document, AutoFitBehaviorType, FileFormat, DefaultTableStyle
from spire.xls import Workbook
# 指定Excel文件路徑與輸出Word文檔路徑
excel_file = "Sample.xlsx"
word_file = "output/ExcelDataToWord.docx"
# 讀取 Excel
with Workbook() as workbook:
workbook.LoadFromFile(excel_file)
worksheet = workbook.Worksheets.get_Item(0)
allocated_range = worksheet.AllocatedRange
# 創建 Word 文檔
with Document() as doc:
section = doc.AddSection()
table = section.AddTable()
# 添加表頭行
header_row = table.AddRow()
for col in range(allocated_range.ColumnCount):
cell = header_row.AddCell()
paragraph = cell.AddParagraph()
paragraph.AppendText(allocated_range.get_Item(1, col + 1).Text)
# 添加數據行
for row in range(1, allocated_range.RowCount):
data_row = table.AddRow()
for col in range(allocated_range.ColumnCount):
cell = data_row.Cells.get_Item(col)
paragraph = cell.AddParagraph()
cell_value = allocated_range.get_Item(row + 1, col + 1)
text = cell_value.FormulaValue if cell_value.HasFormula else cell_value.Value
paragraph.AppendText(text)
# 自動調整表格並應用樣式
table.AutoFit(AutoFitBehaviorType.AutoFitToWindow)
table.ApplyStyle(DefaultTableStyle.GridTable1LightAccent6)
# 保存 Word 文檔
doc.SaveToFile(word_file, FileFormat.Docx2019)
結果
複製Excel工作表數據及格式插入Word文檔
我們也可以使用庫中提供的類、屬性和方法來複制Excel數據到Word文檔的同時,將單元格格式及文本格式一起復制到Word文檔中,從而實現高還原度地插入Excel表格到Word文檔。我們需要使用庫中提供的組件來新建方法實現上述操作。
以下是操作步驟:
-
加載 Excel 文件
- 創建
Workbook實例,並使用LoadFromFile()讀取 Excel 文件。 - 獲取第一個工作表
sheet。
- 創建
-
創建 Word 文檔並設置頁面方向
- 創建
Document實例,使用AddSection()添加節。 - 設置頁面方向為橫向:
section.PageSetup.Orientation = PageOrientation.Landscape。
- 創建
-
創建 Word 表格
- 使用
AddTable(True)創建表格。 - 通過
ResetCells(sheet.LastRow, sheet.LastColumn)設置表格的行數和列數。
- 使用
-
執行合併單元格操作
- 使用
merge_cells(sheet, table)方法,遍歷 Excel 中的合併單元格,並在 Word 中執行相應的合併操作。
- 使用
-
複製 Excel 數據和樣式到 Word 表格
- 遍歷 Excel 表格的每一行和每一列,設置每行的高度:
table.Rows[r - 1].Height = float(sheet.Rows[r - 1].RowHeight)。 - 獲取每個單元格的數據和樣式,使用
AddParagraph().AppendText()方法將數據複製到 Word 表格中。 - 調用
copy_style(text_range, x_cell, w_cell)方法,複製 Excel 單元格的樣式到 Word 單元格。
- 遍歷 Excel 表格的每一行和每一列,設置每行的高度:
-
保存 Word 文檔
- 使用
SaveToFile("output/CopyExcelDataStyleToWord.docx", FileFormat.Docx2019)保存 Word 文件。
- 使用
-
釋放資源
- 調用
doc.Dispose()和workbook.Dispose()釋放資源。
- 調用
代碼示例
from spire.xls import *
from spire.doc import *
def merge_cells(sheet, table):
"""根據 Excel 中的合併單元格信息,在 Word 表格中執行相應的合併操作。"""
if not sheet.HasMergedCells:
return
for cell_range in sheet.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):
table.ApplyHorizontalMerge(row - 1, start_col - 1, start_col - 1 + col_count - 1)
# 處理垂直合併
if row_count > 1:
table.ApplyVerticalMerge(start_col - 1, start_row - 1, start_row - 1 + row_count - 1)
def copy_style(text_range, excel_cell, word_cell):
"""將 Excel 單元格的樣式複製到 Word 單元格。"""
font = excel_cell.Style.Font
text_range.CharacterFormat.TextColor = Color.FromRgb(font.Color.R, font.Color.G, font.Color.B)
text_range.CharacterFormat.FontSize = float(font.Size)
text_range.CharacterFormat.FontName = font.FontName
text_range.CharacterFormat.Bold = font.IsBold
text_range.CharacterFormat.Italic = font.IsItalic
# 設置單元格背景色
if excel_cell.Style.FillPattern != ExcelPatternType.none:
word_cell.CellFormat.BackColor = Color.FromRgb(excel_cell.Style.Color.R, excel_cell.Style.Color.G,
excel_cell.Style.Color.B)
# 設置水平對齊方式
align_map = {
HorizontalAlignType.Left: HorizontalAlignment.Left,
HorizontalAlignType.Center: HorizontalAlignment.Center,
HorizontalAlignType.Right: HorizontalAlignment.Right
}
if excel_cell.HorizontalAlignment in align_map:
text_range.OwnerParagraph.Format.HorizontalAlignment = align_map[excel_cell.HorizontalAlignment]
# 設置垂直對齊方式
valign_map = {
VerticalAlignType.Top: VerticalAlignment.Top,
VerticalAlignType.Center: VerticalAlignment.Middle,
VerticalAlignType.Bottom: VerticalAlignment.Bottom
}
if excel_cell.VerticalAlignment in valign_map:
word_cell.CellFormat.VerticalAlignment = valign_map[excel_cell.VerticalAlignment]
# 加載 Excel 文件
workbook = Workbook()
workbook.LoadFromFile("Sample.xlsx")
# 獲取第一個工作表
sheet = workbook.Worksheets[0]
# 創建 Word 文檔
doc = Document()
section = doc.AddSection()
section.PageSetup.Orientation = PageOrientation.Landscape
# 創建 Word 表格
table = section.AddTable(True)
table.ResetCells(sheet.LastRow, sheet.LastColumn)
# 執行合併單元格
merge_cells(sheet, table)
# 複製 Excel 數據和樣式到 Word 表格
for r in range(1, sheet.LastRow + 1):
table.Rows[r - 1].Height = float(sheet.Rows[r - 1].RowHeight)
for c in range(1, sheet.LastColumn + 1):
x_cell = sheet.Range[r, c]
w_cell = table.Rows[r - 1].Cells[c - 1]
# 添加文本並複製樣式
text_range = w_cell.AddParagraph().AppendText(x_cell.NumberText)
copy_style(text_range, x_cell, w_cell)
# 保存 Word 文檔
doc.SaveToFile("output/CopyExcelDataStyleToWord.docx", FileFormat.Docx2019)
doc.Dispose()
workbook.Dispose()
結果
將Excel工作表作為OLE對象嵌入Word文檔
我們還可以直接以OLE對象形式將Excel工作表嵌入到Word文檔中,從而實現在Word文檔中展示表格的同時,使表格擁有Excel的高級功能。在使用代碼嵌入Excel工作表到Word文檔時,需要先將Excel工作表保存為圖像應用於Word文檔中OLE對象的展示。當表格在Word文檔中編輯或更新後,表格展示會自動更新為最新的數據。
以下是操作步驟:
-
定義文件路徑
- 定義 Excel 文件路徑
excel_path和輸出 Word 文件路徑output_doc_path。 - 定義圖像文件路徑
image_path。
- 定義 Excel 文件路徑
-
創建 Word 文檔並設置頁面方向
- 創建
Document實例,使用AddSection()添加節。 - 設置頁面方向為橫向:
section.PageSetup.Orientation = PageOrientation.Landscape。 - 使用
AddParagraph()添加段落。
- 創建
-
載入 Excel 文件並獲取工作表
- 創建
Workbook實例,並使用LoadFromFile()讀取 Excel 文件。 - 獲取第一個工作表
sheet。
- 創建
-
將 Excel 表格轉換為圖像並保存
- 使用
sheet.ToImage()方法將工作表轉換為圖像,並保存為image_path。
- 使用
-
創建並加載工作表圖像
- 創建
DocPicture實例,並使用LoadImage()加載工作表圖像。
- 創建
-
將 OLE 對象(Excel 工作表)插入到 Word 文檔
- 使用
paragraph.AppendOleObject()插入 Excel 工作表作為 OLE 對象,並將類型設置為OleObjectType.ExcelWorksheet。 - 設置 OLE 對象不顯示為圖標:
ole.DisplayAsIcon = False。
- 使用
-
保存 Word 文檔
- 使用
SaveToFile(output_doc_path, FileFormat.Docx2019)保存 Word 文件。
- 使用
代碼示例
import os
from spire.doc import Document, DocPicture, FileFormat, OleObjectType, PageOrientation
from spire.xls import Workbook
# 定義文件路徑
excel_path = "Sample.xlsx"
output_doc_path = os.path.join("output", "InsertExcelOleToWord.docx")
image_path = "SheetImage.png"
# 創建Word文檔並配置頁面方向
with Document() as doc:
section = doc.AddSection()
section.PageSetup.Orientation = PageOrientation.Landscape
paragraph = section.AddParagraph()
# 載入Excel文件並獲取第一個工作表
with Workbook() as workbook:
workbook.LoadFromFile(excel_path)
sheet = workbook.Worksheets.get_Item(0)
# 將Excel表格轉換為圖像並保存
image_stream = sheet.ToImage(0, 0, sheet.AllocatedRange.RowCount, sheet.AllocatedRange.ColumnCount)
image_stream.Save(image_path)
# 創建DocPicture對象,並加載工作表圖像
pic = DocPicture(doc)
pic.LoadImage(image_path)
# 將OLE對象(Excel工作表)插入到Word文檔
ole = paragraph.AppendOleObject(excel_path, pic, OleObjectType.ExcelWorksheet)
# 設置不顯示OLE對象為圖標
ole.DisplayAsIcon = False
# 保存Word文檔
doc.SaveToFile(output_doc_path, FileFormat.Docx2019)
結果
本文演示如何使用Python將Excel表格插入到Word文中,包括插入數據、複製數據和樣式以及以OLE對象形式插入三種形式。