使用 Python 快速在 PowerPoint 中生成表格【教程】

表格是 PPT 里呈现结构化信息最直观的方式------季度业绩对比、项目进度汇总、参数清单罗列,一页表格往往胜过几页文字。手工在 PowerPoint 里插入并调整表格并不难,但当你需要根据数据库里的数据动态生成汇报材料,或者在几十份模板文件里批量更新表格内容时,手工操作就成了瓶颈。

这件事的解决思路和 Word、Excel 一样:把"建表、填数、调结构"交给程序。而且实际做汇报时你会发现,表格的结构经常处于变动中------数据多了一行要补,某个维度不要了要删。所以本文除了介绍如何从零生成表格并填充数据,还会一并讲清如何向已有表格添加行、在任意位置插入行和列 ,以及删除指定的行与列、微调行高列宽。掌握这条完整链路,"数据变一变、表格跟着变"的自动化汇报就水到渠成了。

环境准备

本文使用 Spire.Presentation for Python,它把幻灯片上的表格抽象为 ITable 对象,行列结构对应 TableRows 与 ColumnsList 两个集合,增删改都围绕这两个集合展开。通过以下命令安装:

bash 复制代码
pip install Spire.Presentation

安装完成后,同时导入 spire.presentation 与 spire.presentation.common 两个模块即可开始使用。

创建表格并填充数据

创建表格的核心是 AppendTable 方法:它接收表格左上角坐标、每列宽度列表和每行高度列表,返回一个 ITable 对象。宽高列表的长度直接决定了表格有几列几行------这一点与 Excel"先框选区域再调整"的习惯不同,属于声明式建表,行列规模在一开始就定好了。

表格创建后,通过 table[列, 行] 的下标访问每个单元格。注意顺序是先列后行 ,与直觉上的"先行后列"相反,写反了会把数据填到错误的位置。给单元格写文字要落到 TextFrame.Text 属性上,因为每个单元格内部其实是一个文本框。

下面的例子创建一张 5 列 3 行的表格,填充国家信息数据,并为所有单元格设置字体:

python 复制代码
import math
from spire.presentation.common import *
from spire.presentation import *

presentation = Presentation()

# 5 个列宽、3 个行高,决定了表格的规模
widths = [100, 100, 150, 100, 100]
heights = [30, 30, 30]

# 在幻灯片上创建表格,返回 ITable 对象
left = math.trunc(presentation.SlideSize.Size.Width / float(2)) - 275
table = presentation.Slides[0].Shapes.AppendTable(left, 90, widths, heights)

# 填充数据:已将英文修改为中文
dataStr = [
    ["国家", "首都", "所属大洲", "面积 (km²)", "人口"],
    ["加拿大", "渥太华", "北美洲", "9976147", "26500000"],
    ["墨西哥", "墨西哥城", "北美洲", "1967180", "88600000"],
]

for i in range(0, len(dataStr)):
    for j in range(0, 5):
        table[j, i].TextFrame.Text = dataStr[i][j]
        # 设置单元格的字体为中文字体(如微软雅黑),防止中文乱码或方框
        table[j, i].TextFrame.Paragraphs[0].TextRanges[0].LatinFont = TextFont("Microsoft YaHei")

# 一键套用内置表格样式
table.StylePreset = TableStylePreset.LightStyle3Accent1

presentation.SaveToFile("/output/CreateTable.pptx", FileFormat.Pptx2010)
presentation.Dispose()

几个细节值得展开:left 的算式用幻灯片总宽减去表格总宽的一半,让表格水平居中;单元格文字模型是"段落 → 文本范围"两级结构,所以设置字体要走 Paragraphs[0].TextRanges[0].LatinFont 这条路径,这是 Spire.Presentation 一贯的写法;StylePreset 只需一个 TableStylePreset 枚举值,就能套用一整套配色、边框和底纹,比逐条设置省事得多。

让表头更醒目:对齐设置

表头是表格的阅读入口,把它居中或加粗是最常见的润色动作。做法与填数据类似:遍历第一行(行下标 0)的每个单元格,修改其段落的对齐方式。

python 复制代码
# 第一行的 5 个单元格全部居中
for i in range(0, 5):
    table[i, 0].TextFrame.Paragraphs[0].Alignment = TextAlignmentType.Center

