精华内容
下载资源
问答
  • Python制作PPT周报

    2021-06-18 17:13:13
    事情是这样的,做生产管理的小伙子跟我抱怨,老是每周要提交PPT周报,真的很麻烦,希望能有办法解决这个问题。 当然,经过了解调查,他目前需要定期在公共区域播放PPTPPT数据来源与整理好的Excel数据,细细想来...

    事情是这样的,做生产管理的小伙子跟我抱怨,老是每周要提交PPT周报,真的很麻烦,希望能有办法解决这个问题。

            当然,经过了解调查,他目前需要定期在公共区域播放PPT,PPT数据来源与整理好的Excel数据,细细想来,周期性的做报告,确实比较烦。分析了一下他的需求,他这种类型基本上属于机械的,重复的,与电脑相关的工作,哪里有不爽,哪里就有机会~确实是这样,这不机会来了嘛!RPA又有机会露一手啦。

            整个工作的流程方式是这样的:

            其实,万变不离其中,目前的大数据技术基本的思路也是这样:数据采集->数据清洗->数据存储->数据挖掘

            根据与小伙子了解,数据采集目前还是手工的去网站上面下载相关数据,然后去除异常数据,操作完成后保存至指定的Excel. 后来我考虑了一下,数据采集这一步是可以通过selenium实现自动采集的,考虑到项目的快速实施,就没有推荐给他。要不然,他就什么事情也不用干了,这个暂时还不好,当然,后期如果直接形成数据流闭环,比如通过数据采集后直连SQL,再通过PowerBI展示出来,就全链路闭环了。

             这篇文章中,主要跟大家分享通过python制作PPT展示,点点鼠标就完成PPT周报。当然,这是有前提条件的:1,准备好数据源;2,准备好PPT模板。这两个条件应该都已经具备了。Python制作PPT周报大致步骤如下:

     

           在程序设计阶段,主要使用了如下几个Python库:

    Import python-pptx

    Import matplotlib

     

            Python-pptx这个库的主要作用是通过这个库可以实现对PPTX的操作,包括增删slide,修改slide元素,插入Table, 插入图片等。在这个案例中,设计步骤如下:

    1. 读取PPT模板
    2. 向PPT模板中插入母版页
    3. 向指定的PPT页面中插入元素,如Table, 图片,图表等
    4. 保存,完成PPT的编写

          其中,最核心的部分在于元素的操作,我本来计划通过PPT自带的图表功能实现插入图表,后来发现有一些图表的属性很难修改,只能果断放弃这样的方式,采用通过matplotlib先生成图表,然后插入silde的方法,插入Table的过程比较顺利,基本可以做出符合要求的表格。

           Python脚本弄完后交给小伙子,他双击了一下,等待了大概20秒,然后,PPT周报就完成了,就这么简单。

           同时,将这个脚本接入RPA平台,从后台就可以看到这个脚本的运行状况。在这个脚本编写的过程中,也有一些不完善的地方,数据源来源于excel,如果excel的格式稍有变化,脚本就跑不下去了,目前看,这算是小快灵的方法,完善的方式是接入PowerBI平台。

             需求是变化的,也许这是目前最优的解决办法。

    展开全文
  • Python制作PPT

    千次阅读 多人点赞 2021-07-18 15:35:51
    怎么,你还没学Python吗? 此一时彼以时,什么C,JAVA,现在在求职市场都...所以,为了不被时代滚滚洪流淘汰,争取抓上时代前进的末班车,我也要学Python了,从最实用的-文案(吹)PPT(牛逼)做起。 下面开始技术流。

    怎么,你还没学Python吗? 此一时彼以时,什么C,JAVA,现在在求职市场都是渣渣,铺天盖地的Python学习广告,一遍又一遍地提醒着着我,你已经老了:

    老板说:你很努力,但我还是想提拔会Python的人。

    员工说:自从学了Python,腰不疼了,腿不酸了,颈椎不痛了,连工资都涨了。。。

    码农说:我要偷偷学Python,惊呆所有人!

    。。。。。。


    所以,为了不被时代滚滚洪流淘汰,争取抓上时代前进的末班车,我也要学Python了,从最实用的-文案(吹)PPT(牛逼)做起。

    下面开始技术流。

    步骤1:

    Python存在不同版本之间的兼容性问题,所以有必要说明一下版本,这里我在Ubuntu系统上使用Python3为例,如果你的系统不是Python3.请按照如下步骤修改:

    caozilong@caozilong-Vostro-3268:/usr/bin$ sudo rm python 
    caozilong@caozilong-Vostro-3268:/usr/bin$ sudo ln -s /usr/bin/python3 /usr/bin/python 
    caozilong@caozilong-Vostro-3268:/usr/bin$ 
    

    步骤2:安装PIP3

    安装PIP3的目的是为了安装 Python PPT插件,作为Python3上的包管理工具,PIP3不可或缺。

    caozilong@caozilong-Vostro-3268:~/Workspace/python-ppt$ sudo apt install python3-pip
    [sudo] caozilong 的密码: 
    正在读取软件包列表... 完成
    正在分析软件包的依赖关系树       
    正在读取状态信息... 完成       
    python3-pip 已经是最新版 (9.0.1-2.3~ubuntu1.18.04.5)。
    下列软件包是自动安装的并且现在不需要了:
      libegl1-mesa libfwup1 libllvm9 python-kerberos
    使用'sudo apt autoremove'来卸载它(它们)。
    升级了 0 个软件包,新安装了 0 个软件包,要卸载 0 个软件包,有 10 个软件包未被升级。
    caozilong@caozilong-Vostro-3268:~/Workspace/python-ppt$ 
    

    步骤3:安装python-pptx

    caozilong@caozilong-Vostro-3268:~/Workspace/python-ppt$ sudo pip3 install python-pptx
    The directory '/home/caozilong/.cache/pip/http' or its parent directory is not owned by the current user and the cache has been disabled. Please check the permissions and owner of that directory. If executing pip with sudo, you may want sudo's -H flag.
    The directory '/home/caozilong/.cache/pip' or its parent directory is not owned by the current user and caching wheels has been disabled. check the permissions and owner of that directory. If executing pip with sudo, you may want sudo's -H flag.
    Collecting python-pptx
      Downloading https://files.pythonhosted.org/packages/53/ed/547be9730350509253bc7d76631a8ffcd1a62dda4d7482fb25d369696e37/python-pptx-0.6.19.tar.gz (9.3MB)
        100% |████████████████████████████████| 9.3MB 180kB/s 
    Requirement already satisfied: Pillow>=3.3.2 in /usr/lib/python3/dist-packages (from python-pptx)
    Collecting XlsxWriter>=0.5.7 (from python-pptx)
      Downloading https://files.pythonhosted.org/packages/93/51/11cb4545e95f1a845a6ca5475eb425272dc32c2f0e3592d80e7abd491374/XlsxWriter-1.4.4-py2.py3-none-any.whl (149kB)
        100% |████████████████████████████████| 153kB 5.9MB/s 
    Collecting lxml>=3.1.0 (from python-pptx)
      Downloading https://files.pythonhosted.org/packages/1f/1d/a4485412268b38043a6c0f873245b5d9315c6615bcf44776759a2605dca5/lxml-4.6.3-cp36-cp36m-manylinux1_x86_64.whl (5.5MB)
        100% |████████████████████████████████| 5.5MB 295kB/s 
    Installing collected packages: XlsxWriter, lxml, python-pptx
      Running setup.py install for python-pptx ... done
    Successfully installed XlsxWriter-1.4.4 lxml-4.6.3 python-pptx-0.6.19
    caozilong@caozilong-Vostro-3268:~/Workspace/python-ppt$

    4.写代码测试:

    #!/usr/bin/env python3
    # -*- coding: utf-8 -*-
    from pptx import Presentation
    
    prs = Presentation()
    title_slide_layout = prs.slide_layouts[0]
    slide = prs.slides.add_slide(title_slide_layout)
    title = slide.shapes.title
    subtitle = slide.placeholders[1]
    
    title.text = "Hello, World!"
    subtitle.text = "python-pptx 可以轻松制作powerpoint!"
    
    prs.save('czl.pptx')

     执行:

    caozilong@caozilong-Vostro-3268:~/Workspace/python-ppt$ python py1.py
    caozilong@caozilong-Vostro-3268:~/Workspace/python-ppt$ ls -l
    总用量 32
    -rw-rw-r-- 1 caozilong caozilong 28292 7月  18 15:51 czl.pptx
    -rw-rw-r-- 1 caozilong caozilong   362 7月  18 15:51 py1.py
    caozilong@caozilong-Vostro-3268:~/Workspace/python-ppt$ 
    

    用WPS打开czl.pptx.

    from pptx import Presentation
    
    prs = Presentation()
    bullet_slide_layout = prs.slide_layouts[1]
    
    slide = prs.slides.add_slide(bullet_slide_layout)
    shapes = slide.shapes
    
    title_shape = shapes.title
    body_shape = shapes.placeholders[1]
    
    title_shape.text = 'Adding a Bullet Slide'
    
    tf = body_shape.text_frame
    tf.text = 'Find the bullet slide layout'
    
    p = tf.add_paragraph()
    p.text = 'Use _TextFrame.text for first bullet'
    p.level = 1
    
    p = tf.add_paragraph()
    p.text = 'Use _TextFrame.add_paragraph() for subsequent bullets'
    p.level = 2
    
    prs.save('czl.pptx')

    #!/usr/bin/env python3
    # -*- coding: utf-8 -*-
    from pptx import Presentation
    from pptx.enum.shapes import MSO_SHAPE
    from pptx.util import Inches
    
    prs = Presentation()
    title_only_slide_layout = prs.slide_layouts[5]
    slide = prs.slides.add_slide(title_only_slide_layout)
    shapes = slide.shapes
    
    shapes.title.text = 'Adding an AutoShape'
    
    left = Inches(0.93)  # 0.93" centers this overall set of shapes
    top = Inches(3.0)
    width = Inches(1.75)
    height = Inches(1.0)
    
    shape = shapes.add_shape(MSO_SHAPE.PENTAGON, left, top, width, height)
    shape.text = 'Step 1'
    
    left = left + width - Inches(0.4)
    width = Inches(2.0)  # chevrons need more width for visual balance
    
    for n in range(2, 6):
        shape = shapes.add_shape(MSO_SHAPE.CHEVRON, left, top, width, height)
        shape.text = 'Step %d' % n
        left = left + width - Inches(0.4)
    
    prs.save('test.pptx')

    from pptx import Presentation
    from pptx.chart.data import CategoryChartData
    from pptx.enum.chart import XL_CHART_TYPE
    from pptx.util import Inches
    
    # create presentation with 1 slide ------
    prs = Presentation()
    slide = prs.slides.add_slide(prs.slide_layouts[5])
    
    # define chart data ---------------------
    chart_data = CategoryChartData()
    chart_data.categories = ['East', 'West', 'Midwest']
    chart_data.add_series('Series 1', (19.2, 21.4, 16.7))
    
    # add chart to slide --------------------
    x, y, cx, cy = Inches(2), Inches(2), Inches(6), Inches(4.5)
    slide.shapes.add_chart(
        XL_CHART_TYPE.COLUMN_CLUSTERED, x, y, cx, cy, chart_data)
    
    prs.save('chart-01.pptx')

    from pptx import Presentation
    from pptx.util import Inches
    from pptx import Presentation
    from pptx.chart.data import ChartData
    from pptx.enum.chart import XL_CHART_TYPE
    from pptx.util import Cm #Inches
    from pptx.enum.chart import XL_LEGEND_POSITION
     
    if __name__ == '__main__':
        # 创建幻灯片 ------
        prs = Presentation('template.pptx')
        title_only_slide_layout = prs.slide_layouts[5]
        slide = prs.slides.add_slide(title_only_slide_layout)
        shapes = slide.shapes
     
        shapes.title.text = '报告'
     
        # 定义表格数据 ------
        name_objects = ["object1", "object2", "object3"]
        name_AIs = ["AI1", "AI2", "AI3"]
        val_AI1 = (19.2, 21.4, 16.7)
        val_AI2 = (22.3, 28.6, 15.2)
        val_AI3 = (20.4, 26.3, 14.2)
        val_AIs = [val_AI1, val_AI2, val_AI3]
     
        # 表格样式 --------------------
        rows = 4
        cols = 4
        top    = Cm(12.5)
        left   = Cm(3.5) #Inches(2.0)
        width  = Cm(24) # Inches(6.0)
        height = Cm(6) # Inches(0.8)
     
        # 添加表格到幻灯片 --------------------
        table = shapes.add_table(rows, cols, left, top, width, height).table
     
        # 设置单元格宽度
        table.columns[0].width = Cm(6)# Inches(2.0)
        table.columns[1].width = Cm(6)
        table.columns[2].width = Cm(6)
        table.columns[3].width = Cm(6)
     
        # 设置标题行
        table.cell(0, 1).text = name_objects[0]
        table.cell(0, 2).text = name_objects[1]
        table.cell(0, 3).text = name_objects[2]
     
        # 填充数据
        table.cell(1, 0).text = name_AIs[0]
        table.cell(1, 1).text = str(val_AI1[0])
        table.cell(1, 2).text = str(val_AI1[1])
        table.cell(1, 3).text = str(val_AI1[2])
     
        table.cell(2, 0).text = name_AIs[1]
        table.cell(2, 1).text = str(val_AI2[0])
        table.cell(2, 2).text = str(val_AI2[1])
        table.cell(2, 3).text = str(val_AI2[2])
     
        table.cell(3, 0).text = name_AIs[2]
        table.cell(3, 1).text = str(val_AI3[0])
        table.cell(3, 2).text = str(val_AI3[1])
        table.cell(3, 3).text = str(val_AI3[2])
     
        # 定义图表数据 ---------------------
        chart_data = ChartData()
        chart_data.categories = name_objects
        chart_data.add_series(name_AIs[0], val_AI1)
        chart_data.add_series(name_AIs[1], val_AI2)
        chart_data.add_series(name_AIs[2], val_AI3)
     
        # 添加图表到幻灯片 --------------------
        x, y, cx, cy = Cm(3.5), Cm(4.2), Cm(24), Cm(8)
     
        graphic_frame = slide.shapes.add_chart(
            XL_CHART_TYPE.COLUMN_CLUSTERED, x, y, cx, cy, chart_data
            )
     
        chart = graphic_frame.chart
     
        chart.has_legend = True
        chart.legend.position = XL_LEGEND_POSITION.TOP
        chart.legend.include_in_layout = False
     
        value_axis = chart.value_axis
        value_axis.maximum_scale = 100.0
     
        value_axis.has_title = True
        value_axis.axis_title.has_text_frame = True
        value_axis.axis_title.text_frame.text = "False positive"
        value_axis.axis_title.text_frame.auto_size
     
        prs.save('test_template.pptx')
     

    结束后,整理PPT目录,给每个文件加上序号:

    caozilong@caozilong-Vostro-3268:~/Workspace/python-ppt$ ls -l *.pptx
    -rw-rw-r-- 1 caozilong caozilong 28292 7月  18 16:05 1.template.pptx
    -rw-rw-rw- 1 caozilong caozilong   165 7月  18 15:59 2..~test.pptx
    -rw-rw-r-- 1 caozilong caozilong 28292 7月  18 16:05 3.czl.pptx
    -rw-rw-rw- 1 caozilong caozilong   165 7月  18 15:53 4..~czl.pptx
    -rw-rw-r-- 1 caozilong caozilong 35873 7月  18 16:06 5.test_template.pptx
    -rw-rw-rw- 1 caozilong caozilong   165 7月  18 16:06 6..~test_template.pptx
    caozilong@caozilong-Vostro-3268:~/Workspace/python-ppt$

    caozilong@caozilong-Vostro-3268:~/Workspace/python-ppt$ ls -l *.pptx
    -rw-rw-r-- 1 caozilong caozilong 28292 7月  18 16:05 1.template.pptx
    -rw-rw-rw- 1 caozilong caozilong   165 7月  18 15:59 2..~test.pptx
    -rw-rw-r-- 1 caozilong caozilong 28292 7月  18 16:05 3.czl.pptx
    -rw-rw-rw- 1 caozilong caozilong   165 7月  18 15:53 4..~czl.pptx
    -rw-rw-r-- 1 caozilong caozilong 35873 7月  18 16:06 5.test_template.pptx
    -rw-rw-rw- 1 caozilong caozilong   165 7月  18 16:06 6..~test_template.pptx
    caozilong@caozilong-Vostro-3268:~/Workspace/python-ppt$ 
    

    Python 绘图:

    import matplotlib.pyplot as plt
    from pylab import * 
    mpl.rcParams['font.sans-serif'] = ['SimHei']
     
    """条形图bar"""
    x = ['10/Q1', '10/Q3', '11/Q1', '11/Q3', '12/Q1', '12/Q3', '13/Q1', '13/Q3', '14/Q1', '14/Q3', '15/Q1', '15/Q3', '16/Q1', '16/Q3', '17/Q1', '17/Q3']
    y = [20, 35, 39, 62, 87, 114, 140, 169, 187, 211, 225, 239, 241, 247, 251, 258]
     
    # plt.bar([1,3,5,7,9],[5,2,7,8,2],label='Example One',color='b')#plt.bar创建条形图
    # plt.bar([2,4,6,8,10],[8,6,2,5,6],label='Example Two',color='g')
     
    plt.bar(range(16), y, color = 'lightsteelblue')
    plt.plot(range(16), y, marker = 'o', color = 'coral') #coral
    plt.xticks(range(16), x)
    plt.xlabel('year/month')
    plt.ylabel("active customer/month")
    plt.legend()
    plt.show()

    import matplotlib.pyplot as plt
    import numpy as np
    import matplotlib.patches as mpatches
    plt.subplots_adjust(left=0.00, bottom=0.0, right=1.00, top=0.95, wspace=0.0, hspace=0.00)
    
    
    def hexagon_with_text(ax,x,y,text,size,**kwargs):
        xy=np.array([x,y])
        hexagon = mpatches.RegularPolygon(xy, 6, radius=size,facecolor='#5472bb',edgecolor='#3f597c', orientation=np.pi / 2)
        ax.add_patch(hexagon)
        ax.text(xy[0],xy[1],text,fontsize=size*14,color='white',va='center',ha='center')
    
    def circle_with_text(ax,x,y,text,size,**kwargs):
        xy=np.array([x,y])
        circle = mpatches.Circle(xy, radius=size,facecolor='#83aa51',edgecolor='#546538')
        ax.add_patch(circle)
        ax.text(xy[0],xy[1],text,fontsize=size*14,color='white',va='center',ha='center')
    
    def arrow(ax,x,y,size,**kwargs):
        ax.plot(x,y,**kwargs)
        theta=np.arctan2(x[1]-x[0],y[1]-y[0])
        xy=np.array([x[1]-size*np.sin(theta),y[1]-size*np.cos(theta)])
        triangle = mpatches.RegularPolygon(xy, 3, radius=size,color=kwargs['color'], orientation=-theta)
        ax.add_patch(triangle)
    
    def arrow_with_rad(ax,x,y,radius,size,**kwargs):
        d=np.sqrt((x[1]-x[0])**2+(y[1]-y[0])**2)
    
        theta=np.arctan2(x[1]-x[0],y[0]-y[1])
    
        x0=(x[0]+x[1])/2+np.cos(theta)*np.sqrt(radius**2-(d/2)**2)
        y0=(y[0]+y[1])/2+np.sin(theta)*np.sqrt(radius**2-(d/2)**2)
    
        theta1=np.arctan2(y[0]-y0,x[0]-x0)
        theta2=np.arctan2(y[1]-y0,x[1]-x0)
    
        arc_x = []
        arc_y = []
    
        for theta in np.arange(theta1,theta2+(np.pi*2),np.pi/180):
            temp_x=x0 + radius * np.cos(theta)
            temp_y=y0 + radius * np.sin(theta)
            if((temp_x-x[0])**2+(temp_y-y[0])**2>1 and (temp_x-x[1])**2+(temp_y-y[1])**2>1):
                arc_x.append(temp_x)
                arc_y.append(temp_y)
        ax.plot(arc_x,arc_y,**kwargs)
    
        theta=np.arctan2(arc_y[-2]-arc_y[-1],arc_x[-2]-arc_x[-1])
        xy=np.array([arc_x[-1]+size*np.cos(theta),arc_y[-1]+size*np.sin(theta)])
        triangle = mpatches.RegularPolygon(xy, 3, radius=size,color=kwargs['color'], orientation=np.pi/2+theta)
        ax.add_patch(triangle)
    
    ax=plt.subplot(1,1,1,aspect='equal')
    ax.axis('off')
    
    circle_with_text(ax,2,23,'$\mathrm{U_{1}}$',1)
    circle_with_text(ax,2,20,'$\mathrm{U_{2}}$',1)
    circle_with_text(ax,2,17,'$\mathrm{U_{3}}$',1)
    circle_with_text(ax,2,14,'$\mathrm{U_{4}}$',1)
    
    hexagon_with_text(ax,8,22.5,'$\mathrm{I_{1}}$',1)
    hexagon_with_text(ax,8,18.5,'$\mathrm{I_{2}}$',1)
    hexagon_with_text(ax,8,14.5,'$\mathrm{I_{3}}$',1)
    
    arrow(ax,[3,8+np.cos(np.pi*3/3)],[23,22.5+np.sin(np.pi*3/3)],0.3,color='#b65576',linestyle='--')
    arrow(ax,[3,8+np.cos(np.pi*2/3)],[23,14.5+np.sin(np.pi*2/3)],0.3,color='#b65576',linestyle='--')
    arrow(ax,[3,8+np.cos(np.pi*4/3)],[17,22.5+np.sin(np.pi*4/3)],0.3,color='#b65576',linestyle='--')
    arrow(ax,[3,8+np.cos(np.pi*4/3)],[14,18.5+np.sin(np.pi*4/3)],0.3,color='#b65576',linestyle='--')
    
    arrow(ax,[3,8+np.cos(np.pi*3/3)],[20,18.5+np.sin(np.pi*3/3)],0.3,color='#b9b8bd',linestyle='--')
    arrow(ax,[3,8+np.cos(np.pi*3/3)],[17,14.5+np.sin(np.pi*3/3)],0.3,color='#b9b8bd',linestyle='--')
    arrow(ax,[3,8+np.cos(np.pi*3/3)],[14,14.5+np.sin(np.pi*3/3)],0.3,color='#b9b8bd',linestyle='--')
    
    ax.text(10.5,15,'${G_{r}}$',fontsize=20)
    
    circle_with_text(ax,4.2,10.5,'$\mathrm{U_{1}}$',1)
    circle_with_text(ax,9.0,10.0,'$\mathrm{U_{2}}$',1)
    circle_with_text(ax,8.5,5.8,'$\mathrm{U_{3}}$',1)
    circle_with_text(ax,3.8,6.8,'$\mathrm{U_{4}}$',1)
    
    theta=-np.pi/2-np.arctan2(9.0-4.2,10.0-10.5)
    arrow(ax,[9.0+np.cos(theta),4.2-np.cos(theta)],[10.0+np.sin(theta),10.5-np.sin(theta)],0.3,color='#8199bb')
    
    theta=-np.pi/2-np.arctan2(8.5-9.0,5.8-10.0)
    arrow(ax,[8.5+np.cos(theta),9.0-np.cos(theta)],[5.8+np.sin(theta),10.0-np.sin(theta)],0.3,color='#8199bb')
    
    theta=-np.pi/2-np.arctan2(3.8-4.2,6.8-10.5)
    arrow(ax,[3.8+np.cos(theta),4.2-np.cos(theta)],[6.8+np.sin(theta),10.5-np.sin(theta)],0.3,color='#8199bb')
    
    theta=-np.pi/2-np.arctan2(3.8-8.5,6.8-5.8)
    arrow(ax,[3.8+np.cos(theta),8.5-np.cos(theta)],[6.8+np.sin(theta),5.8-np.sin(theta)],0.3,color='#8199bb')
    
    theta=-np.pi/2-np.arctan2(4.2-8.5,10.5-5.8)
    arrow(ax,[4.2+np.cos(theta),8.5-np.cos(theta)],[10.5+np.sin(theta),5.8-np.sin(theta)],0.3,color='#8199bb')
    
    arrow_with_rad(ax,[4.2,3.8],[10.5,6.8],1.9,0.3,color='#8199bb')
    
    ax.text(10.5,8,r'${G_s}$',fontsize=20)
    
    circle_with_text(ax,25.0,19.0,'$\mathrm{U_{1}}$',1)
    circle_with_text(ax,35.0,17.0,'$\mathrm{U_{2}}$',1)
    circle_with_text(ax,32.0,8.0,'$\mathrm{U_{3}}$',1)
    circle_with_text(ax,24.0,10.0,'$\mathrm{U_{4}}$',1)
    
    hexagon_with_text(ax,32.5,14.0,'$\mathrm{I_{1}}$',1)
    hexagon_with_text(ax,23.0,16.0,'$\mathrm{I_{2}}$',1)
    hexagon_with_text(ax,27.0,13.0,'$\mathrm{I_{3}}$',1)
    
    theta=-np.pi/2-np.arctan2(35.0-25.0,17.0-19.0)
    arrow(ax,[35.0+np.cos(theta),25.0-np.cos(theta)],[17.0+np.sin(theta),19.0-np.sin(theta)],0.3,color='#8199bb')
    
    theta=-np.pi/2-np.arctan2(24.0-25.0,10.0-19.0)
    arrow(ax,[24.0+np.cos(theta),25.0-np.cos(theta)],[10.0+np.sin(theta),19.0-np.sin(theta)],0.3,color='#8199bb')
    
    theta=-np.pi/2-np.arctan2(24.0-32.0,10.0-8.0)
    arrow(ax,[24.0+np.cos(theta),32.0-np.cos(theta)],[10.0+np.sin(theta),8.0-np.sin(theta)],0.3,color='#8199bb')
    
    theta=-np.pi/2-np.arctan2(32.0-35.0,8.0-17.0)
    arrow(ax,[32.0+np.cos(theta),35.0-np.cos(theta)],[8.0+np.sin(theta),17.0-np.sin(theta)],0.3,color='#8199bb')
    
    theta=-np.pi/2-np.arctan2(25.0-32.0,19.0-8.0)
    arrow(ax,[25.0+np.cos(theta),32.0-np.cos(theta)],[19.0+np.sin(theta),8.0-np.sin(theta)],0.3,color='#8199bb')
    
    theta=-np.pi/2-np.arctan2(24.0-23-np.cos(np.pi*5/3),10.0-16.0-np.sin(np.pi*5/3))
    arrow(ax,[24.0+np.cos(theta),23.0+np.cos(np.pi*5/3)],[10.0+np.sin(theta),16.0+np.sin(np.pi*5/3)],0.3,color='#b65576',linestyle='--')
    
    theta=-np.pi/2-np.arctan2(32.0-32.5-np.cos(np.pi*4/3),8.0-14.0-np.sin(np.pi*4/3))
    arrow(ax,[32.0+np.cos(theta),32.5+np.cos(np.pi*4/3)],[8.0+np.sin(theta),14.0+np.sin(np.pi*4/3)],0.3,color='#b65576',linestyle='--')
    
    theta=-np.pi/2-np.arctan2(25.0-32.0-np.cos(np.pi*2/3),19.0-8.0-np.sin(np.pi*2/3))
    arrow(ax,[25.0+np.cos(theta),27.0+np.cos(np.pi*2/3)],[19.0+np.sin(theta),13.0+np.sin(np.pi*2/3)],0.3,color='#b65576',linestyle='--')
    arrow(ax,[25.0+np.cos(theta),32.5+np.cos(np.pi*3/3)],[19.0+np.sin(theta),14.0+np.sin(np.pi*3/3)],0.3,color='#b65576',linestyle='--')
    
    theta=-np.pi/2-np.arctan2(24.0-23-np.cos(np.pi*5/3),10.0-16.0-np.sin(np.pi*5/3))
    arrow(ax,[24.0+np.cos(theta),23.0+np.cos(np.pi*5/3)],[10.0+np.sin(theta),16.0+np.sin(np.pi*5/3)],0.3,color='#b65576',linestyle='--')
    
    theta=-np.pi/2-np.arctan2(35.0-23-np.cos(np.pi*0/3),17.0-16.0-np.sin(np.pi*0/3))
    arrow(ax,[35.0+np.cos(theta),23.0+np.cos(np.pi*0/3)],[17.0+np.sin(theta),16.0+np.sin(np.pi*0/3)],0.3,color='#b9b8bd',linestyle='--')
    
    theta=-np.pi/2-np.arctan2(24.0-27-np.cos(np.pi*4/3),10.0-13.0-np.sin(np.pi*4/3))
    arrow(ax,[24.0+np.cos(theta),27.0+np.cos(np.pi*4/3)],[10.0+np.sin(theta),13.0+np.sin(np.pi*4/3)],0.3,color='#b9b8bd',linestyle='--')
    
    theta=-np.pi/2-np.arctan2(32.0-27-np.cos(np.pi*5/3),8.0-13.0-np.sin(np.pi*5/3))
    arrow(ax,[32.0+np.cos(theta),27.0+np.cos(np.pi*5/3)],[8.0+np.sin(theta),13.0+np.sin(np.pi*5/3)],0.3,color='#b9b8bd',linestyle='--')
    
    arrow_with_rad(ax,[25,24],[19,10],4.8,0.3,color='#8199bb')
    
    bbox_props = dict(boxstyle="rarrow,pad=0.3", fc="#629cce", ec="#657084", lw=2)
    
    ax.text(16, 18, " "*15, ha="center", va="center", rotation=345,
                size=15,
                bbox=bbox_props)
    
    ax.text(16, 9, " "*15, ha="center", va="center", rotation=30,
                size=15,
                bbox=bbox_props)
    
    arrow(ax,[10,13],[24.5,24.5],0.3,color='#b65576',linestyle='--')
    arrow(ax,[20,23],[24.5,24.5],0.3,color='#b9b8bd',linestyle='--')
    arrow(ax,[27,30],[24.5,24.5],0.3,color='#8199bb')
    
    ax.text(9.5,24.5,'Purchase-P',fontsize=15,va='center',ha='right')
    ax.text(19.5,24.5,'Purchase-N',fontsize=15,va='center',ha='right')
    ax.text(26.5,24.5,'Trust',fontsize=15,va='center',ha='right')
    
    fig=plt.gcf()
    fig.set_size_inches(14, 8)
    
    ax.set_xlim(0,40)
    ax.set_ylim(0,25)
    
    plt.show()
    
    

    import numpy as np
    import matplotlib.pyplot as plt
    import matplotlib
    
    # matplotlib.rcParams['font.family'] = 'SimHei'
    
    size = 31
    #a = np.random.random(size)
    #b = np.random.random(size)
    #c = np.random.random(size)
    a=[9.30,16.34,9.68,16.96,12.19,9.58,5.65,4.89,7.37,8.44,15.64,14.04,13.30,1.97,34.28,55.18,41.80,53.95,38.84,196.85,450.36,81.79,127.43,46.91,71.44,27.21,36.85,78.30,49.91,66.96, 12.82]
    b=[9.81,17.11,10.14,17.32,12.45,9.79,5.88,4.95,7.55,8.50,15.72,14.12,13.38,2.19,34.60,55.86,42.37,54.20,40.75,199.53,453.62,82.92,129.45,47.41,71.99,27.51,38.16,80.26,51.22,67.78,13.05]
    c=[10.36,17.89,10.90,17.95,12.66,9.96,6.27,5.08,7.72,8.57,15.86,14.25,13.45,2.49,35.10,56.48,43.28,54.31,45.25,202.48,457.89,84.69,134.42,48.25,73.19,28.00,41.69,82.51,54.61,69.62,13.19]  
    x = np.arange(size)
    
    total_width, n = 0.8, 3
    width = total_width / n
    
    str1 = ("squeezenet", "squeezenet_int8", "mobilenet", "mobilenet_int8", "mobilenet_v2", "mobilenet_v3", "shufflenet", "shufflenet_v2", "mnasnet", "proxylessnasnet", "efficientnet_b0", "efficientnetv2_b0", "regnety_400m", "blazeface", "googlenet", "googlenet_int8", "resnet18", "resnet18_int8", "alexnet", "vgg16", "vgg16_int8", "resnet50","resnet50_int8", "squeezenet_ssd","squeezenet_ssd_int8", "mobilenet_ssd","mobilenet_ssd_int8", "mobilenet_yolo", "mobilenetv2_yolov3","yolov4-tiny", "nanodet_m")
    
    x = x - (total_width - width) / 2
    
    #plt.bar(x, a, width=width, label='min',tick_label=str1)
    #plt.bar(x+width, b, width=width, label='avg', tick_label=str1)
    #plt.bar(x+2*width, c, width=width, label='max',tick_label=str1)
    plt.bar(x, a, width=width, label='min')
    plt.bar(x+width, b, width=width, label='avg')
    plt.bar(x+2*width, c, width=width, label='max')
    
    #for a, b in zip(x, b):
    #    plt.text(a, b + 0.05, '%.0f' % b, ha='center', va='bottom', fontsize=10)
        
    plt.legend()
    plt.show()
    


     结束!

    展开全文
  • 有些PPT的版式是相对固定的,如果数量巨大的话,可以利用python的pptx插件,与excel相结合,制作PPT。完整工作流有些复杂,所以分为4个部分来说明。PPT准备篇:编辑PPT母版版式梳理PPT样式的种类,然后利用PPT的母版...

    对外汉语课堂中需要制作PPT。有些PPT的版式是相对固定的,如果数量巨大的话,可以利用python的pptx插件,与excel相结合,制作PPT。完整工作流有些复杂,所以分为4个部分来说明。

    PPT准备篇:编辑PPT母版版式

    梳理PPT样式的种类,然后利用PPT的母版版式,制作固定样式的PPT。

    在梳理PPT样式的种类时,要把例句的字数考虑进去,分为短例句样式(一般20个字以内),以及长例句样式(20个字以上)。部分页面还需要超长例句样式(例如整段文本的)。

    PPT母版版式的制作,需要利用占位符来规定文本的位置、字体、字号以及颜色。如果是固定内容(例如角标),可以用文本框+文字的方式实现,这样这个文字就会一直存在,并且不会占据占位符的编号(占位符的编号在Python中有非常重要的作用)。

    完全版本的PPT母版如下:

    Excel篇:利用Excel制作PPT文本

    首先需要有两张工作表(sheet),第一张工作表对应着要导入PPT的文本和版式,第二张工作表对应着版式编号与说明。

    第一张工作表

    第一张工作表需要包含的信息有:母版编号,母版名称,文本,文本字数,占位符的数量。

    母版编号

    在Python读取PPT的母版编号时,支持多个母版,每个母版下可以创建多个版式。编号都是从0开始计算。

    版式编号

    每个母版下都有多个版式,每个版式也有一个编号,从0开始计算。

    版式名称

    这个是为了给文本指定版式用的,是自行编写的,没有系统指定啥的。因为如果不写版式名称的话,指定版式就全部需要版式编号了,而版式编号都是数字,根本分不清是哪个版式,所以用版式名称比较方便。

    以上三类信息,当选择了版式名称后,母版编号与版式名称都可以用vlookup函数从第二张工作表里查找而来。详见第二张工作表说明。

    文本

    把需要呈现在PPT的文本放到单元格里。请注意,一个单元格代表一个占位符。所以如果一页有4个占位符,那么就应该有4个单元格的文本内容。并且单元格的顺序,对应着占位符的顺序。(这就是为什么占位符的编号很重要的原因)

    文本字数

    这是为了判断到底用短例句的版式还是长例句的版式,一般超过20的就用长例句版式。

    占位符数量

    这是为了检查单元格的数量有没有符号某个页面的占位符数量,以防后续python导入的时候报错。

    第二张工作表

    其实就是包含了版式名称、母版编号、版式编号以及占位符数量的“查询表”。

    版式名称

    自编,只要看得懂就行,如上图。

    母版编号

    一个PPT里允许存在多个母版,编号都是从0开始。

    版式编号

    一个母版下有多个版式,编号也是从0开始。

    占位符数量

    人肉填写,根据页面上有多少个占位符,请注意填写了文字的文本框不计入占位符。

    做完Excel的部分,就可以编写Python代码,从而实现将Excel批量生成PPT的功能了。

    Python篇

    代码部分需要用到4个Python插件xlrd:用来读取excel文件

    time:用来计算导出ppt需要多少时间

    pptx:用来读取ppt模板

    clear_format:自己编写的一个函数,用来清洗读取excel单元格的文本之后的格式

    简单说明一下,读取Excel单元格之后,会根据单元格的属性带有字段,例如如果单元格是文本格式,就是这样的: 'text:' XXXXX. 如果是数字格式,就是这样的:'number:'XXXXX。所以先要把这些字段给剔除,利用的是Python的replace方法。

    代码的基本思路如下:读取指定路径下的Excel文档

    读取PPT模板

    根据Excel里的母版编号与版式编号,读取该页的占位符

    读取Excel里的文本,清洗单元格格式

    写入占位符

    写个循环,如果一页有3个占位符,就依次读取3个单元格的文本,分别写入这3个占位符

    退出循环,读取下一个单元格的母版编号与版式编号

    保存退出

    全部代码如下:

    #!/usr/bin/env python3

    # _*_ coding: utf-8 _*_

    # 将Excel的文本按照指定的版式导入PPT

    # 打开PPT

    import xlrd

    import time

    from pptx import Presentation

    from hsk_modules import clear_format

    # 记录开始运行程度的时间

    time_start = time.time()

    # 读取Excel

    workbook_ppt = xlrd.open_workbook('/XXXXX.xlsx')

    sheet_ppt = workbook_ppt.sheet_by_index(0)

    sheet_nrows = sheet_ppt.nrows

    print(sheet_nrows)

    # 读取PPT模板

    prs = Presentation('/PPT模板.pptx')

    brows = 1

    for rows in range(1, sheet_nrows):

    rows = brows

    print(rows)

    if rows in range(1, sheet_nrows):

    ppt_layout = int(clear_format(sheet_ppt.cell(rows, 1))) # 读取版式编号

    ppt_text = clear_format(sheet_ppt.cell(rows, 4)) # 读取单元格文本

    slide_layout = prs.slide_masters[0].slide_layouts[ppt_layout]

    slide = prs.slides.add_slide(slide_layout)

    body_shape = slide.shapes.placeholders

    idx = []

    for shape in slide.placeholders: # 根据占位符写入文本

    idx.append(shape.placeholder_format.idx)

    for shape_idx in idx: # 如果有多个占位符,就读取多个单元格,写入多次

    body_shape[shape_idx].text = clear_format(sheet_ppt.cell(rows, 4))

    rows = rows + 1

    brows = rows

    prs.save('/ppt-output.pptx') # 保存退出

    print('已完成')

    time_end = time.time() # 记录运行结束的时间

    print(time_end-time_start) # 输出程序总耗时

    导出之后的PPT是这样的:

    精修篇

    最后导出的PPT一般是1分钟100页左右,不过还需要精细化调整,比如增加自定义的图形,比如语法结构,示意图,各种图表等等

    根据例句配图

    给关键生词标注颜色

    这个部分根据PPT页数的多少,大概在1个小时左右。

    总结

    总的来说,利用Excel与Python结合导出PPT,能显著降低PPT的不确定性。因为版式都固定,字体、字号、颜色都固定了,所以只要后期添加一些自定义的图形与图片即可。能保证在团队流程中,做出来的PPT也是同一种风格。在大规模的批量化制作中,是非常有利的。

    展开全文
  • 自动生成数据分析报告(PPT格式) 目录说明: py-pptx -auto_report # 核心代码目录 -resources # 资源目录 -data # 数据文件存放目录 -driver # 浏览器驱动位置 -report # 报告生成位置,报告临时文件存放目录 -...
  • python生成ppt的方法

    2021-02-05 05:08:07
    本文主要介绍如何通过python生成ppt文件,以及借助ppt模板来生成ppt环境python 3python-pptx安装 pip3 install python-pptx将文字输出到ppt效果图 代码 from pptx import Presentation# 创建幻灯片 ------prs = ...
  • ↑点击上方“一行数据”关注 + 星标~每周送书,绝不错过生财背景源于一位行友的疑问,下载了一个300页的PPT,格式全都不对,如果要是一个个手动调整的话,可能会疯掉。类似这种需...
  • python可以写PPT

    2020-12-03 13:27:44
    python可以写PPT。方法为:1、输入“pip3 install python-pptx”命令安装python-pptx;2、准备ppt模板(网络下载或自定义幻灯片);3、加载ppt模板并使用指定幻灯片样式;4、添加数据即可生成ppt。简介本文主要介绍...
  • 接触过数据可视化的同学应该对 Python 里的 Matplotlib 库并不陌生。它是一个基于 Python 的开源数据绘图包,仅需几行代码就可以帮助开发者生成直方图、功率谱、条形图、散点图等。这个库里有个非常实用的扩展包——...
  • Python快速将ppt制作成配音视频课件的方法

    千次阅读 多人点赞 2021-06-17 21:03:44
    本文介绍了一种ppt视频课件快速制作的方法,通过将ppt输出成一张张图片,然后逐页配音,最后使用Moviepy将其合成输出,课件制作又快又好。由于采用了分页录音的方式,对于讲解不好的地方很快就可以更换,因此比期望...
  • 使用python生成ppt

    万次阅读 多人点赞 2018-01-03 21:28:51
    本文主要介绍如何通过python生成ppt文件,以及借助ppt模板来生成ppt 环境 python 3 python-pptx 安装 pip3 install python-pptx 将文字输出到ppt 效果图 代码 from pptx import Presentation # 创建...
  • 本文主要介绍如何通过python生成ppt文件,以及借助ppt模板来生成ppt环境python 3python-pptx安装pip3 install python-pptx将文字输出到ppt效果图代码from pptx import Presentation# 创建幻灯片 ------prs = ...
  • python 爬虫入门ppt

    2018-11-24 01:30:02
    很好的资源,适合想入门 python 爬虫的同学,讲解很细,重点突出。
  • ==python制作ppt篇一:中谷教育Python学习笔记程序中有中文:#coding: utf-8从键盘读取:b = int ( raw_input('please input华氏温度:') )注意数据类型5.0/9type()查看变量数据类型字符串类型:1...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 5,898
精华内容 2,359
关键字:

python制作ppt

python 订阅