将 Excel 表格插入 Word 文档的三种实用方案(Python 自动化)
在处理企业日常办公、财务审计或数据报表时,国内开发者经常遇到需要将 Excel 中的数据或排版好的表格同步到 Word 报告中的情况。如果单纯依靠人工复制粘贴,不仅效率低下,还极易出错。
本文将分享如何使用 Spire.Doc for Python 和 Spire.XLS for Python 组件,通过代码高效地将 Excel 表格集成到 Word 文档中。我们将介绍数据流构建、带格式复制以及 OLE 对象嵌入三种不同的实现方案,并对比它们的具体应用场景,帮助大家快速解决实际业务中的文档合并问题。
三种实现方案的对比
了解不同方案差异是处理文档自动化的第一步。下面我们通过一组对比,来看看三种方案的主要特点。
| 插入方式 | 底层实现原理 | 方案优势 | 性能与局限 | 常见应用场景 |
|---|---|---|---|---|
| 数据流动态构建 | 解析 Excel 单元格数据,在 Word 中动态重建表格。 | 格式完全可控,生成的 Word 文件体积最小。 | 无法保留 Excel 原生的公式、图表和底色。 | 自动化周报生成、后台数据纯文本导出。 |
| 带格式复制 | 提取 Excel 的字体、边框、背景色等样式并渲染至 Word。 | 视觉还原度高,能保留 Excel 原本的排版色彩。 | 样式解析较重,大批量处理时会占用较大内存。 | 财务资产负债表、需要严格保留颜色的技术看板。 |
| 作为 OLE 对象内嵌 | 将整个 Excel 文件作为二进制流直接内嵌到 Word 中。 | 保持文件原样,双击可唤起 Excel 进行二次编辑。 | 文件体积会明显增大,非 Windows 环境支持有限。 | 技术文档附件内嵌、需要交付给业务微调的文档。 |
环境准备与组件安装
在正式进入代码实战之前,我们需要在 Python 环境中部署相关的库。本文核心依赖 Spire.Doc for Python 和 Spire.XLS for Python 两个组件,它们分别负责 Word 文档的结构解析与 Excel 数据的读取。
这两个组件具备完全的独立性,纯 Python 环境即可流畅运行,无需额外安装 Microsoft Office。
我们可以通过标准的 pip 工具进行安装,在终端或命令行中执行以下命令即可:
# 安装 Excel 处理组件
pip install Spire.XLS
# 安装 Word 处理组件
pip install Spire.Doc
安装完成后,无需任何额外的环境变量配置,即可在脚本中直接通过 import 引入对应的命名空间。
如果需要处理其它格式的文件,还可以直接使用 Spire.Office,除以上以上两个组件外,它还包含 Spire.PDF、Spire.Presentation 和 Spire.Barcode 等。
提取 Excel 数据并在 Word 中重建表格
在不需要保留 Excel 复杂的底色或边框,只需要将数据抽离出来并转化为 Word 标准表格时,基于数据流的动态构建是最实用的方法。用这种方法导入 Excel 表格数据到 Word 文档,可以最大化减小对 Word 文档体积大小的影响。
我们首先通过 Excel 组件读取表格数据,接着在 Word 中创建一个同等行列规模的空白表格,最后通过循环完成数据的对齐与填充。
具体实现代码如下:
from spire.doc import Document, AutoFitBehaviorType, FileFormat, DefaultTableStyle
from spire.xls import Workbook
# 指定输入与输出的文件路径
excel_file = "/示例文档.xlsx"
word_file = "/ExcelDataToWord.docx"
# 创建 Workbook 实例并加载 Excel 文件
workbook = Workbook()
workbook.LoadFromFile(excel_file)
# 获取第一个工作表以及已使用的单元格范围
sheet = workbook.Worksheets.get_Item(0)
allocatedRange = sheet.AllocatedRange
# 创建 Document 实例用于生成 Word 文档
doc = Document()
section = doc.AddSection()
table = section.AddTable()
# 根据 Excel 的实际行数与列数,重置 Word 表格的行列结构
table.ResetCells(allocatedRange.RowCount, allocatedRange.ColumnCount)
# 遍历已使用范围的每一行和每一列进行数据填充
for rowIndex in range(allocatedRange.RowCount):
for colIndex in range(allocatedRange.ColumnCount):
# 定位 Word 目标单元格并添加段落
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"
# 自动调整表格宽度以适应窗口,并应用内置表格样式
table.AutoFit(AutoFitBehaviorType.AutoFitToWindow)
table.ApplyStyle(DefaultTableStyle.GridTable1LightAccent6)
# 保存修改后的结果文档并释放资源
doc.SaveToFile(word_file, FileFormat.Docx2019)
doc.Dispose()
workbook.Dispose()

