用Python插入Excel表格到Word文档

news2025/4/21 15:23:06

在日常办公场景中,通过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文档的插入。
以下是操作步骤:

  1. 加载 Excel 文件

    • 创建 Workbook 实例并使用 LoadFromFile() 读取 Excel 文件。
    • 通过 Worksheets.get_Item(0) 获取第一个工作表。
    • 使用 AllocatedRange 获取已使用的单元格范围。
  2. 创建 Word 文档并添加表格

    • 创建 Document 实例,并使用 AddSection() 添加节。
    • 使用 AddTable() 添加表格。
  3. 复制 Excel 的表头到 Word

    • 使用 AddRow() 添加表头行。
    • 通过 AddCell().AddParagraph().AppendText() 填充表头文本。
  4. 复制 Excel 的数据行到 Word

    • 遍历 Excel 的数据行,使用 AddRow() 添加数据行。
    • 通过 Cells.get_Item(col).AddParagraph().AppendText() 填充单元格内容。
    • 如果单元格包含公式,则使用 FormulaValue,否则使用 Value
  5. 调整表格样式并保存 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)

结果
Python插入Excel表格数据到Word文档

复制Excel工作表数据及格式插入Word文档

我们也可以使用库中提供的类、属性和方法来复制Excel数据到Word文档的同时,将单元格格式及文本格式一起复制到Word文档中,从而实现高还原度地插入Excel表格到Word文档。我们需要使用库中提供的组件来新建方法实现上述操作。以下是操作步骤:

  1. 加载 Excel 文件

    • 创建 Workbook 实例,并使用 LoadFromFile() 读取 Excel 文件。
    • 获取第一个工作表 sheet
  2. 创建 Word 文档并设置页面方向

    • 创建 Document 实例,使用 AddSection() 添加节。
    • 设置页面方向为横向:section.PageSetup.Orientation = PageOrientation.Landscape
  3. 创建 Word 表格

    • 使用 AddTable(True) 创建表格。
    • 通过 ResetCells(sheet.LastRow, sheet.LastColumn) 设置表格的行数和列数。
  4. 执行合并单元格操作

    • 使用 merge_cells(sheet, table) 方法,遍历 Excel 中的合并单元格,并在 Word 中执行相应的合并操作。
  5. 复制 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 单元格。
  6. 保存 Word 文档

    • 使用 SaveToFile("output/CopyExcelDataStyleToWord.docx", FileFormat.Docx2019) 保存 Word 文件。
  7. 释放资源

    • 调用 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()

结果
Python复制Excel工作表数据及样式到Word文档

将Excel工作表作为OLE对象嵌入Word文档

我们还可以直接以OLE对象形式将Excel工作表嵌入到Word文档中,从而实现在Word文档中展示表格的同时,使表格拥有Excel的高级功能。在使用代码嵌入Excel工作表到Word文档时,需要先将Excel工作表保存为图像应用于Word文档中OLE对象的展示。当表格在Word文档中编辑或更新后,表格展示会自动更新为最新的数据。
以下是操作步骤:

  1. 定义文件路径

    • 定义 Excel 文件路径 excel_path 和输出 Word 文件路径 output_doc_path
    • 定义图像文件路径 image_path
  2. 创建 Word 文档并设置页面方向

    • 创建 Document 实例,使用 AddSection() 添加节。
    • 设置页面方向为横向:section.PageSetup.Orientation = PageOrientation.Landscape
    • 使用 AddParagraph() 添加段落。
  3. 载入 Excel 文件并获取工作表

    • 创建 Workbook 实例,并使用 LoadFromFile() 读取 Excel 文件。
    • 获取第一个工作表 sheet
  4. 将 Excel 表格转换为图像并保存

    • 使用 sheet.ToImage() 方法将工作表转换为图像,并保存为 image_path
  5. 创建并加载工作表图像

    • 创建 DocPicture 实例,并使用 LoadImage() 加载工作表图像。
  6. 将 OLE 对象(Excel 工作表)插入到 Word 文档

    • 使用 paragraph.AppendOleObject() 插入 Excel 工作表作为 OLE 对象,并将类型设置为 OleObjectType.ExcelWorksheet
    • 设置 OLE 对象不显示为图标:ole.DisplayAsIcon = False
  7. 保存 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以OLE对象形式插入Excel工作表到Word文档

本文演示如何使用Python将Excel表格插入到Word文中,包括插入数据、复制数据和样式以及以OLE对象形式插入三种形式。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2323670.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

合合信息TextIn大模型加速器 2.0来了:智能文档解析和图表解析能力全面升级

合合信息“TextIn大模型加速器 2.0”版本来了:文档解析和图表解析能力全面升级 背景 在日常工作中,我们常常遇到无法直接复制的文档内容或图片内容,这些内容通常需要进行识别和解析。一个典型的例子是,当我们需要将折线图转化为…

消息队列Message Queue

前面,我们在黑点点评中秒杀场景中,首次了解到消息队列MQ,它主要解决了秒杀场景中异步场景,提升了并发性,吞吐量。可是还是对消息队列又很多的疑惑? 消息队列是什么 消息队列是一种通信协议或中间件&#…

如何利用AI智能生成PPT提升工作效率

如何利用AI智能生成PPT提升工作效率?PPT制作曾经是每个人办公生活中的一大痛点。你有多久没有在制作PPT时感到焦头烂额,选模板、调整格式、插入图片,每一项都得花费大量的时间和精力,最后还未必能做出一份令人满意的效果。随着人工…

WIN11 企业版 部署Dify+Docker

Dify(Do it for you)是一款开源的大语言模型应用开发平台,旨在简化AI应用的创建、部署和管理过程,使开发者能够更快速、更轻松地构建和运营基于GPT等模型的AI应用。 Dify平台创建和运营一个AI chatbot应用,涉及到登录…

