【Python3】通过模板实现PPT的自动生成

去年第一次接触了pptx-python,大致看了一下,没有做深入的探索。直到最近朋友有一堆ppt要做,因为样式比较单一,量有很大,想起来这个python包正好派上用场,花了一天的时间看了官方文档,无奈这英语水平还要继续努力啊。现在将所看所理解的整理如下:

PPTX官方文档

建立和打开一个pptx

最新更新的文档包已经可以支持建立和打开pptx,形式如下

presentation的基本模块
from pptx import Presentation

prs = Presentation()
slide_1 = prs.slides.add_slide(prs.slide_layouts[0])
print(prs.slide_height)#高度
print(prs.slide_layouts)#布局
print(prs.slide_master)#主布局
print(prs.slide_width)#宽度
print(prs.slides)#幻灯片

layouts有默认有多种,可以自己预先定义,推荐还是自己做好,可以通过slide_height和silde_width来查看幻灯片大小。

获取presentation的信息

可以通过core_properties这个模块查看文档信息,对于文档最后的整理和分类有一定作用。

from pptx import Presentation
prs = Presentation('Crew Drill 4.pptx')
core = prs.core_properties
print(core.author)
print(core.category)
print(core.comments)
print(core.content_status)
print(core.created)
print(core.identifier)
print(core.keywords)
print(core.language)
print(core.last_modified_by)
print(core.last_printed)
print(core.modified)
print(core.revision)
print(core.subject)
print(core.title)
print(core.version)

slides模块

slides就是ppt里面的幻灯片,他是一个集合,可以通过循环等方式取到单个slide操作,也可以添加新的幻灯片和获取幻灯片的信息。

from pptx import Presentation

#slides 是所有幻灯片的集合,可以用列表的形式表示
#slides功能有:get(slide_id),add_slide(slide_layout),index(slide)

prs = Presentation('Crew Drill 4.pptx')
print(prs.slides.get(1))#返回slide identified,搞不懂这是什么识别码在哪里
slide_1 = prs.slides.add_slide(prs.slide_layouts[0])#增加幻灯片
slide_3 = prs.slides[0]#列表分解
print(prs.slides.index(slide_3))#取index

单个slide和layouts操作

#slide模块


from pptx import Presentation

prs = Presentation('Crew Drill 4.pptx')
slide_1 = prs.slides[0]
#background搞不懂
print(help(slide_1.background))
print(slide_1.background)

print(slide_1.element)
print(slide_1.follow_master_background)
print(slide_1.has_notes_slide)
print(slide_1.name)
print(slide_1.notes_slide)
print(slide_1.placeholders)
print(slide_1.shapes)
print(slide_1.slide_id)
print(slide_1.slide_layout)
#slidelayouts 模块

from pptx import Presentation

prs = Presentation()
slide_layout_4 = prs.slide_layouts[4]
print(slide_layout_4.placeholders)#获取此布局中的占位符
print(slide_layout_4.shapes)#获取此布局中的形状
print(slide_layout_4.slide_master)#获取此布局中的master母板
print(slide_layout_4.used_by_slides)#这个不知道是啥

slide和layouts模块用的最多的主要还是获取slide的shape,然后进行操作,作者试了一下如果大量工作可以做循环,但是ppt中命名很混乱,建议自己先做母板调整后再获取会更高效。

shapes模块

shapes模块应该是最重要,使用最频繁的模块了 。slideshapes模块.shapes包含:

auto shape:预设的形状,各种图形,包括文本框
picture:图片一旦添加就是一种特殊的auto shape
graphic frame:指一些table,chart和艺术画
group shape:组合图形
line/connector:连接符,例如直线,曲线,折现等等
content part:其他的内容,不知道什么意思

presentation提供了多种单位。presentation使用的是EMU
1 inche = 914400 EMU
python提供了多种单位供使用,比如inches,Pt,Cm


from pptx import Presentation
from pptx.chart.data import CategoryChartData
from pptx.enum.shapes import MSO_AUTO_SHAPE_TYPE
from pptx.enum.shapes import MSO_CONNECTOR_TYPE
from pptx.enum.chart import XL_CHART_TYPE
from pptx.util import Inches,Cm,Pt
from pptx.enum.text import PP_PARAGRAPH_ALIGNMENT

