查看: 90|回复: 1

Python三种方案将Excel表格插入Word文档:数据重建、格式复制与OLE嵌入

[复制链接]
发表于 2 小时前 | 显示全部楼层 |阅读模式
在企业日常办公、财务审计或数据报表中,经常需要将Excel中的数据或排版好的表格同步到Word报告里。人工复制粘贴效率低且易出错,本文分享使用Spire.Doc for Python和Spire.XLS for Python组件,通过三种代码方案实现Excel表格到Word文档的集成:数据流动态构建、带格式复制、OLE对象嵌入。我们将对比每种方案的适用场景,并给出完整的Python实现代码。

## 三种方案对比

| 方案 | 原理 | 优势 | 局限 | 适用场景 |
|------|------|------|------|----------|
| 数据流动态构建 | 解析Excel单元格数据,在Word中重建表格 | 格式完全可控,Word文件体积最小 | 无法保留Excel原生公式、图表和底色 | 自动化周报生成、后台数据纯文本导出 |
| 带格式复制 | 提取Excel字体、边框、背景色等样式,渲染至Word | 视觉还原度高,保留排版色彩 | 样式解析较重,大批量处理占用内存大 | 财务资产负债表、需要严格保留颜色的技术看板 |
| OLE对象内嵌 | 将Excel文件作为二进制流内嵌到Word中 | 保持文件原样,双击可唤起Excel编辑 | 文件体积增大,非Windows环境支持有限 | 技术文档附件内嵌、需要交付给业务微调的文档 |

## 环境准备与组件安装

在Python环境中部署以下两个库:
- Spire.Doc for Python:处理Word文档结构
- Spire.XLS for Python:读取Excel数据

这两个组件独立运行,无需安装Microsoft Office。通过pip安装:
  1. pip install Spire.XLS
  2. pip install Spire.Doc
复制代码

安装后直接import即可使用。也可安装Spire.Office含更多组件(Spire.PDF、Spire.Presentation等)。

## 方案一:提取Excel数据并在Word中重建表格

当只需要数据,不需保留复杂底色或边框时,使用动态构建。该方法通过Excel组件读取表格数据,在Word中创建同等行列的空表格,然后循环填充数据,对Word文件体积影响最小。
  1. from spire.doc import Document, AutoFitBehaviorType, FileFormat, DefaultTableStyle
  2. from spire.xls import Workbook
  3. # 指定输入与输出文件路径
  4. excel_file = "/示例文档.xlsx"
  5. word_file = "/ExcelDataToWord.docx"
  6. # 创建Workbook实例并加载Excel
  7. workbook = Workbook()
  8. workbook.LoadFromFile(excel_file)
  9. sheet = workbook.Worksheets.get_Item(0)
  10. allocatedRange = sheet.AllocatedRange
  11. # 创建Word文档
  12. doc = Document()
  13. section = doc.AddSection()
  14. table = section.AddTable()
  15. table.ResetCells(allocatedRange.RowCount, allocatedRange.ColumnCount)
  16. # 遍历填充数据
  17. for rowIndex in range(allocatedRange.RowCount):
  18.     for colIndex in range(allocatedRange.ColumnCount):
  19.         cell = table.Rows.get_Item(rowIndex).Cells.get_Item(colIndex)
  20.         paragraph = cell.AddParagraph()
  21.         textRange = paragraph.AppendText(allocatedRange.get_Item(rowIndex + 1, colIndex + 1).NumberText)
  22.         textRange.CharacterFormat.FontName = "HarmonyOS Sans SC"
  23. # 自适应窗口宽度并应用样式
  24. table.AutoFit(AutoFitBehaviorType.AutoFitToWindow)
  25. table.ApplyStyle(DefaultTableStyle.GridTable1LightAccent6)
  26. doc.SaveToFile(word_file, FileFormat.Docx2019)
  27. doc.Dispose()
  28. workbook.Dispose()
复制代码

**核心要点:**
- sheet.AllocatedRange自动识别含数据的有效单元格范围。
- table.ResetCells()重置Word表格行列数。
- .NumberText属性读取Excel格式化后的最终文本(如千分位、百分比符号)。
- table.AutoFit(AutoFitBehaviorType.AutoFitToWindow)确保表格自适应铺满页面,防止列数过多影响展示。

