作者:超级大洋葱806
https://tangxing./article/details/109568830
1.PPT自动化能干什么?有什么优势?
它可以代替你自动制作PPT
它可以减少你调整用于调整PPT格式的时间
它可以让数据报告风格一致
总之就是:它能提高你的工作效率!让你有更多时间去做其他事情!
2.使用win32com操作ppt
官方文档:/zh-cn/office/vba/api/powerpoint.shape.copy
2.1 pip安装win32com
pipinstallpypiwin32
由于我已经安装过了,这里提示已经安装
2.2 win32com复制ppt模板
有时候我们需要对ppt的模板进行复制,然后再添加相应内容,由于python-pptx对复制模板也没有很好的支持(我没找到~忧伤),所以我们用win32com对模板页进行复制,然后再用python-pptx增加ppt内容。
参考官方文档:/zh-cn/office/vba/api/powerpoint.slide.copy
先准备好一张模板:2.2 win32 ppt测试.pptx
示例代码:
importwin32comfromwin32com.clientimportDispatchimportosppt=Dispatch('PowerPoint.Application')#或者使用下面的方法,使用启动独立的进程:#ppt=DispatchEx('PowerPoint.Application')#如果不声明以下属性,运行的时候会显示的打开wordppt.Visible=1#后台运行ppt.DisplayAlerts=0#不显示,不警告#创建新的PowerPoint文档#pptSel=ppt.Presentations.Add()#打开一个已有的PowerPoint文档pptSel=ppt.Presentations.Open(os.getcwd()+"\\"+"2.2win32ppt测试.pptx")#复制模板页pptSel.Slides(1).Copy()#设置需要复制的模板页数pageNums=10#粘贴模板页foriinrange(pageNums):pptSel.Slides.Paste()#pptSel.Save()#保存pptSel.SaveAs(os.getcwd()+"\\"+"win32_copy模板.pptx")#另存为pptSel.Close()#关闭PowerPoint文档ppt.Quit()#关闭office
效果如下:
3.python-pptx 创建PPT、复制页面
官方文档:https://python-pptx.readthedocs.io/en/latest/
3.1 pip安装python-pptx
安装方法:
pipinstallpython-pptx
我已经安装过了,故提示已经安装
3.2 python-pptx 复制页面
使用python-pptx进行复制没有找到合适的方法,有以下两种解决办法:
使用win32com对ppt模板进行复制
增加模板ppt数量,然后使用python-pptx对不需要的模板页进行删减操作
3.3 python-pptx 删除页面
python-pptx 多页待删除模板.pptx:
示例代码:
frompptximportPresentation#删除某一页pptdefdel_slide(prs,index):slides=list(prs.slides._sldIdLst)prs.slides._sldIdLst.remove(slides[index])#3.3python-pptx删除页面deffun3_3():#打开pptppt=Presentation('python-pptx多页待删除模板.pptx')#获取所有页slides=ppt.slidesnumber_pages=len(slides)print("删除前ppt一共",number_pages,"页面")#设置需要删除的页面数量delPageNums=3#进行删除操作(每次都删除第一张ppt)forindexinrange(delPageNums):del_slide(ppt,0)#再次获取所有页slides=ppt.slidesnumber_pages=len(slides)print("删除后ppt一共",number_pages,"页面")ppt.save('python-pptx多页已删除模板.pptx')print('生成完毕')if__name__=='__main__':fun3_3()
执行效果:
3.4 新建页面
示例代码:
frompptximportPresentation#新建pptppt=Presentation()#新建页面slide=ppt.slides.add_slide(ppt.slide_layouts[0])#保存pptppt.save('新建ppt.pptx')
效果如下:
4.python-pptx 插入文字、表格、形状并设置样式
模板ppt:
接下来,我们就在此模板上进行我们的操作演示
4.1 python-pptx 添加文字并设置样式
4.1.1 添加单行文字与多行文字
示例代码:
frompptximportPresentationfrompptx.utilimportPt,Cm#打开已存在pptppt=Presentation('4.python-pptx操作模板.pptx')#设置添加到当前ppt哪一页n_page=0singleLineContent="我是单行内容"multiLineContent=\"""我是多行内容1我是多行内容2我是多行内容3"""#获取需要添加文字的页面对象slide=ppt.slides[n_page]#添加单行内容#设置添加文字框的位置以及大小left,top,width,height=Cm(16.9),Cm(1),Cm(12),Cm(1.2)#添加文字段落new_paragraph1=slide.shapes.add_textbox(left=left,top=top,width=width,height=height).text_frame#设置段落内容new_paragraph1.paragraphs[0].text=singleLineContent#设置文字大小new_paragraph1.paragraphs[0].font.size=Pt(15)#添加多行#设置添加文字框的位置以及大小left,top,width,height=Cm(16.9),Cm(3),Cm(12),Cm(3.6)#添加文字段落new_paragraph2=slide.shapes.add_textbox(left=left,top=top,width=width,height=height).text_frame#设置段落内容new_paragraph2.paragraphs[0].text=multiLineContent#设置文字大小new_paragraph2.paragraphs[0].font.size=Pt(15)#保存pptppt.save('4.1添加文字.pptx')
效果如下:
4.1.2 设置文字框样式与文字样式
示例代码:
frompptximportPresentationfrompptx.utilimportPt,Cmfrompptx.dml.colorimportRGBColorfrompptx.enum.textimportMSO_VERTICAL_ANCHOR,PP_PARAGRAPH_ALIGNMENTfrompptx.enum.textimportPP_ALIGN#打开已存在pptppt=Presentation('4.python-pptx操作模板.pptx')#获取需要添加文字的页面对象slide=ppt.slides[0]#设置添加文字框的位置以及大小left,top,width,height=Cm(16.9),Cm(1),Cm(12),Cm(1.2)#添加文字框slide.shapes.add_textbox(距离左边,距离顶端,宽度,高度)textBox=slide.shapes.add_textbox(left=left,top=top,width=width,height=height)#调整文本框背景颜色textBoxFill=textBox.filltextBoxFill.solid()#纯色填充textBoxFill.fore_color.rgb=RGBColor(187,255,255)#文本框边框样式调整line=textBox.lineline.color.rgb=RGBColor(0,255,0)line.width=Cm(0.1)#获取文本框对象tf=textBox.text_frame#文本框样式调整tf.margin_bottom=Cm(0.1)#下边距tf.margin_left=0#左边距tf.vertical_anchor=MSO_VERTICAL_ANCHOR.BOTTOM#对齐文本方式:底端对齐tf.word_wrap=True#文本框的文字自动对齐#设置内容tf.paragraphs[0].text='这是一段文本框里的文字'#字体样式调整tf.paragraphs[0].alignment=PP_ALIGN.CENTER#对齐方式tf.paragraphs[0].font.name='微软雅黑'#字体名称tf.paragraphs[0].font.bold=True#是否加粗tf.paragraphs[0].font.italic=True#是否斜体tf.paragraphs[0].font.color.rgb=RGBColor(255,0,0)#字体颜色tf.paragraphs[0].font.size=Pt(20)#字体大小#保存pptppt.save('4.1.2设置文字框与字体样式.pptx')
效果如下:
代码详解
添加文本框
#添加文字框slide.shapes.add_textbox(距离左边,距离顶端,宽度,高度)textBox=slide.shapes.add_textbox(left=left,top=top,width=width,height=height)
设置文本框背景
#调整文本框背景颜色textBoxFill=textBox.filltextBoxFill.solid()#纯色填充textBoxFill.fore_color.rgb=RGBColor(187,255,255)
RGB颜色参考:.hk/rgb.htm
设置文本框边框样式
#文本框边框样式调整line=textBox.lineline.color.rgb=RGBColor(0,255,0)line.width=Cm(0.1)
设置文本框文字样式
#获取文本框文字对象tf=textBox.text_frame#文本框样式调整tf.margin_bottom=Cm(0.1)#下边距tf.margin_left=0#左边距tf.vertical_anchor=MSO_VERTICAL_ANCHOR.BOTTOM#垂直方式:底端对齐tf.word_wrap=True#文本框的文字自动对齐
“指定文本在文本框架中的垂直对齐方式。与TextFrame对象的.vertical_anchor属性一起使用。请注意,vertical_anchor属性也可以具有值None,表示没有直接指定的垂直锚设置,并且其有效值是从占位符继承的(如果有一个或从主题继承)。也可以不指定任何内容来删除明确指定的垂直锚设置。
frompptx.enum.textimportMSO_ANCHORcell=table.cell(row_idx=2,col_idx=3)cell.vertical_anchor=MSO_ANCHOR.BOTTOM
TOPAligns text to top of text frame and inherits its value from its layout placeholder or theme.MIDDLECenters text verticallyBOTTOMAligns text to bottom of text frameMIXEDReturn value only; indicates a combination of the other states.
垂直对齐
设置文本框内容
#设置内容tf.paragraphs[0].text='这是一段文本框里的文字'
字体样式调整
#字体样式调整tf.paragraphs[0].alignment=PP_ALIGN.CENTER#对齐方式tf.paragraphs[0].font.name='微软雅黑'#字体名称tf.paragraphs[0].font.bold=True#是否加粗tf.paragraphs[0].font.italic=True#是否斜体tf.paragraphs[0].font.color.rgb=RGBColor(255,0,0)#字体颜色tf.paragraphs[0].font.size=Pt(20)#字体大小
frompptx.enum.textimportPP_ALIGNshape.paragraphs[0].alignment=PP_ALIGN.CENTER
文字对齐
CENTERCenter alignDISTRIBUTEEvenly distributes e.g. Japanese characters from left to right within a lineJUSTIFYJustified, i.e. each line both begins and ends at the margin with spacing between words adjusted such that the line exactly fills the width of the paragraph.JUSTIFY_LOWJustify using a small amount of space between words.LEFTLeft alignedRIGHTRight alignedTHAI_DISTRIBUTEThai distributedMIXEDReturn value only; indicates multiple paragraph alignments are present in a set of paragraphs.
保存ppt
#保存pptppt.save('4.1.2设置文字框与字体样式.pptx')
4.2 python-pptx 添加表格并设置样式
示例代码:
frompptximportPresentationfrompptx.utilimportPt,Cmfrompptx.dml.colorimportRGBColorfrompptx.enum.textimportMSO_ANCHORfrompptx.enum.textimportPP_ALIGN#设置需要添加到哪一页n_page=0#打开已存在pptppt=Presentation('4.python-pptx操作模板.pptx')#获取slide对象slide=ppt.slides[n_page]#设置表格位置和大小left,top,width,height=Cm(6),Cm(12),Cm(13.6),Cm(5)#表格行列数,和大小shape=slide.shapes.add_table(6,7,left,top,width,height)#获取table对象table=shape.table#设置列宽table.columns[0].width=Cm(3)table.columns[1].width=Cm(2.3)table.columns[2].width=Cm(2.3)table.columns[3].width=Cm(1.3)table.columns[4].width=Cm(1.3)table.columns[5].width=Cm(1.3)table.columns[6].width=Cm(2.1)#设置行高table.rows[0].height=Cm(1)#合并首行table.cell(0,0).merge(table.cell(0,6))#填写标题table.cell(1,0).text="时间"table.cell(1,1).text="阶段"table.cell(1,2).text="执行用例"table.cell(1,3).text="新增问题"table.cell(1,4).text="问题总数"table.cell(1,5).text="遗留问题"table.cell(1,6).text="遗留致命/"\"严重问题"#填写变量内容table.cell(0,0).text="产品1"content_arr=[["4/30-5/14","DVT1","20","12","22","25","5"],["5/15-5/21","DVT1","25","32","42","30","8"],["5/22-6/28","DVT1","1","27","37","56","12"],["5/22-6/28","DVT1","1","27","37","56","12"]]#修改表格样式forrowsinrange(6):forcolsinrange(7):#Writecolumntitlesifrows==0:#设置文字大小table.cell(rows,cols).text_frame.paragraphs[0].font.size=Pt(15)#设置字体table.cell(rows,cols).text_frame.paragraphs[0].font.name='微软雅黑'#设置文字颜色table.cell(rows,cols).text_frame.paragraphs[0].font.color.rgb=RGBColor(255,255,255)#设置文字左右对齐table.cell(rows,cols).text_frame.paragraphs[0].alignment=PP_ALIGN.CENTER#设置文字上下对齐table.cell(rows,cols).vertical_anchor=MSO_ANCHOR.MIDDLE#设置背景为填充table.cell(rows,cols).fill.solid()#设置背景颜色table.cell(rows,cols).fill.fore_color.rgb=RGBColor(34,134,165)elifrows==1:table.cell(rows,cols).text_frame.paragraphs[0].font.size=Pt(10)table.cell(rows,cols).text_frame.paragraphs[0].font.name='微软雅黑'#字体名称table.cell(rows,cols).text_frame.paragraphs[0].font.color.rgb=RGBColor(0,0,0)table.cell(rows,cols).text_frame.paragraphs[0].alignment=PP_ALIGN.CENTERtable.cell(rows,cols).vertical_anchor=MSO_ANCHOR.MIDDLEtable.cell(rows,cols).fill.solid()table.cell(rows,cols).fill.fore_color.rgb=RGBColor(204,217,225)else:table.cell(rows,cols).text=content_arr[rows-2][cols]table.cell(rows,cols).text_frame.paragraphs[0].font.size=Pt(10)table.cell(rows,cols).text_frame.paragraphs[0].font.name='微软雅黑'#字体名称table.cell(rows,cols).text_frame.paragraphs[0].font.color.rgb=RGBColor(0,0,0)table.cell(rows,cols).text_frame.paragraphs[0].alignment=PP_ALIGN.CENTERtable.cell(rows,cols).vertical_anchor=MSO_ANCHOR.MIDDLEtable.cell(rows,cols).fill.solid()table.cell(rows,cols).fill.fore_color.rgb=RGBColor(204,217,225)ppt.save('4.2python-pptx添加表格并设置样式.pptx')
效果如下:
4.3 python-pptx 添加图表并设置样式
示例代码:
frompptximportPresentationfrompptx.utilimportPt,Cmfrompptx.chart.dataimportChartDatafrompptx.enum.chartimportXL_CHART_TYPE#设置需要添加到哪一页n_page=0#打开已存在pptppt=Presentation('4.python-pptx操作模板.pptx')#获取slide对象slide=ppt.slides[n_page]#初始化图表chart_data=ChartData()#填充需要添加的内容content_arr=[["4/30-5/14","DVT1","20","12","22","25","5"],["5/15-5/21","DVT1","25","32","42","30","8"],["5/22-6/28","DVT1","1","27","37","56","12"],["5/22-6/28","DVT1","1","27","37","56","12"]]#填充图表chart_data.categories=[content_arr[0][0],content_arr[1][0],content_arr[2][0],content_arr[3][0]]chart_data.add_series("问题总数",(content_arr[0][4],content_arr[1][4],content_arr[2][4],content_arr[3][4]))chart_data.add_series("遗留问题总数",(content_arr[0][5],content_arr[1][5],content_arr[2][5],content_arr[3][5]))chart_data.add_series("遗留致命严重\n问题总数",(content_arr[0][6],content_arr[1][6],content_arr[2][6],content_arr[3][6]))#设置位置left,top,width,height=Cm(6),Cm(10),Cm(16.1),Cm(7.5)#添加图表chart=slide.shapes.add_chart(XL_CHART_TYPE.LINE,left,top,width,height,chart_data).chartchart.has_legend=Truechart.legend.include_in_layout=False#chart.series[0].smooth=True#是否平滑#chart.series[1].smooth=True#chart.series[2].smooth=Truechart.font.size=Pt(10)#文字大小ppt.save('4.3python-pptx添加图表并设置样式.pptx')print('折线图添加完成')
效果如下:
其它图表可参考:/adam01/p/11348938.html
4.4 python-pptx 添加形状并设置样式
这里的形状可以是这些:
形状别名可以再这里查看:
/zh-cn/office/vba/api/Office.MsoAutoShapeType
并对应这里,找到正确的枚举名:
https://python-pptx.readthedocs.io/en/latest/api/enum/MsoAutoShapeType.html#msoautoshapetype
程序示例:
frompptximportPresentationfrompptx.utilimportPt,Cmfrompptx.dml.colorimportRGBColorfrompptx.enum.textimportPP_ALIGNfrompptx.enum.shapesimportMSO_SHAPE#设置需要添加到哪一页n_page=0#打开已存在pptppt=Presentation('4.python-pptx操作模板.pptx')#获取slide对象slide=ppt.slides[n_page]#添加矩形#设置位置以及大小left,top,width,height=Cm(2.5),Cm(4.5),Cm(30),Cm(0.5)#添加形状rectangle=slide.shapes.add_shape(MSO_SHAPE.RECTANGLE,left,top,width,height)#设置背景填充rectangle.fill.solid()#设置背景颜色rectangle.fill.fore_color.rgb=RGBColor(34,134,165)#设置边框颜色rectangle.line.color.rgb=RGBColor(34,134,165)#添加正三角+文字(正常)left,top,width,height=Cm(3),Cm(5.1),Cm(0.5),Cm(0.4)slide.shapes.add_shape(MSO_SHAPE.FLOWCHART_EXTRACT,left,top,width,height)new_paragraph=slide.shapes.add_textbox(left=left-Cm(0.95),top=top+Cm(0.4),width=Cm(2.4),height=Cm(1.1)).text_framecontent="""/01/05内容1"""new_paragraph.paragraphs[0].text=contentnew_paragraph.paragraphs[0].font.size=Pt(10)#文字大小new_paragraph.paragraphs[0].alignment=PP_ALIGN.CENTER#添加正三角+文字(延期)left,top,width,height=Cm(9),Cm(5.1),Cm(0.5),Cm(0.4)extract=slide.shapes.add_shape(MSO_SHAPE.FLOWCHART_EXTRACT,left,top,width,height)extract.fill.solid()extract.fill.fore_color.rgb=RGBColor(255,0,0)extract.line.color.rgb=RGBColor(255,0,0)new_paragraph=slide.shapes.add_textbox(left=left-Cm(0.95),top=top+Cm(0.4),width=Cm(2.4),height=Cm(1.1)).text_framecontent="""/01/05内容2"""new_paragraph.paragraphs[0].text=content#文字内容new_paragraph.paragraphs[0].font.size=Pt(10)#文字大小new_paragraph.paragraphs[0].font.color.rgb=RGBColor(255,0,0)#文字颜色new_paragraph.paragraphs[0].alignment=PP_ALIGN.CENTER#文字水平对齐方式#添加倒三角+间隔条+文字left,top,width,height=Cm(5),Cm(4),Cm(0.5),Cm(0.4)slide.shapes.add_shape(MSO_SHAPE.FLOWCHART_MERGE,left,top,width,height)gap=slide.shapes.add_shape(MSO_SHAPE.RECTANGLE,left+Cm(0.2),top+Cm(0.5),Cm(0.05),Cm(0.5))gap.fill.solid()gap.fill.fore_color.rgb=RGBColor(255,255,255)gap.line.color.rgb=RGBColor(255,255,255)new_paragraph=slide.shapes.add_textbox(left=left-Cm(0.95),top=top-Cm(1),width=Cm(2.4),height=Cm(1.1)).text_framecontent="""/01/05内容3"""new_paragraph.paragraphs[0].text=contentnew_paragraph.paragraphs[0].font.size=Pt(10)#文字大小new_paragraph.paragraphs[0].alignment=PP_ALIGN.CENTER#添加当前时间图形left,top,width,height=Cm(7),Cm(4),Cm(0.5),Cm(0.4)now=slide.shapes.add_shape(MSO_SHAPE.DOWN_ARROW,left,top,width,height)now.fill.solid()now.fill.fore_color.rgb=RGBColor(254,152,47)now.line.color.rgb=RGBColor(254,152,47)ppt.save('4.4python-pptx添加形状并设置样式.pptx')print('进度条添加完成')
效果如下:
5.seaborn绘图库介绍与使用
官方网址:/
seaborn是基于Matplotlib的Python数据可视化库。它提供了一个高级界面,用于绘制引人入胜且内容丰富的统计图形
只是在Matplotlib上进行了更高级的API封装,从而使作图更加容易
seaborn是针对统计绘图的,能满足数据分析90%的绘图需求,需要复杂的自定义图形还需要使用到Matplotlib
5.1 pip安装seaborn
pipinstallseaborn
效果如下(我的显示已安装):
使用:
importseabornassns#或者importseaborn
使用数据集:
importseabornassnstips=sns.load_dataset("tips")
无法连接:
下载数据集:
/mwaskom/seaborn-data
放到本地:
运行程序:
importseabornassnstips=sns.load_dataset("tips")print("tips:",tips)print("ype(tips):",type(tips))
效果如下:
参考博客:
《解决seaborn导入数据集出现错误》
/qq_33828738/article/details/107044082
5.2 seaborn绘制折线图
5.2.1 通过relplot来实现
示例代码:
importmatplotlib.pyplotaspltimportseabornassns#数据集data=sns.load_dataset("fmri")print(data.head())#绘画折线图sns.relplot(x="timepoint",y="signal",kind="line",data=data,ci=None)#显示plt.show()
效果如下:
5.2.2 通过lineplot()函数来实现
示例代码:
importmatplotlib.pyplotaspltimportseabornassns#数据集data=sns.load_dataset("fmri")print(data.head())#绘画折线图:sns.lineplot(x="timepoint",y="signal",data=data,ci=95)#显示plt.show()
效果如下:
5.2.3 多坐标效果
示例代码:
importmatplotlib.pyplotaspltimportseabornassns#数据集data=sns.load_dataset("fmri")print(data.head())#绘画折线图f,axes=plt.subplots(nrows=1,ncols=2,figsize=(14,6))sns.lineplot(x="timepoint",y="signal",data=data,ci=None,ax=axes[0])sns.lineplot(x="timepoint",y="signal",hue="region",style="event",data=data,ci=None,ax=axes[1])plt.show()
效果如下:
5.2.4 保存生成的图片
注意:需要在plt.show()之前调用savefig,不然保存的图片就是一片空白
plt.savefig('seaborn生成的图片.png')plt.show()
效果如下:
5.3 seaborn replot 绘制散点图
示例代码:
importmatplotlib.pyplotaspltimportseabornassns#准备数据:自带数据集tips=sns.load_dataset("tips")print(tips.head())#绘画散点图sns.relplot(x="total_bill",y="tip",data=tips,hue="sex",style="smoker",size="size")sns.relplot(x="total_bill",y="tip",data=tips,hue="sex",style="smoker",size="size",sizes=(100,100))#显示plt.show()
效果如下:
5.4 seaborn barplot绘制柱状图
垂直
示例代码:
importmatplotlib.pyplotaspltimportseabornassns#显示正负号与中文不显示问题plt.rcParams['axes.unicode_minus']=Falsesns.set_style('darkgrid',{'font.sans-serif':['SimHei','Arial']})#去除部分warningimportwarningswarnings.filterwarnings('ignore')plt.figure(dpi=150)x=['金融','农业','制造业','新能源']y=[164,86,126,53]sns.barplot(x,y)plt.show()
效果如下:
水平
调换横纵坐标位置即可
plt.figure(dpi=150)x=['金融','农业','制造业','新能源']y=[164,86,126,53]sns.barplot(y,x)plt.show()
6.python-pptx 插入图片
前提条件:
示例代码:
frompptximportPresentationfrompptx.utilimportPt,Cm#打开已存在pptppt=Presentation('6.python-pptx操作模板.pptx')#设置添加到当前ppt哪一页n_page=0#获取需要添加文字的页面对象slide=ppt.slides[n_page]#设置待添加的图片img_name='seaborn生成的图片.png'#设置位置left,top,width,height=Cm(6),Cm(6),Cm(20),Cm(9)#进行添加slide.shapes.add_picture(image_file=img_name,left=left,top=top,width=width,height=height)#保存pptppt.save('6.python-pptx插入图片.pptx')
效果如下:
7.python-pptx 读取数据
前提条件:
准备好一张有内容的ppt
示例代码:
frompptximportPresentationfrompptx.enum.shapesimportMSO_SHAPE_TYPE#打开待读取的ppt文件ppt=Presentation('研发管理部检测部周报-09-17.pptx')#获取第0张slide0=ppt.slides[0]#遍历所有内容forshapeinslide0.shapes:#打印shape名称print(shape.shape_type)#判断是否为表格ifshape.shape_type==MSO_SHAPE_TYPE.TABLE:#获取表格行forrowinshape.table.rows:forcellinrow.cells:print(cell.text_frame.text)
效果如下:
将当前幻灯片页面中的对象名称和表格内容全部打印出来了,反之,我们对其进行复制,就是写操作。
< END >
分享或在看是对我最大的支持