办公自动化之pptx-python详解

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

建立和打开一个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')
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,039评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,223评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,916评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,009评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,030评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,011评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,934评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,754评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,202评论 1 309
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,433评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,590评论 1 346
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,321评论 5 342
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,917评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,568评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,738评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,583评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,482评论 2 352

推荐阅读更多精彩内容

  • 上周,一朋友找我帮忙将他手里的练习题word文档做成ppt,要有动画效果,即按一下才显示答案那种,他要在课堂上讲。...
    paulye阅读 16,835评论 2 11
  • 一句话概括本文: 灵感来自于5.15锤子鸟巢发布会上老罗用闪念胶囊一键生成了32张PPT,原理利用Python-p...
    coder_pig阅读 1,631评论 3 4
  • 最喜欢在下雨的时候坐在车上 看淅淅沥沥的雨落在车窗 看行人狼狈的彷徨 看路过的繁华都模糊了模样 最喜欢在夜深的时候...
    VCWLEU阅读 249评论 0 0
  • 现在是 2018 年春节刚过,对自己在 2017 年 11月之后的所做及所想做个反思。为什么是 11 月之后呢?因...
    刘员外__阅读 450评论 3 3
  • 锦州御牌食品有限公司成立于2011年5月,位于锦州经济技术开发区(国家级开发区)天王路二段99号,南观渤海、北接繁...
    锦州御烧烤阅读 156评论 0 0