查看: 233|回复: 0

Python生成PPT:Spire.Presentation实践

[复制链接]
发表于 2 小时前 | 显示全部楼层 |阅读模式
在自动化报表、产品宣讲和批量客户提案中,常见需求不是打开现成PPT微调,而是由脚本直接生成整套幻灯片。Spire.Presentation for Python把演示文稿、幻灯片、形状、文本、表格封装成Python对象,适合把建文档、加页面、填内容、存文件纳入数据处理流水线。原文以该库为例覆盖了从空白演示文稿到文本、形状、图片和表格的写入流程;下面按实际编码顺序重组这些操作,并说明参数含义、对象关系和批量生成时容易忽略的细节。

一、环境准备
安装命令:
pip install spire.presentation
脚本顶部导入:
from spire.presentation.common import *
import math
from spire.presentation import *
其中common模块提供RectangleF、Color、TextFont、TextParagraph等常用类型,math用于坐标取整,presentation模块提供Presentation、ShapeType、FileFormat等核心对象。原文示例使用math.trunc计算居中位置,避免浮点坐标直接传入。

二、创建演示文稿并写入标题
Presentation()新建空白演示文稿,默认自带一张幻灯片,因此presentation.Slides[0]可直接取第一页。Shapes.AppendShape(ShapeType.Rectangle, rect)在指定矩形区域放置图形,通常作文本框使用;RectangleF.FromLTRB(left, top, right, bottom)用左、上、右、下四个坐标定义区域。AppendTextFrame()写入文字后,TextFrame.TextRange成为整段文字的样式入口:Fill.SolidColor.Color设置颜色,FontHeight设置字号(单位为磅),LatinFont设置字体。SaveToFile()的第二个参数指定输出格式,FileFormat.Pptx2010对应.pptx;最后用Dispose()释放底层资源。以下代码生成一张只含标题的幻灯片:
  1. from spire.presentation.common import *
  2. import math
  3. from spire.presentation import *
  4. outputFile = 'HelloWorld.pptx'
  5. presentation = Presentation()
  6. left = math.trunc(presentation.SlideSize.Size.Width / 2) - 250
  7. rect = RectangleF.FromLTRB(left, 80, left + 500, 230)
  8. shape = presentation.Slides[0].Shapes.AppendShape(ShapeType.Rectangle, rect)
  9. shape.ShapeStyle.LineColor.Color = Color.get_White()
  10. shape.Fill.FillType = FillFormatType.none
  11. shape.AppendTextFrame('Hello World!')
  12. textRange = shape.TextFrame.TextRange
  13. textRange.Fill.FillType = FillFormatType.Solid
  14. textRange.Fill.SolidColor.Color = Color.get_CadetBlue()
  15. textRange.FontHeight = 66
  16. textRange.LatinFont = TextFont('Lucida Sans Unicode')
  17. presentation.SaveToFile(outputFile, FileFormat.Pptx2010)
  18. presentation.Dispose()
复制代码
代码中shape.ShapeStyle.LineColor.Color = Color.get_White()和shape.Fill.FillType = FillFormatType.none用于去掉默认边框与填充,让文本框透明;textRange.Fill.FillType = FillFormatType.Solid则把文字设为实色填充,再配合SolidColor.Color指定颜色。

三、多段文本与样式控制
真实幻灯片通常有标题和正文。Spire.Presentation使用TextParagraph表示段落,每个段落可单独设置Alignment、LineSpacing、字体、字号和颜色,再通过shape.TextFrame.Paragraphs.Append(para)挂到文本框。TextRanges[0]控制该段首个文本区间;Alignment支持TextAlignmentType.Center、Left、Right等;LineSpacing = 150表示1.5倍行距(按百分比计算)。原文示例在同一页创建一个居中大标题和一个左对齐正文,两个文本框分层叠加、互不干扰。实际编码时可以把标题和正文拆成两个AppendShape调用,分别设置段落样式,避免把不同对齐方式的文字塞进同一个TextParagraph。

四、形状、图片和表格的对象操作
形状:AppendShape同样用于添加形状;把Fill.FillType设为FillFormatType.Solid,再用Fill.SolidColor.Color = Color.get_Yellow()设置实色填充;边框通过Line控制,Line.FillType = FillFormatType.Solid配合Line.SolidFillColor.Color = Color.get_Gray()设置灰色实线。ShapeType还支持圆角矩形、椭圆、星形等预设图形,颜色统一用Color.get_XXX()静态方法获取。
图片:slide.Shapes.AppendEmbedImageByPath(ShapeType.Rectangle, 'Logo1.png', rect)把本地图片嵌入指定矩形区域。这里的嵌入意味着图片二进制数据直接写入.pptx文件内部,分享文件时不依赖外部图片路径;将image.Line.FillType设为FillFormatType.none可去掉默认矩形边线,让图片边缘保持干净。
表格:slide.Shapes.AppendTable(x, y, widths, heights)用列宽数组和行高数组定义表格尺寸;table[列, 行]索引单元格,示例中table[j, i]对应第j列第i行,因此填充循环要按列、行顺序理解。table[j, i].TextFrame.Text写入内容,table[j, i].TextFrame.Paragraphs[0].TextRanges[0].LatinFont设置字体,table.StylePreset = TableStylePreset.LightStyle3Accent1应用内置样式。页面元素渲染遵循后添加者在上层的原则,所以标题、分隔条、Logo和表格的添加顺序会影响遮挡关系。