TextAlignmentType.Center 之外还有左对齐、右对齐等枚举值可选。如果想进一步放大表头字号或改颜色,同样通过 Paragraphs[0].TextRanges[0] 上的字体属性处理,与上一节设置 LatinFont 是同一条路径。

向已有表格添加行

很多场景下表格不是新建的,而是已经躺在模板文件里。这时添加行的思路是"先取一行作样板,克隆到表尾,再改写内容":TableRows.Append(row) 会把这一行追加到集合末尾。

获取已有表格有两种方式:表格位置固定时可以直接按索引取 Shapes[0];更稳妥的是遍历形状集合并用 isinstance(shape, ITable) 判断,这样无论表格排在第几个位置都能找到。

python 复制代码
from spire.presentation.common import *
from spire.presentation import *

presentation = Presentation()
# 加载你之前保存的表格文件路径
presentation.LoadFromFile("/output/CreateTable.pptx")

# 遍历形状集合,找到表格对象
table = None
for shape in presentation.Slides[0].Shapes:
    if isinstance(shape, ITable):
        table = shape

# 取第二行作为新行的样板
row = table.TableRows[1]
# 克隆并追加到表格末尾
table.TableRows.Append(row)

# 定位新追加的行,写入对应的中文内容
rowCount = table.TableRows.Count
lastRow = table.TableRows[rowCount - 1]
lastRow[0].TextFrame.Text = "中国"
lastRow[1].TextFrame.Text = "北京"
lastRow[2].TextFrame.Text = "亚洲"
lastRow[3].TextFrame.Text = "9600000"
lastRow[4].TextFrame.Text = "1400000000"

# 借鉴 Demo 的思路:使用 table.ColumnsList 循环遍历新添加的行
for j, _ in enumerate(table.ColumnsList):
    # 设置单元格的字体为中文字体(如微软雅黑),防止中文乱码
    lastRow[j].TextFrame.TextRange.LatinFont = TextFont("Microsoft YaHei")

presentation.SaveToFile("/AddRowToTable.pptx", FileFormat.Pptx2013)
presentation.Dispose()

最重要的一步是:直接 Append 把第二行复制到最后,新行会自动继承原有的行高、背景色和边框。等行加上了,再用 Count - 1 找到它,把新字填进去就行。

在任意位置插入行与列

Append 只能把内容加在末尾,而实际制作 PPT 表格时新数据经常需要插在中间------比如在特定位置插入一行。这时用 Insert 方法,它可以把某一行克隆后插入到指定下标处(例如 Insert(3, row) 表示插到下标 3 的位置,原位置及其后的行会整体后移)。

python 复制代码
import math
from spire.presentation.common import *
from spire.presentation import *

presentation = Presentation()

widths = [110, 110, 110]
heights = [50, 30, 30, 30, 30]
table = presentation.Slides[0].Shapes.AppendTable(
    math.trunc(presentation.SlideSize.Size.Width / float(2)) - 275, 90, widths, heights)

# 1. 填充初始的中文内容
table[0, 0].TextFrame.Text = "产品分类"
table[1, 0].TextFrame.Text = "第一季度"
table[2, 0].TextFrame.Text = "第二季度"

table[0, 1].TextFrame.Text = "智能手机"
table[1, 1].TextFrame.Text = "1200"
table[2, 1].TextFrame.Text = "1500"

# 2. 克隆与插入操作
# 把第一行克隆到表尾
table.TableRows.Append(table.TableRows[0])
# 把第二行插入到第 4 行的位置(索引为 3)
table.TableRows.Insert(3, table.TableRows[1])

# 3. 统一设置全表字体为微软雅黑(直接赋值,避开条件判断报错)
for i, _ in enumerate(table.ColumnsList):
    for j, _ in enumerate(table.TableRows):
        table[i, j].TextFrame.TextRange.LatinFont = TextFont("Microsoft YaHei")

presentation.SaveToFile("/output/CloneRowAndColumn.pptx", FileFormat.Pptx2010)
presentation.Dispose()

行与列各有一套平行的方法:行用 TableRows 的 Append / Insert,列用 ColumnsList 的 Add / Insert。插入的行或列会带上原有的样式与宽度设置------用这套方法复制结构,比手动去调整格式省事得多。最后,配合循环统一为全表指定中文字体(如微软雅黑),就能防止中文乱码。