shape添加一个图表,需要导入pptx.chart.data和pptx.enum.chart模块
shape添加一个auto-shape,导入 MSO_AUTO_SHAPE_TYPE
shape添加connector,导入MSO_CONNECTOR_TYPE
shape使用单位,导入pptx.util模块
shape文本对齐,是使用PP_PARAGRAPH_ALIGNMENT

prs = Presentation('hello_ppt.pptx')
slide_1 = prs.slides[0]
from pptx.dml.color import RGBColor

#add_chart添加图表功能
type = XL_CHART_TYPE.COLUMN_CLUSTERED
x,y,cx,cy = Inches(2),Inches(2),Inches(6),Inches(4.5)
chart_data = CategoryChartData()
chart_data.categories = ['East','West','Midwest']
chart_data.add_series('Series 1',(19.2,21.4,16.7))

slide_1.shapes.add_chart(type,x,y,cx,cy,chart_data)

添加一个图表


#add_connector添加连接线功能

connector_type = MSO_CONNECTOR_TYPE.ELBOW
connector = slide_1.shapes.add_connector(
    connector_type,Cm(2),Cm(2),Cm(10),Cm(10)
)

添加一个连接线

#add_picture插入图片功能
image_file = 'picture_1.jpg'
left,top = Cm(0),Cm(0)
width,height = Cm(25.4),Cm(19.0)
picture = slide_1.shapes.add_picture(image_file,left,top,width,height)
#增加一个auto shape
slide_1.shapes.add_shape(
   MSO_AUTO_SHAPE_TYPE.ROUNDED_RECTANGLE,
    Cm(2),Cm(2),Cm(2),Cm(2)
)
# 长度单位换算
length = Inches(1)
print(length)
print(length.inches,length.cm,length.pt)
fill = slide_1.shapes[2].fill
fill.solid()#实心填充
fill.fore_color.rgb = RGBColor(255,0,0)

shape的填充现在貌似还不是很完善,填充之前要选择填充的类型

for shape in slide_1.shapes:
    print(shape.is_placeholder)
print(slide_1.placeholders[0].name)
print(slide_1.shapes.title)
subtitle = slide_1.placeholders[1].placeholder_format.type
# 添加文本
text_frame = slide_1.shapes[0].text_frame
text_frame.clear()
text_frame.paragraphs[0].text = 'hello_world'#paragraphs是一个truple,现在没有元素,填写第一个元素,所有要用0
text_frame.add_paragraph().text = 'hello_hangzhou'#add_paragraph是text_frame的,填完就是paragraph的第2个元素
text_frame.paragraphs[0].add_run().text = 'fuck the world'
print(text_frame.paragraphs[1].text)
print(text_frame.paragraphs[0].text)

ppt_title = slide_1.shapes[0].text_frame
sub_title = slide_1.shapes[1].text_frame
ppt_title.clear()
sub_title.clear()
ppt_title.paragraphs[0].text = '办公自动化'
sub_title.paragraphs[0].text = 'python-pptx使用详解'

#段落编辑
ppt_title.paragraphs[0].alignment = PP_PARAGRAPH_ALIGNMENT.LEFT
sub_title.paragraphs[0].alignment = PP_PARAGRAPH_ALIGNMENT.CENTER

#字体编辑
ppt_title.paragraphs[0].font.name = '微软雅黑'
ppt_title.paragraphs[0].font.size = Pt(70)
ppt_title.paragraphs[0].font.bold = True
ppt_title.paragraphs[0].font.italic = True
ppt_title.paragraphs[0].font.color.rgb = RGBColor(255,0,0)

sub_title.paragraphs[0].font.name = '微软雅黑'
sub_title.paragraphs[0].font.size = Pt(40)
sub_title.paragraphs[0].font.bold = False
sub_title.paragraphs[0].font.italic = False
sub_title.paragraphs[0].font.color.rgb = RGBColor(255,255,0)
#保存ppt
prs.save('hello_ppt.pptx')

你可能感兴趣的:(Python)