将 Excel 表格插入 Word 文档的三种实用方案(Python 自动化)

在处理企业日常办公、财务审计或数据报表时,国内开发者经常遇到需要将 Excel 中的数据或排版好的表格同步到 Word 报告中的情况。如果单纯依靠人工复制粘贴,不仅效率低下,还极易出错。

本文将分享如何使用 Spire.Doc for PythonSpire.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 工具进行安装,在终端或命令行中执行以下命令即可:

bash 复制代码
# 安装 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 中创建一个同等行列规模的空白表格,最后通过循环完成数据的对齐与填充。

具体实现代码如下:

python 复制代码
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 复杂的合并单元格关系,并逐个复制字体与底色样式。

代码实现如下:

python 复制代码
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
    
    # 复制背景颜色(仅当 Excel 单元格填充了实际颜色时)
    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 表格的 ApplyHorizontalMergeApplyVerticalMerge 接口,以避免复杂网格在跨组件转换时发生结构崩溃。
  • 使用 Color.FromRgb() 提取底层颜色值并重新组装,实现背景色与字体的跨文件同步。
  • 在复制背景色前增加 ExcelPatternType.none 条件拦截,防止没有设置底色的标准单元格在转换后被系统误填涂为纯黑色。
  • 自定义函数 CopyFormatting是关键步骤。它通过逐一读取 Excel 单元格的 Font 和 Style 属性,并赋值给 Word 的字符格式与单元格格式,使表格在视觉上与 Excel 工作表保持一致。

将 Excel 表格作为 OLE 对象内嵌到 Word 中

在一些特殊的工作中,用户不仅希望在 Word 中看到 Excel 报表的外观,还希望在有需要时可以直接通过点击表格,在 Word 内部唤起完整的 Excel 来修改公式或查看底层的图表。这种文档融合的需求,可以通过 OLE 技术来实现。

由于 OLE 对象在静态未激活状态下需要一张快照来做外观占位,我们会先利用 Excel 模块将表格渲染为一张图片,随后将该图片作为封面,连同 Excel 的二进制文件一起嵌入到 Word 中。

具体实现代码如下:

python 复制代码
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 官网查询教程。

相关推荐
ZHW_AI课题组1 小时前
调用智谱AI实现特定角色扮演对话
python
nexustech1 小时前
simplejson:Python JSON 处理的备用引擎
开发语言·python·其他·json
俊哥工具1 小时前
027免费开源硬盘检测工具,一键查看健康度,杜绝数据丢失
pdf·电脑·word·excel·音视频
lulu12165440781 小时前
OpenAI 如何用开源前端生态为 GPT-5.6 铺路? - 微元算力(weytoken)
java·前端·人工智能·python·gpt·开源·ai编程
CC数学建模1 小时前
2026年第十六届APMCM 亚太地区大学生数学建模竞赛(中文赛项)赛题A题:自来水厂水质预测与评估完整思路、代码、模型、文章,全网首发高质量分享!
python·算法·数学建模
天天进步20152 小时前
Python全栈项目--基于机器学习的异常检测系统
开发语言·python·机器学习
xxie12379410 小时前
return与print
开发语言·python
秋910 小时前
从 Python 后端工程师转型 AI Engineer(AI 工程化)的完整补课清单(2026实战版)
开发语言·人工智能·python
慕木沐11 小时前
Google ADK Java 1.0版本 核心机制与实战 Demo
java·开发语言·python