## 方案二:将Excel表格带格式复制到Word文档

对于财务报表、审计报告等含合并单元格、背景色、字体的场景,需要逐一同步样式。需编写辅助函数处理合并单元格及字体样式复制。
  1. from spire.xls import Workbook, HorizontalAlignType, ExcelPatternType, VerticalAlignType
  2. from spire.doc import Document, Color, HorizontalAlignment, VerticalAlignment, PageOrientation, FileFormat
  3. def MergeCells(worksheet, wordTable):
  4.     if not worksheet.HasMergedCells:
  5.         return
  6.     for cell_range in worksheet.MergedCells:
  7.         start_row, start_col = cell_range.Row, cell_range.Column
  8.         row_count, col_count = cell_range.RowCount, cell_range.ColumnCount
  9.         if col_count > 1:
  10.             for row in range(start_row, start_row + row_count):
  11.                 wordTable.ApplyHorizontalMerge(row - 1, start_col - 1, start_col - 1 + col_count - 1)
  12.         if row_count > 1:
  13.             wordTable.ApplyVerticalMerge(start_col - 1, start_row - 1, start_row - 1 + row_count - 1)
  14. def CopyFormatting(tableTextRange, excelCell, wordCell):
  15.     # 字体样式及颜色
  16.     font = excelCell.Style.Font
  17.     tableTextRange.CharacterFormat.TextColor = Color.FromRgb(font.Color.R, font.Color.G, font.Color.B)
  18.     tableTextRange.CharacterFormat.FontSize = float(font.Size)
  19.     tableTextRange.CharacterFormat.FontName = font.FontName
  20.     tableTextRange.CharacterFormat.Bold = font.IsBold
  21.     tableTextRange.CharacterFormat.Italic = font.IsItalic
  22.     # 背景颜色
  23.     if excelCell.Style.FillPattern != ExcelPatternType.none:
  24.         wordCell.CellFormat.BackColor = Color.FromRgb(excelCell.Style.Color.R, excelCell.Style.Color.G, excelCell.Style.Color.B)
  25.     # 水平对齐方式映射
  26.     hAlignMap = {
  27.         HorizontalAlignType.Left: HorizontalAlignment.Left,
  28.         HorizontalAlignType.Center: HorizontalAlignment.Center,
  29.         HorizontalAlignType.Right: HorizontalAlignment.Right
  30.     }
  31.     if excelCell.HorizontalAlignment in hAlignMap:
  32.         tableTextRange.OwnerParagraph.Format.HorizontalAlignment = hAlignMap[excelCell.HorizontalAlignment]
  33.     # 垂直对齐方式映射
  34.     vAlignMap = {
  35.         VerticalAlignType.Top: VerticalAlignment.Top,
  36.         VerticalAlignType.Center: VerticalAlignment.Middle,
  37.         VerticalAlignType.Bottom: VerticalAlignment.Bottom
  38.     }
  39.     if excelCell.VerticalAlignment in vAlignMap:
  40.         wordCell.CellFormat.VerticalAlignment = vAlignMap[excelCell.VerticalAlignment]
  41. # 主程序
  42. excelFileName = "/示例文档.xlsx"
  43. wordFileName = "/ExcelDataFormatToWord.docx"
  44. workbook = Workbook()
  45. workbook.LoadFromFile(excelFileName)
  46. sheet = workbook.Worksheets.get_Item(0)
  47. doc = Document()
  48. section = doc.AddSection()
  49. section.PageSetup.Orientation = PageOrientation.Landscape  # 宽表格推荐横向排版
  50. table = section.AddTable()
  51. table.ResetCells(sheet.LastRow, sheet.LastColumn)
  52. MergeCells(sheet, table)
  53. for r in range(1, sheet.LastRow + 1):
  54.     tableRow = table.Rows.get_Item(r - 1)
  55.     tableRow.Height = float(sheet.Rows.get_Item(r - 1).RowHeight)  # 同步行高
  56.     for c in range(1, sheet.LastColumn + 1):
  57.         eCell = sheet.Range.get_Item(r, c)
  58.         wCell = table.Rows.get_Item(r - 1).Cells.get_Item(c - 1)
  59.         textRange = wCell.AddParagraph().AppendText(eCell.NumberText)
  60.         CopyFormatting(textRange, eCell, wCell)
  61. doc.SaveToFile(wordFileName, FileFormat.Docx2019)
  62. doc.Dispose()
  63. workbook.Dispose()