核心代码解析
- 通过
sheet.AllocatedRange属性自动识别 Excel 中所有包含数据的有效单元格范围。 - 使用
table.ResetCells()方法重置 Word 表格的行数列数,使其与 Excel 数据一致。 - 调用
.NumberText属性确保读取到的是经过 Excel 格式化渲染后的最终文本(如千分位、百分比符号等)。 - 使用
table.AutoFit(AutoFitBehaviorType.AutoFitToWindow)自动调整列宽,确保表格在 Word 页面内能够自适应铺满,防止因列数过多影响展示效果。
将 Excel 表格带格式复制到 Word 文档中
如果是财务报表、审计报告或者带有复杂合并单元格的工作表,单纯将单元格的值填写到 Word 表格中缺点明显。这类场景通常要求我们还要将单元格的背景色、字号、加粗状态以及对齐方式悉数同步到 Word 中,以保证视觉的一致性。
为了防止 Word 出现因行列不对齐导致的表格错位,我们需要编写辅助函数分别处理 Excel 复杂的合并单元格关系,并逐个复制字体与底色样式。
代码实现如下:
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):
# 复制字体样式及颜色
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
# 复制背景颜色
if excelCell.Style.FillPattern != ExcelPatternType.none:
wordCell.CellFormat.BackColor = Color.FromRgb(excelCell.Style.Color.R, excelCell.Style.Color.G, excelCell.Style.Color.B)
# 映射并复制水平对齐方式
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]
# 映射并复制垂直对齐方式
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)
# 在填充数据前,先执行单元格合并处理
MergeCells(sheet, table)
# 循环填充数据并复制格式
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()

核心代码解析
- 自定义函数
MergeCells通过提取 Excel 的MergedCells集合,分别调用 Word 表格的ApplyHorizontalMerge和ApplyVerticalMerge接口,以避免复杂网格在跨组件转换时发生结构崩溃。 - 使用
Color.FromRgb()提取底层颜色值并重新组装,实现背景色与字体的跨文件同步。 - 在复制背景色前增加
ExcelPatternType.none条件拦截,防止没有设置底色的标准单元格在转换后被系统误填涂为纯黑色。 - 自定义函数
CopyFormatting是关键步骤。它通过逐一读取 Excel 单元格的 Font 和 Style 属性,并赋值给 Word 的字符格式与单元格格式,使表格在视觉上与 Excel 工作表保持一致。
将 Excel 表格作为 OLE 对象内嵌到 Word 中
在一些特殊的工作中,用户不仅希望在 Word 中看到 Excel 报表的外观,还希望在有需要时可以直接通过点击表格,在 Word 内部唤起完整的 Excel 来修改公式或查看底层的图表。这种文档融合的需求,可以通过 OLE 技术来实现。
由于 OLE 对象在静态未激活状态下需要一张快照来做外观占位,我们会先利用 Excel 模块将表格渲染为一张图片,随后将该图片作为封面,连同 Excel 的二进制文件一起嵌入到 Word 中。
具体实现代码如下:
from spire.doc import Document, DocPicture, FileFormat, OleObjectType
from spire.xls import Workbook
# 指定路径与文件名
excelFileName = "示例文档.xlsx"
wordFileName = "/ExcelOleToWord.docx"
tempImageName = "SheetImage.png"
# 创建 Workbook 实例并在后台将工作表转换为图片
workbook = Workbook()
workbook.LoadFromFile(excelFileName)
sheet = workbook.Worksheets.get_Item(0)
sheet.ToImage(1, 1, sheet.LastRow, sheet.LastColumn).Save(tempImageName)
# 创建 Document 实例并构建 Word 主体框架
doc = Document()
section = doc.AddSection()
paragraph = section.AddParagraph()
# 加载生成的图片作为 OLE 对象的显示封面
pic = DocPicture(doc)
pic.LoadImage(tempImageName)
# 调整图片宽度使其自适应 Word 页面的正文区域宽度
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 # 设置为不以冰冷的图标显示,而是直接展示表格图像
# 保存修改后的结果文档并释放资源
doc.SaveToFile(wordFileName, FileFormat.Docx2019)
workbook.Dispose()
doc.Dispose()

核心代码解析
- 调用
sheet.ToImage()方法将指定的表格区域转换为快照图片。 - 采用了
PageSize.Width - Margins.Left - Margins.Right自适应缩放,使插入的 Excel 快照能够横向铺满正文。 - 通过
paragraph.AppendOleObject()将 Excel 文件以 OLE 对象的形式插入到 Word 的段落对象中。 - 将
ole.DisplayAsIcon设置为False,以保证 OLE 对象在编辑后动态更新。
总结
今天的指南主要介绍了将 Excel 表格嵌入到 Word 文档的三种方法,使用简洁的表格对三种方法进行对比,还给出了三种方案的 Python 代码实现示例。你可以根据不同的需求选择适合的方法,轻松让表格为 Word 文本提供数据支撑!如果还有其它在独立环境中处理文档的需求,可以到主页浏览更多博客文章,或到 E-iceblue 官网查询教程。

浙公网安备 33010602011771号