在数字化办公场景中,文档的处理往往需要跨平台协作进行。例如,分析人员使用 Excel 处理复杂数据,而最终报告生成则可能需要在 Word 中完成。当文档创建者需要在这些文档之间进行数据转移时,手动复制粘贴不仅效率低下,还容易导致数据错漏、版本冲突和格式错乱。基于 Python 的自动化解决方案能够完美整合 Excel 的数据处理能力与 Word 的格式控制功能,有效保障数据一致性,减少重复排版工作,显著提升财务报告、学术论文、合规文档等场景的生成效率。
本文将介绍如何使用 Spire.Office for Python 通过 Python 代码将 Excel 表格插入到 Word 文档中。
安装 Spire.Office for Python
本教程需要 Spire.Office for Python 和 plum-dispatch v1.7.4。您可以下载 Spire.Office for Python 并手动导入到项目,通过以下 pip 命令将它们轻松安装到项目。
pip install Spire.Doc
读取 Excel 工作表数据并写入 Word 表格
借助 Spire.XLS for Python,开发者可以使用 CellRange.NumberText 属性从 Excel 工作表中提取数据,并保留数值格式。接下来,开发者可以使用 Spire.Doc for Python 在 Word 文档中创建表格,并使用将数据插入其中。此方法适用于简单的 Excel 工作表以及需要重新格式化表格的情况。
从 Excel 工作表读取数据并写入 Word 表格的步骤:
- 创建 Workbook 类的实例,并使用 Workbook.LoadFromFile() 方法加载 Excel 文件。
- 使用 Workbook.Worksheets.get_Item() 方法获取工作表,并通过 Worksheet.AllocatedRange 属性获取已使用的单元格区域。
- 初始化 Document 实例以创建 Word 文档。
- 使用 Document.AddSection() 方法在文档中添加节,并使用 Section.AddTable() 方法在节中插入表格。
- 根据已使用的单元格区域使用 Table.ResetCells() 方法定义表格的行数和列数。
- 遍历已使用的单元格区域的行和列。
- 使用 Table.Rows.get_Item().Cells.get_Item() 方法获取对应的 Word 表格单元格,并使用 TableCell.AddParagraph() 方法添加段落到单元格中。
- 使用 CellRange.get_Item().NumberText 属性提取 Excel 单元格数据,并使用 Paragraph.AppendText() 方法将其添加到 Word 表格单元格的段落中。
- 对 Word 表格应用所需格式。
- 使用 Document.SaveToFile() 方法保存 Word 文档。
- Python
from spire.doc import Document, AutoFitBehaviorType, FileFormat, DefaultTableStyle
from spire.xls import Workbook
# 指定文件名
excel_file = "Sample.xlsx"
word_file = "output/ExcelDataToWord.docx"
# 创建 Workbook 实例
workbook = Workbook()
# 加载 Excel 文件
workbook.LoadFromFile(excel_file)
# 获取第一个工作表
sheet = workbook.Worksheets.get_Item(0)
# 获取第一个工作表中已使用的单元格范围
allocatedRange = sheet.AllocatedRange
# 创建 Document 实例
doc = Document()
# 向文档添加节,并在该节中添加表格
section = doc.AddSection()
table = section.AddTable()
# 重置 Word 表格的行数和列数,以匹配 Excel 工作表的行数和列数
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()
# 将单元格的值追加到 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)
# 保存 Word 文档
doc.SaveToFile(word_file, FileFormat.Docx2019)
# 释放资源
doc.Dispose()
workbook.Dispose()
复制 Excel 工作表的数据及格式到 Word 文档
开发者也可以使用 Spire.XLS for Python 和 Spire.Doc for Python 同时将 Excel 工作表的数据及单元格格式复制到对应的 Word 文档表格中,从而在移动数据的同时保持 Excel 表格的原有结构和设计。
实现表格结构和设计的保留需要自定义以下方法:
- MergeCells:根据 Excel 工作表中的单元格合并信息,在 Word 表格中进行对应的单元格合并操作。
- CopyFormatting:复制 Excel 单元格的格式(字体样式、背景颜色、水平及垂直对齐方式)到 Word 表格中对应的单元格。
复制 Excel 工作表数据及格式到 Word 表格的步骤:
- 创建 Workbook 实例,并使用 Workbook.LoadFromFile() 方法加载 Excel 文件。
- 使用 Workbook.Worksheets.get_Item() 方法获取工作表。
- 初始化 Document 实例以创建 Word 文档,并使用 Document.AddSection() 方法在文档中添加节。
- 使用 Section.AddTable() 方法在节中插入表格。
- 使用 Table.ResetCells() 方法根据工作表行列数调整表格行列数。
- 使用 MergeCells() 方法复制并应用单元格合并。
- 遍历工作表的每一行,并使用 Table.Rows.get_Item().Height 属性设置行高。
- 遍历每行中的列:
- 使用 Worksheet.Range.get_Item() 方法获取工作表单元格,并使用 TableRow.Cells.get_Item() 方法获取 Word 表格对应单元格。
- 使用 CellRange.NumberText 属性提取工作表单元格数据,并使用 TableCell.AddParagraph().AppendText() 方法将其追加到 Word 表格对应单元格中。
- 使用 CopyFormatting() 方法复制并应用单元格格式。
- 使用 Document.SaveToFile() 方法保存 Word 文档。
- Python
from spire.xls import Workbook, HorizontalAlignType, ExcelPatternType, VerticalAlignType
from spire.doc import Document, Color, HorizontalAlignment, VerticalAlignment, PageOrientation, FileFormat
def MergeCells(worksheet, wordTable):
# 检查是否存在合并单元格
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 = "Sample.xlsx"
wordFileName = "output/ExcelDataFormatToWord.docx"
# 创建 Workbook 实例并加载 Excel 文件
workbook = Workbook()
workbook.LoadFromFile(excelFileName)
# 获取工作表
sheet = workbook.Worksheets.get_Item(0)
# 创建 Document 实例
doc = Document()
# 向文档添加节,并设置页面方向
section = doc.AddSection()
section.PageSetup.Orientation = PageOrientation.Landscape
# 向节中添加表格
table = section.AddTable()
# 根据 Excel 工作表的行数和列数设置表格的行列数
table.ResetCells(sheet.LastRow, sheet.LastColumn)
# 执行 MergeCells 方法合并单元格
MergeCells(sheet, table)
# 遍历 Excel 工作表的每一行和每一列
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):
# 获取 Excel 工作表中的单元格和 Word 表格中的单元格
eCell = sheet.Range.get_Item(r, c)
wCell = table.Rows.get_Item(r - 1).Cells.get_Item(c - 1)
# 将单元格的值追加到 Word 表格
textRange = wCell.AddParagraph().AppendText(eCell.NumberText)
# 复制单元格格式
CopyFormatting(textRange, eCell, wCell)
# 保存 Word 文档
doc.SaveToFile(wordFileName, FileFormat.Docx2019)
doc.Dispose()
workbook.Dispose()
将 Excel 工作表作为 OLE 对象嵌入到 Word 文档
除了复制数据和格式之外,开发者还可以直接将 Excel 工作表作为 OLE 对象嵌入到 Word 文档中。此方法不仅能够完整显示工作表内容,还允许用户直接在 Word 文档中编辑 Excel 工作表,并实时更新工作表展示效果。
Spire.Doc for Python 提供的 Paragraph.AppendOleObject(str: filename, DocPicture, OleObjectType.ExcelWorksheet) 方法,可以帮助开发者轻松将 Excel 文件作为 OLE 对象嵌入到 Word 文档中。
插入 Excel 工作表 OLE 对象到 Word 文档的步骤:
- 创建 Workbook 实例,并使用 Workbook.LoadFromFile() 方法加载 Excel 文件。
- 使用 Workbook.Worksheets.get_Item() 方法获取工作表,并使用 Worksheet.ToImage().Save() 方法将其保存为图片(作为 OLE 对象的初始展示效果)。
- 初始化 Document 实例以创建 Word 文档。
- 使用 Document.AddSection() 方法在文档中添加节,并使用 Section.AddParagraph() 方法插入段落到节中。
- 创建 DocPicture 实例,并使用 DocPicture.LoadImage() 方法加载保存的工作表图片。
- 使用 DocPicture.Width 属性根据页面布局调整图片大小。
- 使用 Paragraph.AppendOleObject() 方法将 Excel 文件作为 OLE 对象插入段落。
- 将 DocOleObject.DisplayAsIcon 属性设置为 False,确保 OLE 对象在编辑后动态更新。
- 使用 Document.SaveToFile() 方法保存 Word 文档。
- Python
from spire.doc import Document, DocPicture, FileFormat, OleObjectType
from spire.xls import Workbook
# 指定文件路径和文件名
excelFileName = "Sample.xlsx"
wordFileName = "output/ExcelOleToWord.docx"
tempImageName = "SheetImage.png"
# 创建 Workbook 实例并加载 Excel 文件
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()
# 创建 DocPicture 实例并加载图像
pic = DocPicture(doc)
pic.LoadImage(tempImageName)
# 设置图像宽度
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 对象
ole.DisplayAsIcon = False
# 保存 Word 文档
doc.SaveToFile(wordFileName, FileFormat.Docx2019)
workbook.Dispose()
doc.Dispose()
申请临时 License
如果您需要去除生成文档中的评估提示或解除功能限制,请该Email地址已收到反垃圾邮件插件保护。要显示它您需要在浏览器中启用JavaScript。获取有效期 30 天的临时许可证。