复制代码

**核心要点:**
- MergeCells函数提取Excel的MergedCells集合,分别调用Word表格的ApplyHorizontalMerge和ApplyVerticalMerge,防止跨组件转换时结构崩坏。
- Color.FromRgb()提取颜色值实现跨文件同步。
- 复制背景色前加ExcelPatternType.none条件,防止无底色单元格被误填为黑色。
- CopyFormatting函数逐一读取Excel单元格的Font和Style属性,赋值给Word字符格式与单元格格式,保持视觉一致。

## 方案三:将Excel表格作为OLE对象内嵌到Word

当需要保留Excel原生编辑能力(如公式、图表)时,可使用OLE对象。先将Excel表格渲染为图片作为封面,再将Excel二进制文件嵌入Word。
  1. from spire.doc import Document, DocPicture, FileFormat, OleObjectType
  2. from spire.xls import Workbook
  3. excelFileName = "示例文档.xlsx"
  4. wordFileName = "/ExcelOleToWord.docx"
  5. tempImageName = "SheetImage.png"
  6. workbook = Workbook()
  7. workbook.LoadFromFile(excelFileName)
  8. sheet = workbook.Worksheets.get_Item(0)
  9. sheet.ToImage(1, 1, sheet.LastRow, sheet.LastColumn).Save(tempImageName)
  10. doc = Document()
  11. section = doc.AddSection()
  12. paragraph = section.AddParagraph()
  13. pic = DocPicture(doc)
  14. pic.LoadImage(tempImageName)
  15. pic.Width = section.PageSetup.PageSize.Width - section.PageSetup.Margins.Left - section.PageSetup.Margins.Right
  16. ole = paragraph.AppendOleObject(excelFileName, pic, OleObjectType.ExcelWorksheet)
  17. ole.DisplayAsIcon = False  # 显示封面图像而非图标
  18. doc.SaveToFile(wordFileName, FileFormat.Docx2019)
  19. workbook.Dispose()
  20. doc.Dispose()
复制代码

**核心要点:**
- sheet.ToImage()将指定表格区域转换为快照图片。
- 使用PageSize.Width - Margins.Left - Margins.Right自适应缩放,使快照横铺正文。
- paragraph.AppendOleObject()将Excel文件以OLE对象插入,绑定图片作为显示封面。
- 设置ole.DisplayAsIcon为False,确保OLE对象在Word中展示表格图像,且双击可激活Excel编辑。

## 总结

本文介绍了三种用Python将Excel表格嵌入Word文档的方案,每种方案都附有完整代码和核心解析。你可以根据实际需求选择:纯数据迁移用方案一,需保留样式用方案二,需保留编辑能力用方案三。这些代码可直接用于自动化报表生成、财务审计报告等场景,提升文档处理效率。
回复

使用道具 举报

发表于 2 小时前 | 显示全部楼层

Re: Python三种方案将Excel表格插入Word文档:数据重建、格式复制与OLE嵌入

感谢楼主分享这么实用的方案,正好最近在改进报表生成流程。三种方案的对比很清晰,从轻量级数据导出到高保真格式复制再到OLE内嵌,覆盖了不同场景需求。方案一的代码我直接就能套用到周报生成里,但想请教一下:如果Excel中有多张工作表,目前只处理了第一张,是否可以通过循环sheet索引逐个添加表格到Word?另外方案二提到合并单元格处理,但代码片段似乎不完整,后续会补全吗?期待更多细节!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

指导单位

江苏省公安厅

江苏省通信管理局

浙江省台州刑侦支队

DEFCON GROUP 86025

Hacking Group 021A

旗下站点

态势感知中心

应急响应中心

红盟安全

联系我们

官方QQ群:112851260

官方邮箱:security#ihonker.org(#改成@)

官方核心成员

关注微信公众号

Archiver|手机版|小黑屋| ( 沪ICP备2021026908号 )

GMT+8, 2026-6-14 11:53 , Processed in 0.026545 second(s), 18 queries , Gzip On, Redis On.

Powered by ihonker.com

Copyright © 2015-现在.

  • 返回顶部