五、综合示例:产品介绍页
把标题、强调色块、Logo和规格表格组合到同一页,可以形成一份可实际使用的产品介绍幻灯片。下面的代码保留了原文的坐标、颜色、表格数据和输出格式:
  1. from spire.presentation.common import *
  2. import math
  3. from spire.presentation import *
  4. outputFile = 'ProductIntro.pptx'
  5. presentation = Presentation()
  6. slide = presentation.Slides[0]
  7. title_shape = slide.Shapes.AppendShape(ShapeType.Rectangle, RectangleF.FromLTRB(50, 60, 670, 150))
  8. title_shape.Fill.FillType = FillFormatType.none
  9. title_shape.ShapeStyle.LineColor.Color = Color.get_White()
  10. title_para = TextParagraph()
  11. title_para.Text = '智能音箱 X1 产品介绍'
  12. title_para.Alignment = TextAlignmentType.Center
  13. title_para.TextRanges[0].LatinFont = TextFont('Arial')
  14. title_para.TextRanges[0].FontHeight = 40
  15. title_para.TextRanges[0].Fill.FillType = FillFormatType.Solid
  16. title_para.TextRanges[0].Fill.SolidColor.Color = Color.get_Black()
  17. title_shape.TextFrame.Paragraphs.Append(title_para)
  18. accent = slide.Shapes.AppendShape(ShapeType.Rectangle, RectangleF.FromLTRB(50, 165, 670, 185))
  19. accent.Fill.FillType = FillFormatType.Solid
  20. accent.Fill.SolidColor.Color = Color.get_CadetBlue()
  21. accent.Line.FillType = FillFormatType.none
  22. left = math.trunc(presentation.SlideSize.Size.Width / 2) - 280
  23. logo = slide.Shapes.AppendEmbedImageByPath(ShapeType.Rectangle, 'Logo1.png', RectangleF.FromLTRB(left, 170, 260 + left, 230))
  24. logo.Line.FillType = FillFormatType.none
  25. widths = [200, 400]
  26. heights = [30, 30, 30]
  27. table = slide.Shapes.AppendTable(math.trunc(presentation.SlideSize.Size.Width / 2) - 300, 320, widths, heights)
  28. specs = [['项目', '参数'], ['续航', '约 12 小时'], ['连接方式', 'Wi-Fi / 蓝牙 5.0']]
  29. for i in range(0, 3):
  30.     for j in range(0, 2):
  31.         table[j, i].TextFrame.Text = specs[i][j]
  32.         table[j, i].TextFrame.Paragraphs[0].TextRanges[0].LatinFont = TextFont('Arial')
  33. table.StylePreset = TableStylePreset.LightStyle3Accent1
  34. presentation.SaveToFile(outputFile, FileFormat.Pptx2013)
  35. presentation.Dispose()
复制代码
这段代码把静态数据换成接口返回的数据或配置文件内容后,就可以批量产出规范统一的产品宣讲页。关键点不在单个API调用,而在对象层级:Presentation管文件,Slides管页面,Shapes管页面元素,TextFrame/Paragraphs/TextRanges管文字样式,Table的索引顺序管单元格定位。

六、多页扩展与批量生成注意事项
默认演示文稿只有Slides[0]。需要多页时调用presentation.Slides.Append()在末尾追加空白页,再通过索引继续添加内容。幻灯片坐标以左上角为原点,水平居中可用math.trunc(presentation.SlideSize.Size.Width / 2) - 偏移量计算,比硬编码坐标更稳健,也更容易适配不同画布尺寸。输出格式方面,SaveToFile的第二个参数可选FileFormat.Pptx2010或FileFormat.Pptx2013,应根据目标读者的Office版本选择,原文指出这可有效避免兼容性提示。批量生成时及时调用Dispose()释放底层资源;把数据源替换为数据库查询或API结果,就能把演示文稿生成接入报表、周报和客户提案流水线。图片采用嵌入方式会随文档一起保存,不依赖外部路径;表格索引顺序、元素层叠顺序和透明文本框设置则是代码实现中最容易影响最终排版效果的细节。
回复

使用道具 举报

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

本版积分规则

指导单位

江苏省公安厅

江苏省通信管理局

浙江省台州刑侦支队

DEFCON GROUP 86025

Hacking Group 021A

旗下站点

态势感知中心

应急响应中心

红盟安全

联系我们

官方QQ群:112851260

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

官方核心成员

关注微信公众号

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

GMT+8, 2026-10-21 13:53 , Processed in 0.023722 second(s), 18 queries , Gzip On, Redis On.

Powered by ihonker.com

Copyright © 2015-现在.

  • 返回顶部