删除指定的行与列

有加就有减。删除走的是 RemoveAt 方法,行和列各对应一个:TableRows.RemoveAt 删行,ColumnsList.RemoveAt 删列,下标都从 0 开始。

python 复制代码
from spire.presentation.common import *
from spire.presentation import *

presentation = Presentation()
presentation.LoadFromFile("RemoveRowsAndColumns.pptx")

table = None
for shape in presentation.Slides[0].Shapes:
    if isinstance(shape, ITable):
        table = shape

        # 删除第二列
        table.ColumnsList.RemoveAt(1, False)
        # 删除第二行
        table.TableRows.RemoveAt(1, False)

presentation.SaveToFile("RemoveRowsAndColumns.pptx", FileFormat.Pptx2010)
presentation.Dispose()

两个 RemoveAt 都接收"下标 + 布尔值"两个参数,示例沿用 demo 的写法传入 False 即可满足常规删除需求。删除后,右侧的列与下方的行会自动前移补位,不需要挪动其余内容。需要批量删除时要注意:每删一次,后续元素的下标都会变,从后往前倒序删除更安全。

微调行高与列宽

行列结构确定后,尺寸还可以逐项微调。TableRows 的每个元素有 Height 属性,ColumnsList 的每个元素有 Width 属性,直接赋值即可:

python 复制代码
# 逐行设置高度
table.TableRows[0].Height = 100
table.TableRows[1].Height = 80

# 逐列设置宽度
table.ColumnsList[0].Width = 60
table.ColumnsList[1].Width = 80

这一能力与建表时的 widths、heights 列表相呼应:建表时的列表给出初始尺寸,后续任何一行一列都能单独改。比如数据行等高、汇总行加高突出,用几行赋值就能完成。

实用技巧

  • 定位表格优先遍历 Shapes :用 isinstance(shape, ITable) 找表格,比写死 Shapes[0] 更能适应模板内容的增删变动。
  • 先做一行"标准样板"再克隆 :Append / Insert 传入已有行(列)时,新行(列)自动继承样式与尺寸,这是扩展表格最高效的方式。
  • 单元格下标是 [列, 行] :table[j, i] 中第一个是列、第二个是行。写反不会报错但会静默填错位置,建议外层循环行、内层循环列并加注释。
  • 样式交给 StylePreset:内置几十种预设样式,一个枚举值统一整套配色;确有特殊需求时再对单个单元格覆盖。
  • 改完记得 Dispose() :Presentation 对象用完调用 Dispose() 释放资源,批量处理多份文件时尤其重要。

总结

在 PowerPoint 中处理表格的核心逻辑其实很直观:先通过设定位置和行列尺寸搭建好表格骨架,再往各个单元格中精准填充文字内容并处理好字体排版。如果表格规模需要动态调整,我们可以灵活地在任意位置追加、插入或删除行列,并通过微调宽高和套用内置样式来确保视觉效果。在此基础之上,只要把数据源换成数据库查询结果或 CSV 文件,并配合循环批量生成,就能顺理成章地搭建起一条自动生成汇报 PPT 的完整链路,让演示文稿里的表格始终与最新数据保持同步。

相关推荐
夜晚回家1 小时前
Python 身份运算符详解 | is 与 == 到底差在哪
python
fengye2071611 小时前
cpython框架结构
python
用户91294046848421 小时前
大模型返回 JSON 后,先过这道 Python 校验
python
Dmz丶2 小时前
前端转 AI 100 天 Day 32:LLM 客户端工程化——重试、超时、降级、限流
python
曲径海盗2 小时前
【Python 学习第 39 天】for 循环
python·学习笔记·编程入门
万联WANFLOW2 小时前
Kimi K3.1 Pro 接口接入指南:模型选型、费用计算与零数据保留
java·spring boot·python·安全·spring·大模型
问心无愧05133 小时前
[护网杯 2018]easy_tornado
python·tornado
全栈弄潮儿3 小时前
Python实战第13期:模块与包
后端·python·编程语言
2401_885885044 小时前
芬兰语音通知接口怎样对接?语音提醒接入流程
android·前端·python·php·语音识别