1.25-20GHz/500ns超快跳频!盛铂SWFA300国产捷变频频率综合器模块赋能雷达/5G/电子战高频精密控制 本振/频综模块

盛铂SWFA300捷变频频率综合器模块简述: 盛铂科技国产SWFA300捷变频频率综合器是一款在频率范围内任意两点频率的跳频时间在500nS以内的高速跳频源,其输出频率范围为1.25GHz至20GHz,频率的最小步进为10kHz。同时它拥有优秀的相位噪声特性&…

代理IP协议详解HTTP、HTTPS、SOCKS5分别适用于哪些场景

“代理IP协议在现代网络通信中扮演着至关重要的角色。它们通过提供中间层服务,帮助用户匿名访问网络、绕过地理限制、提高安全性和加速数据传输。HTTP、HTTPS和SOCKS5是三种最常见的代理IP协议,每种协议都有其特定的用途和适用场景。” HTTP代理及其适用…

AIGC工具平台-通用抠图换背景

本模块采用先进的大模型智能算法,精准识别并分割图像中的人物或物品主体,实现高效、精准、智能化的抠图处理。无论是人物肖像、产品展示,还是复杂场景,该工具均能准确提取主体,并自动适配至背景图像,实现自…

word快速创建虚拟文字

创建虚拟文字的作用:如培训新员工使用 Word,用虚拟文字演示如何设置段落格式。不需要你随便乱敲文字或者去复制一段文字过来。帮你节约了时间! 两个函数的使用必须在段落的开头!!! rand函数 在 Word 中…

win10下python脚本运行缺失ccache的问题处理

问题 python脚本运行时,会提醒参考 https://github.com/ccache/ccache/blob/master/doc/INSTALL.md 处理缺失ccache的问题。 下载编译 下载ccache主干版本, 例如 https://github.com/ccache/ccache/archive/refs/heads/master.zip 按照说明编译 mkd…

开发复合组件TLabel + TwwDBLookupCombo

老鸟跳过。。。。。。。。本文只是为小白准备的 -------------- TwwDBLookupCombo 组件是老牌控件包的 Inofpower 中的一个组件。Inofpower 很久也没有更新了,只是作了新版DELPHI的适配,组件的功能从D2007那些开始到现在,可以说几乎没有任何…

0328-内存图2

是否正确待定: Perso类 package com.qc.内存图2;public class Perso {public int age;public String name;public static int flag;public void m1() {}public static void m2() {}Overridepublic String toString() {return "Perso [age" age "…

【ESP32S3】esp32获取串口数据并通过http上传到前端

通过前面的学习(前面没发过,因为其实就是跑它的demo)了解到串口配置以及开启线程实现功能的工作流程,与此同时还有esp32作为STA节点,将数据通过http发送到服务器。 将这两者联合 其实是可以得到一个:esp32获…

《一本书讲透Elasticsearch:原理、进阶与工程实践》读书笔记

1:es的组成部分: Elasticsearch 引擎:核心组件,处理索引和搜索请求 Kibana:es的可视化的数据界面,用于分析和展示数据 Beats(可选)轻量级的日志采集器 2:基本概念 es开…

Android15查看函数调用关系

Android15 Camera3中打印函数调用栈 1.使用CallStack跟踪函数调用 修改涉及三个内容: Android.bp中添加对CallStack的引用。CallStack被打包在libutilscallstack.so。代码中包含CallStack的头文件。代码中调用CallStack接口,打印函数调用栈。 例子&am…

macOS 15 通过 MacPorts 安装 PHP 7 构建错误找不到符号在 dns.o 中解决方法

构建遇到的问题如下: "_res_9_dn_expand", referenced from:_php_parserr in dns.o_php_parserr in dns.o_php_parserr in dns.o_php_parserr in dns.o_php_parserr in dns.o_php_parserr in dns.o_zif_dns_get_mx in dns.o..."_res_9_dn_skipname&…

练习:猜数字小游戏

需求: 程序自动生成一个 1 - 100 之间的随机数字,使用程序实现猜出这个数字是多少? 代码: //猜数字小游戏 package demo01; import java.util.Random; import java.util.Scanner; public class HelloJava {public static void …

EMQX Dashboard

EMQX Dashboard EMQX理论基础 https://blog.csdn.net/liudachu/article/details/146495030 1 Dashboard简介 EMQX 提供了一个内置的管理控制台,即 EMQX Dashboard。方便用户通过 Web 页面就能轻松管理和监控 EMQX 集群,并配置和使用所需的各项功能。 访…

PC名词解释-笔记本的S0,S1,S2,S3,S4,S5状态

​🎓作者简介:程序员转项目管理领域优质创作者 💌个人邮箱:[2707492172qq.com] 🌐PMP资料导航:PM菜鸟(查阅PMP大纲考点) 💡座右铭:上善若水,水善利…

uniapp自定义目录tree(支持多选、单选、父子联动、全选、取消、目录树过滤、异步懒加载节点、v-model)vue版本

先看案例: 效果: 数据结构如下: const themeList ref([{id: 1,name: 内蒙古,children: [{id: 3,name: 街道1,children: [{id: 4,name: 小区1}]}]},{id: 2,name: 北京,children: [{id: 6,name: 街道2}]} ]) 参数配置: 属性名类…

ESP32S3 WIFI 实现TCP服务器和静态IP

一、 TCP服务器代码 代码由station_example_main的官方例程修改 /* WiFi station ExampleThis example code is in the Public Domain (or CC0 licensed, at your option.)Unless required by applicable law or agreed to in writing, thissoftware is distributed on an &q…