引言

++最近有用到做自动化ppt相关的功能,简单记录一下实现过程的部分操作。++

0 pptx的结构
pptx的存储本质上是一颗树

flowchart LR
    pptx --> slides --> shapes --> 组内shapes
    pptx --> 幻灯片 --> 模块形状 --> 复合形状内部的形状

1 相关操作
1.1 创建一个pptx类

from pptx import Presentation
ppt_model = Presentation(pptx='path')

1.2 访问pptx的每一个幻灯片

# 根据位置取出slide
slide1 = ppt_model.slides[0]
# 访问每一个slide
for slide in ppt_model.slides:
    pass

1.3 访问幻灯片下的形状

shape = shapes[0]
# 遍历每一个shape
for shape in slide.shapes:
    print(shape.text)

[注] 并非所有的shape都有text属性,一般具有文本框的shape才有text属性,图表一般没有

1.4 访问shape下的不同属性
1.4.1 shape.text

shape.text = '文本1'

1.4.2 shape.text_frame
修改此属性下的不同属性可以对text文本进行定制化操作

from pptx.util import Pt, Inches
# 修改文字属性
for paragraph in shape.text_frame.paragraphs:
    for run in paragraph.runs:
        # 设置字体大小为18磅
        run.font.size  = Pt(18)
        # 设置字体为加粗格式
        run.font.bold = True

1.5 chart
1.5.1 创建和删除

from pptx.enum.chart import XL_CHART_TYPE
from pptx.chart.data import ChartData
# 删除当前图表
model.slides[i].shapes._spTree.remove(shape.element)
# 创一个新图表
chart = model.slides[i].shapes.add_chart(
    chart_type=XL_CHART_TYPE.LINE, # 图表类型-折线
    x=left, # 左侧边距
    y=top, # 顶部边距
    cx=width, # 宽度
    cy=height, # 高度
    chart_data=chart_data: ChartData()
)

1.5.2 chart_data

from pptx.chart.data import ChartData
# 创建一个新数据类型
chart_data = ChartData()
# 横轴刻度
chart_data.categories = categories: list[]
# 增加一条线的数据
chart_data.add_series(
    name= name: str,
    values=values: list[],
    number_format=None,
)
# 插入多条数据线
for i in range(k):
    chart_data.add_series(name, values[k])
【注】个人建议先插入数据画图,数据线属性的修改放在后面


1.5.3 CategoryAxis
图表的类别轴。

category_axis = CategoryAxis
# 刻度标记格式修改
tick_labels = category_axis.tick_labels

1.5.4 Y axis
值轴,也就是Y轴的设定

from pptx.enum.chart import XL_TICL_MARK
value_axis = shapes.chart.value_axis
# 设定主刻度线的间隔为0.1
value_axis.major_unit = 0.1

# 设置次刻度线是否隐藏
value_axis.minor_tick_mark = XL_TICL_MARK.NONE

# 网格样式修改
# 主/次要网格线是否可见
value_axis.has_major_gridlines = False
value_axis.has_minor_gridlines = False

# 刻度标记格式修改
value_axis.has_tick_labels = False
# 设定最小刻度
value_axis.minimum_scale = num: float
# 设定最大刻度
value_axis.maximum_scale = num: float
# 设定显示的刻度间隔
value_axis.major_unit = num: float
# 刻度标记的数字格式0.5-1.0-1.5 一旦设定格式显示的刻度间隔会自动匹配格式,如0.8变成1.0
value_axis.tick_labels.number_format='0.5'
# 文字属性
value_axis.tick_labels.font.size=Pt(8)
# 刻度标签与轴之间的距离
value_axis.tick_labels.offset

# 刻度线的形状和颜色-ChartFormat对象实例
format = value_axis.format

1.5.5 tick_labels

1.5.6 chart.legend
修改图例的相关属性

from pptx.enum.chart import XL_LEGEND_POSITION
# 是否显示图列
chart.has_legend = True 
# 图例的字体相关设定
font = chart.legend.font
font.name='Times New Roman'
font.size = Pt(8)
# 图例的位置(默认值位置)
chart.legend.position = XL_LEGEND_POSITION.BOTTOM
# 从图例的默认位置移动,表示为-1.0和1.0之间的浮点数,表示图表宽度的一部分。
chart.legend.horz_offset = -0.1
# 是否在绘图区域放置图例
chart.legend.include_in_layout = True

 posted on 2024-07-12 16:51  mappleyan  阅读(24)  评论(0编辑  收藏  举报