Python使用python-pptx自動(dòng)化操作和生成PPT
在現(xiàn)代商業(yè)和教育環(huán)境中,PowerPoint演示文稿是信息傳遞的重要工具。通過(guò)Python自動(dòng)化PPT創(chuàng)建和編輯過(guò)程,可以大幅提高工作效率,特別是在需要批量生成或更新演示文稿的場(chǎng)景下。本文將介紹如何使用python-pptx庫(kù)實(shí)現(xiàn)PPT自動(dòng)化,并提供實(shí)用的代碼示例和應(yīng)用場(chǎng)景。
使用python-pptx操作PPT文檔
安裝python-pptx
pip install python-pptx
基礎(chǔ)概念
在Python中,可以使用python-pptx庫(kù)實(shí)現(xiàn)PPT文件的自動(dòng)化操作。需要注意的是,python-pptx只支持*.pptx文件格式的PPT文件(Office 2007及以上版本)。
一個(gè)PPT文件通常由多個(gè)幻燈片組成,每個(gè)幻燈片都有相應(yīng)的布局。通過(guò)python-pptx庫(kù)創(chuàng)建PPT文件的過(guò)程其實(shí)就是創(chuàng)建一個(gè)空的PPT文件,然后不斷向其中添加具有某種布局的幻燈片的過(guò)程。
創(chuàng)建新的PPT文檔
from pptx import Presentation
from pptx.util import Inches, Pt
from pptx.enum.text import PP_ALIGN
from pptx.dml.color import RGBColor
def create_simple_presentation():
"""創(chuàng)建一個(gè)簡(jiǎn)單的PPT演示文稿"""
# 創(chuàng)建演示文稿對(duì)象
prs = Presentation()
# 獲取第一個(gè)布局(標(biāo)題幻燈片)
title_slide_layout = prs.slide_layouts[0]
# 添加標(biāo)題幻燈片
slide = prs.slides.add_slide(title_slide_layout)
# 設(shè)置標(biāo)題和副標(biāo)題
title = slide.shapes.title
subtitle = slide.placeholders[1]
title.text = "Python自動(dòng)化辦公"
subtitle.text = "使用python-pptx創(chuàng)建精美演示文稿"
# 添加內(nèi)容幻燈片
bullet_slide_layout = prs.slide_layouts[1] # 標(biāo)題和內(nèi)容布局
slide = prs.slides.add_slide(bullet_slide_layout)
# 設(shè)置標(biāo)題
title = slide.shapes.title
title.text = "python-pptx的主要功能"
# 設(shè)置內(nèi)容(項(xiàng)目符號(hào)列表)
content = slide.placeholders[1]
tf = content.text_frame
# 添加項(xiàng)目符號(hào)
tf.text = "創(chuàng)建和編輯幻燈片"
p = tf.add_paragraph()
p.text = "添加文本、圖片和形狀"
p.level = 1 # 縮進(jìn)級(jí)別
p = tf.add_paragraph()
p.text = "創(chuàng)建表格和圖表"
p.level = 1
p = tf.add_paragraph()
p.text = "應(yīng)用主題和樣式"
p.level = 0 # 恢復(fù)到第一級(jí)
# 保存演示文稿
prs.save("簡(jiǎn)單演示文稿.pptx")
print("演示文稿已保存為: 簡(jiǎn)單演示文稿.pptx")
# 執(zhí)行函數(shù)
create_simple_presentation()
查看可用的幻燈片布局
from pptx import Presentation
def explore_slide_layouts():
"""查看可用的幻燈片布局"""
prs = Presentation()
print("可用的幻燈片布局:")
for i, layout in enumerate(prs.slide_layouts):
# 獲取布局名稱(chēng)
layout_name = "未命名布局"
for shape in layout.placeholders:
if shape.is_title:
layout_name = f"布局 {i} - {shape.text if shape.text else '標(biāo)題布局'}"
break
print(f"索引 {i}: {layout_name}")
print(" 占位符:")
for shape in layout.placeholders:
print(f" 索引 {shape.placeholder_format.idx}: {shape.name}")
print("\n常用布局索引參考:")
print("0 - 標(biāo)題幻燈片")
print("1 - 標(biāo)題和內(nèi)容")
print("2 - 節(jié)標(biāo)題")
print("3 - 兩欄內(nèi)容")
print("4 - 比較")
print("5 - 僅標(biāo)題")
print("6 - 空白")
print("7 - 標(biāo)題和對(duì)象")
print("8 - 對(duì)象和標(biāo)題")
# 執(zhí)行函數(shù)
# explore_slide_layouts()
添加文本框和格式化文本
from pptx import Presentation
from pptx.util import Inches, Pt
from pptx.enum.text import PP_ALIGN
from pptx.dml.color import RGBColor
def create_formatted_text_slide():
"""創(chuàng)建包含格式化文本的幻燈片"""
prs = Presentation()
# 添加空白幻燈片
blank_slide_layout = prs.slide_layouts[6]
slide = prs.slides.add_slide(blank_slide_layout)
# 添加標(biāo)題文本框
left = Inches(1)
top = Inches(0.5)
width = Inches(8)
height = Inches(1)
txBox = slide.shapes.add_textbox(left, top, width, height)
tf = txBox.text_frame
# 設(shè)置文本
p = tf.paragraphs[0]
p.text = "格式化文本示例"
p.alignment = PP_ALIGN.CENTER
# 設(shè)置字體格式
run = p.runs[0]
run.font.bold = True
run.font.size = Pt(44)
run.font.color.rgb = RGBColor(0, 112, 192) # 藍(lán)色
# 添加正文文本框
left = Inches(1)
top = Inches(2)
width = Inches(8)
height = Inches(4)
txBox = slide.shapes.add_textbox(left, top, width, height)
tf = txBox.text_frame
# 添加段落并設(shè)置格式
p = tf.paragraphs[0]
p.text = "這是第一段文本,演示基本格式。"
# 添加第二段
p = tf.add_paragraph()
p.text = "這是第二段,演示不同的字體樣式。"
# 添加帶有多種格式的段落
p = tf.add_paragraph()
p.text = "" # 先創(chuàng)建空段落
# 添加不同格式的文本
run = p.add_run()
run.text = "這部分文本是"
run = p.add_run()
run.text = "粗體"
run.font.bold = True
run = p.add_run()
run.text = ",這部分是"
run = p.add_run()
run.text = "斜體"
run.font.italic = True
run = p.add_run()
run.text = ",這部分是"
run = p.add_run()
run.text = "紅色"
run.font.color.rgb = RGBColor(255, 0, 0)
run = p.add_run()
run.text = ",這部分是"
run = p.add_run()
run.text = "大號(hào)字體"
run.font.size = Pt(24)
# 保存演示文稿
prs.save("格式化文本演示.pptx")
print("演示文稿已保存為: 格式化文本演示.pptx")
# 執(zhí)行函數(shù)
# create_formatted_text_slide()
插入圖片
from pptx import Presentation
from pptx.util import Inches
def add_picture_to_slide():
"""向幻燈片中添加圖片"""
prs = Presentation()
# 添加標(biāo)題和內(nèi)容布局的幻燈片
slide_layout = prs.slide_layouts[1]
slide = prs.slides.add_slide(slide_layout)
# 設(shè)置標(biāo)題
title = slide.shapes.title
title.text = "插入圖片示例"
# 添加圖片
# 注意:請(qǐng)確保圖片文件存在,或替換為實(shí)際的圖片路徑
try:
left = Inches(1)
top = Inches(2)
pic_path = "example_image.jpg" # 替換為實(shí)際圖片路徑
# 添加圖片并設(shè)置大小
pic = slide.shapes.add_picture(pic_path, left, top, width=Inches(4))
# 在圖片下方添加說(shuō)明文字
left = Inches(1)
top = Inches(5)
width = Inches(4)
height = Inches(1)
txBox = slide.shapes.add_textbox(left, top, width, height)
tf = txBox.text_frame
tf.text = "圖片說(shuō)明:這是一個(gè)示例圖片"
except Exception as e:
# 如果圖片不存在,添加錯(cuò)誤提示
content = slide.placeholders[1]
tf = content.text_frame
tf.text = f"圖片添加失敗: {e}\n\n請(qǐng)確保圖片文件存在,或替換為實(shí)際的圖片路徑。"
# 保存演示文稿
prs.save("圖片演示.pptx")
print("演示文稿已保存為: 圖片演示.pptx")
# 執(zhí)行函數(shù)
# add_picture_to_slide()
添加形狀
from pptx import Presentation
from pptx.util import Inches
from pptx.enum.shapes import MSO_SHAPE
from pptx.dml.color import RGBColor
def add_shapes_to_slide():
"""向幻燈片中添加各種形狀"""
prs = Presentation()
# 添加空白幻燈片
blank_slide_layout = prs.slide_layouts[6]
slide = prs.slides.add_slide(blank_slide_layout)
# 添加標(biāo)題
left = Inches(1)
top = Inches(0.5)
width = Inches(8)
height = Inches(1)
txBox = slide.shapes.add_textbox(left, top, width, height)
tf = txBox.text_frame
tf.text = "各種形狀示例"
tf.paragraphs[0].alignment = PP_ALIGN.CENTER
tf.paragraphs[0].runs[0].font.bold = True
tf.paragraphs[0].runs[0].font.size = Pt(32)
# 添加矩形
left = Inches(1)
top = Inches(2)
width = Inches(2)
height = Inches(1)
shape = slide.shapes.add_shape(
MSO_SHAPE.RECTANGLE, left, top, width, height
)
shape.fill.solid()
shape.fill.fore_color.rgb = RGBColor(255, 0, 0) # 紅色
shape.line.color.rgb = RGBColor(0, 0, 0) # 黑色邊框
# 添加橢圓
left = Inches(4)
top = Inches(2)
width = Inches(2)
height = Inches(1)
shape = slide.shapes.add_shape(
MSO_SHAPE.OVAL, left, top, width, height
)
shape.fill.solid()
shape.fill.fore_color.rgb = RGBColor(0, 176, 80) # 綠色
shape.line.color.rgb = RGBColor(0, 0, 0) # 黑色邊框
# 添加五角星
left = Inches(7)
top = Inches(2)
width = Inches(1.5)
height = Inches(1.5)
shape = slide.shapes.add_shape(
MSO_SHAPE.STAR_5_POINT, left, top, width, height
)
shape.fill.solid()
shape.fill.fore_color.rgb = RGBColor(255, 192, 0) # 黃色
shape.line.color.rgb = RGBColor(0, 0, 0) # 黑色邊框
# 添加箭頭
left = Inches(1)
top = Inches(4)
width = Inches(2)
height = Inches(1)
shape = slide.shapes.add_shape(
MSO_SHAPE.ARROW_RIGHT, left, top, width, height
)
shape.fill.solid()
shape.fill.fore_color.rgb = RGBColor(0, 112, 192) # 藍(lán)色
# 添加帶文本的形狀
left = Inches(4)
top = Inches(4)
width = Inches(4)
height = Inches(1)
shape = slide.shapes.add_shape(
MSO_SHAPE.ROUNDED_RECTANGLE, left, top, width, height
)
shape.fill.solid()
shape.fill.fore_color.rgb = RGBColor(112, 48, 160) # 紫色
# 向形狀中添加文本
tf = shape.text_frame
tf.text = "帶文本的形狀"
tf.paragraphs[0].alignment = PP_ALIGN.CENTER
tf.paragraphs[0].runs[0].font.color.rgb = RGBColor(255, 255, 255) # 白色文字
# 保存演示文稿
prs.save("形狀演示.pptx")
print("演示文稿已保存為: 形狀演示.pptx")
# 執(zhí)行函數(shù)
# add_shapes_to_slide()
創(chuàng)建表格
from pptx import Presentation
from pptx.util import Inches, Pt
from pptx.enum.text import PP_ALIGN
from pptx.dml.color import RGBColor
def create_table_slide():
"""創(chuàng)建包含表格的幻燈片"""
prs = Presentation()
# 添加標(biāo)題和內(nèi)容布局的幻燈片
slide_layout = prs.slide_layouts[5] # 僅標(biāo)題布局
slide = prs.slides.add_slide(slide_layout)
# 設(shè)置標(biāo)題
title = slide.shapes.title
title.text = "銷(xiāo)售數(shù)據(jù)表格"
# 定義表格位置和大小
left = Inches(1.5)
top = Inches(2)
width = Inches(7)
height = Inches(3)
# 創(chuàng)建表格 (4行3列)
rows, cols = 4, 3
table = slide.shapes.add_table(rows, cols, left, top, width, height).table
# 設(shè)置列寬
table.columns[0].width = Inches(3)
table.columns[1].width = Inches(2)
table.columns[2].width = Inches(2)
# 填充表頭
headers = ['產(chǎn)品名稱(chēng)', '銷(xiāo)售數(shù)量', '銷(xiāo)售金額']
for i, header in enumerate(headers):
cell = table.cell(0, i)
cell.text = header
# 設(shè)置表頭格式
cell.fill.solid()
cell.fill.fore_color.rgb = RGBColor(0, 112, 192) # 藍(lán)色背景
paragraph = cell.text_frame.paragraphs[0]
paragraph.alignment = PP_ALIGN.CENTER
paragraph.font.bold = True
paragraph.font.color.rgb = RGBColor(255, 255, 255) # 白色文字
# 填充數(shù)據(jù)
data = [
['筆記本電腦', '120臺(tái)', '¥720,000'],
['辦公桌椅', '200套', '¥180,000'],
['打印機(jī)', '45臺(tái)', '¥58,500']
]
for row_idx, row_data in enumerate(data):
for col_idx, cell_text in enumerate(row_data):
cell = table.cell(row_idx + 1, col_idx)
cell.text = cell_text
# 設(shè)置單元格格式
paragraph = cell.text_frame.paragraphs[0]
if col_idx == 0:
paragraph.alignment = PP_ALIGN.LEFT
else:
paragraph.alignment = PP_ALIGN.CENTER
# 保存演示文稿
prs.save("表格演示.pptx")
print("演示文稿已保存為: 表格演示.pptx")
# 執(zhí)行函數(shù)
# create_table_slide()
插入圖表
from pptx import Presentation
from pptx.util import Inches
from pptx.enum.chart import XL_CHART_TYPE
from pptx.chart.data import CategoryChartData
def create_chart_slide():
"""創(chuàng)建包含圖表的幻燈片"""
prs = Presentation()
# 添加標(biāo)題和內(nèi)容布局的幻燈片
slide_layout = prs.slide_layouts[5] # 僅標(biāo)題布局
slide = prs.slides.add_slide(slide_layout)
# 設(shè)置標(biāo)題
title = slide.shapes.title
title.text = "季度銷(xiāo)售數(shù)據(jù)圖表"
# 創(chuàng)建圖表數(shù)據(jù)
chart_data = CategoryChartData()
chart_data.categories = ['第一季度', '第二季度', '第三季度', '第四季度']
chart_data.add_series('筆記本電腦', (120, 95, 150, 180))
chart_data.add_series('辦公桌椅', (70, 120, 85, 90))
chart_data.add_series('打印機(jī)', (30, 25, 45, 55))
# 添加柱狀圖
x, y, cx, cy = Inches(1), Inches(2), Inches(8), Inches(4.5)
chart = slide.shapes.add_chart(
XL_CHART_TYPE.COLUMN_CLUSTERED, x, y, cx, cy, chart_data
).chart
# 設(shè)置圖表標(biāo)題
chart.has_title = True
chart.chart_title.text_frame.text = "季度銷(xiāo)售數(shù)量對(duì)比"
# 保存演示文稿
prs.save("圖表演示.pptx")
print("演示文稿已保存為: 圖表演示.pptx")
# 創(chuàng)建第二張幻燈片,展示餅圖
slide = prs.slides.add_slide(slide_layout)
title = slide.shapes.title
title.text = "第四季度銷(xiāo)售占比"
# 創(chuàng)建餅圖數(shù)據(jù)
chart_data = CategoryChartData()
chart_data.categories = ['筆記本電腦', '辦公桌椅', '打印機(jī)']
chart_data.add_series('銷(xiāo)售額', (720000, 180000, 58500))
# 添加餅圖
x, y, cx, cy = Inches(2), Inches(2), Inches(6), Inches(4.5)
chart = slide.shapes.add_chart(
XL_CHART_TYPE.PIE, x, y, cx, cy, chart_data
).chart
# 設(shè)置圖表標(biāo)題
chart.has_title = True
chart.chart_title.text_frame.text = "第四季度銷(xiāo)售額占比"
# 保存更新后的演示文稿
prs.save("圖表演示.pptx")
# 執(zhí)行函數(shù)
# create_chart_slide()
模板復(fù)用與批量生成
使用模板創(chuàng)建演示文稿
from pptx import Presentation
from pptx.util import Inches
def use_template():
"""使用模板創(chuàng)建演示文稿"""
# 加載模板文件
# 注意:請(qǐng)確保模板文件存在,或替換為實(shí)際的模板路徑
try:
template_path = "template.pptx" # 替換為實(shí)際模板路徑
prs = Presentation(template_path)
# 添加新幻燈片(使用模板中的布局)
slide_layout = prs.slide_layouts[1] # 假設(shè)使用第二種布局
slide = prs.slides.add_slide(slide_layout)
# 設(shè)置標(biāo)題和內(nèi)容
title = slide.shapes.title
content = slide.placeholders[1]
title.text = "使用模板創(chuàng)建的幻燈片"
tf = content.text_frame
tf.text = "使用模板的優(yōu)勢(shì):"
p = tf.add_paragraph()
p.text = "保持一致的品牌形象"
p.level = 1
p = tf.add_paragraph()
p.text = "節(jié)省設(shè)計(jì)時(shí)間"
p.level = 1
p = tf.add_paragraph()
p.text = "確保專(zhuān)業(yè)的外觀"
p.level = 1
# 保存演示文稿
prs.save("基于模板的演示文稿.pptx")
print("演示文稿已保存為: 基于模板的演示文稿.pptx")
except Exception as e:
print(f"使用模板創(chuàng)建演示文稿失敗: {e}")
print("請(qǐng)確保模板文件存在,或替換為實(shí)際的模板路徑。")
# 如果模板不存在,創(chuàng)建一個(gè)新的演示文稿作為示例
create_template_example()
def create_template_example():
"""創(chuàng)建一個(gè)模板示例"""
prs = Presentation()
# 設(shè)置幻燈片尺寸為寬屏(16:9)
prs.slide_width = Inches(13.33)
prs.slide_height = Inches(7.5)
# 添加標(biāo)題幻燈片
slide_layout = prs.slide_layouts[0]
slide = prs.slides.add_slide(slide_layout)
# 設(shè)置標(biāo)題和副標(biāo)題
title = slide.shapes.title
subtitle = slide.placeholders[1]
title.text = "公司季度報(bào)告模板"
subtitle.text = "2023年第四季度"
# 添加內(nèi)容幻燈片
slide_layout = prs.slide_layouts[1]
slide = prs.slides.add_slide(slide_layout)
# 設(shè)置標(biāo)題和內(nèi)容
title = slide.shapes.title
content = slide.placeholders[1]
title.text = "季度目標(biāo)"
tf = content.text_frame
tf.text = "主要業(yè)務(wù)目標(biāo):"
p = tf.add_paragraph()
p.text = "提高銷(xiāo)售額 15%"
p.level = 1
p = tf.add_paragraph()
p.text = "拓展兩個(gè)新市場(chǎng)"
p.level = 1
p = tf.add_paragraph()
p.text = "推出新產(chǎn)品線(xiàn)"
p.level = 1
# 保存為模板
prs.save("template.pptx")
print("模板已創(chuàng)建: template.pptx")
print("您可以修改此模板,然后再次運(yùn)行use_template()函數(shù)。")
# 執(zhí)行函數(shù)
# use_template()
批量生成演示文稿
from pptx import Presentation
from pptx.util import Inches, Pt
from pptx.enum.text import PP_ALIGN
from pptx.dml.color import RGBColor
import os
def batch_generate_presentations(data_list):
"""批量生成演示文稿"""
# 創(chuàng)建輸出目錄
output_dir = "generated_presentations"
if not os.path.exists(output_dir):
os.makedirs(output_dir)
# 加載模板(如果存在)
template_path = "template.pptx"
template_exists = os.path.exists(template_path)
for idx, data in enumerate(data_list):
# 創(chuàng)建演示文稿(使用模板或創(chuàng)建新的)
if template_exists:
prs = Presentation(template_path)
else:
prs = Presentation()
# 添加標(biāo)題幻燈片
slide_layout = prs.slide_layouts[0]
slide = prs.slides.add_slide(slide_layout)
# 設(shè)置標(biāo)題和副標(biāo)題
title = slide.shapes.title
subtitle = slide.placeholders[1]
title.text = data['title']
subtitle.text = data['subtitle']
# 添加內(nèi)容幻燈片 - 項(xiàng)目概述
slide_layout = prs.slide_layouts[1]
slide = prs.slides.add_slide(slide_layout)
title = slide.shapes.title
content = slide.placeholders[1]
title.text = "項(xiàng)目概述"
tf = content.text_frame
tf.text = data['overview']
# 添加內(nèi)容幻燈片 - 關(guān)鍵數(shù)據(jù)
slide_layout = prs.slide_layouts[1]
slide = prs.slides.add_slide(slide_layout)
title = slide.shapes.title
title.text = "關(guān)鍵數(shù)據(jù)"
# 創(chuàng)建表格
left = Inches(2)
top = Inches(2)
width = Inches(6)
height = Inches(2)
# 創(chuàng)建表格 (4行2列)
rows, cols = len(data['key_metrics']) + 1, 2
table = slide.shapes.add_table(rows, cols, left, top, width, height).table
# 設(shè)置表頭
cell = table.cell(0, 0)
cell.text = "指標(biāo)"
cell.fill.solid()
cell.fill.fore_color.rgb = RGBColor(0, 112, 192) # 藍(lán)色背景
cell.text_frame.paragraphs[0].font.color.rgb = RGBColor(255, 255, 255) # 白色文字
cell = table.cell(0, 1)
cell.text = "數(shù)值"
cell.fill.solid()
cell.fill.fore_color.rgb = RGBColor(0, 112, 192) # 藍(lán)色背景
cell.text_frame.paragraphs[0].font.color.rgb = RGBColor(255, 255, 255) # 白色文字
# 填充數(shù)據(jù)
for i, (metric, value) in enumerate(data['key_metrics'].items()):
table.cell(i + 1, 0).text = metric
table.cell(i + 1, 1).text = str(value)
# 添加內(nèi)容幻燈片 - 結(jié)論
slide_layout = prs.slide_layouts[1]
slide = prs.slides.add_slide(slide_layout)
title = slide.shapes.title
content = slide.placeholders[1]
title.text = "結(jié)論與建議"
tf = content.text_frame
for i, point in enumerate(data['conclusions']):
if i == 0:
tf.text = point
else:
p = tf.add_paragraph()
p.text = point
# 保存演示文稿
output_file = os.path.join(output_dir, f"{data['filename']}.pptx")
prs.save(output_file)
print(f"已生成演示文稿: {output_file}")
# 示例數(shù)據(jù)
project_data = [
{
'title': "A項(xiàng)目季度報(bào)告",
'subtitle': "2023年第四季度",
'overview': "A項(xiàng)目是我們的核心業(yè)務(wù)項(xiàng)目,專(zhuān)注于提供企業(yè)級(jí)數(shù)據(jù)分析解決方案。",
'key_metrics': {
'客戶(hù)數(shù)量': 45,
'收入增長(zhǎng)': "23%",
'客戶(hù)滿(mǎn)意度': "92%",
'市場(chǎng)份額': "18%"
},
'conclusions': [
"A項(xiàng)目在本季度表現(xiàn)優(yōu)異,超過(guò)預(yù)期目標(biāo)。",
"建議增加研發(fā)投入,進(jìn)一步提升產(chǎn)品競(jìng)爭(zhēng)力。",
"計(jì)劃在下一季度拓展國(guó)際市場(chǎng)。"
],
'filename': "A項(xiàng)目報(bào)告"
},
{
'title': "B項(xiàng)目季度報(bào)告",
'subtitle': "2023年第四季度",
'overview': "B項(xiàng)目是我們的創(chuàng)新孵化項(xiàng)目,專(zhuān)注于人工智能技術(shù)在辦公自動(dòng)化領(lǐng)域的應(yīng)用。",
'key_metrics': {
'用戶(hù)數(shù)量': 1200,
'收入增長(zhǎng)': "45%",
'活躍度': "78%",
'轉(zhuǎn)化率': "8.5%"
},
'conclusions': [
"B項(xiàng)目增長(zhǎng)迅速,用戶(hù)反饋積極。",
"需要解決部分性能問(wèn)題,提高系統(tǒng)穩(wěn)定性。",
"建議增加營(yíng)銷(xiāo)預(yù)算,擴(kuò)大用戶(hù)基礎(chǔ)。"
],
'filename': "B項(xiàng)目報(bào)告"
}
]
# 執(zhí)行批量生成
# batch_generate_presentations(project_data)
實(shí)際應(yīng)用場(chǎng)景
場(chǎng)景一:自動(dòng)生成銷(xiāo)售報(bào)告
from pptx import Presentation
from pptx.util import Inches, Pt
from pptx.enum.text import PP_ALIGN
from pptx.dml.color import RGBColor
from pptx.enum.chart import XL_CHART_TYPE
from pptx.chart.data import CategoryChartData
import pandas as pd
import os
from datetime import datetime
def generate_sales_report(sales_data_file):
"""根據(jù)銷(xiāo)售數(shù)據(jù)自動(dòng)生成銷(xiāo)售報(bào)告演示文稿"""
# 讀取銷(xiāo)售數(shù)據(jù)
try:
df = pd.read_excel(sales_data_file)
except Exception as e:
print(f"讀取銷(xiāo)售數(shù)據(jù)失敗: {e}")
print("創(chuàng)建示例數(shù)據(jù)進(jìn)行演示...")
# 創(chuàng)建示例數(shù)據(jù)
data = {
'日期': pd.date_range(start='2023-10-01', periods=12, freq='W'),
'產(chǎn)品': ['筆記本電腦', '辦公桌椅', '打印機(jī)', '筆記本電腦', '辦公桌椅', '打印機(jī)',
'筆記本電腦', '辦公桌椅', '打印機(jī)', '筆記本電腦', '辦公桌椅', '打印機(jī)'],
'銷(xiāo)售量': [25, 40, 10, 30, 35, 8, 28, 42, 12, 35, 38, 15],
'銷(xiāo)售額': [150000, 36000, 13000, 180000, 31500, 10400, 168000, 37800, 15600, 210000, 34200, 19500]
}
df = pd.DataFrame(data)
# 保存示例數(shù)據(jù)
df.to_excel("sales_data_example.xlsx", index=False)
sales_data_file = "sales_data_example.xlsx"
print(f"已創(chuàng)建示例數(shù)據(jù)文件: {sales_data_file}")
# 創(chuàng)建演示文稿
prs = Presentation()
# 設(shè)置幻燈片尺寸為寬屏(16:9)
prs.slide_width = Inches(13.33)
prs.slide_height = Inches(7.5)
# 添加標(biāo)題幻燈片
slide_layout = prs.slide_layouts[0]
slide = prs.slides.add_slide(slide_layout)
# 獲取當(dāng)前日期
current_date = datetime.now().strftime("%Y年%m月%d日")
# 設(shè)置標(biāo)題和副標(biāo)題
title = slide.shapes.title
subtitle = slide.placeholders[1]
title.text = "銷(xiāo)售業(yè)績(jī)報(bào)告"
subtitle.text = f"生成日期: {current_date}"
# 數(shù)據(jù)處理 - 按產(chǎn)品分組統(tǒng)計(jì)
product_sales = df.groupby('產(chǎn)品').agg({'銷(xiāo)售量': 'sum', '銷(xiāo)售額': 'sum'}).reset_index()
# 添加銷(xiāo)售總覽幻燈片
slide_layout = prs.slide_layouts[5] # 僅標(biāo)題布局
slide = prs.slides.add_slide(slide_layout)
title = slide.shapes.title
title.text = "銷(xiāo)售總覽"
# 創(chuàng)建表格
rows, cols = len(product_sales) + 1, 3
left = Inches(2)
top = Inches(2)
width = Inches(9)
height = Inches(0.8 * rows)
table = slide.shapes.add_table(rows, cols, left, top, width, height).table
# 設(shè)置列寬
table.columns[0].width = Inches(3)
table.columns[1].width = Inches(3)
table.columns[2].width = Inches(3)
# 添加表頭
headers = ['產(chǎn)品', '總銷(xiāo)售量', '總銷(xiāo)售額']
for i, header in enumerate(headers):
cell = table.cell(0, i)
cell.text = header
cell.fill.solid()
cell.fill.fore_color.rgb = RGBColor(0, 112, 192) # 藍(lán)色背景
paragraph = cell.text_frame.paragraphs[0]
paragraph.alignment = PP_ALIGN.CENTER
paragraph.font.bold = True
paragraph.font.color.rgb = RGBColor(255, 255, 255) # 白色文字
# 填充數(shù)據(jù)
for i, row in product_sales.iterrows():
table.cell(i + 1, 0).text = row['產(chǎn)品']
table.cell(i + 1, 1).text = str(row['銷(xiāo)售量'])
table.cell(i + 1, 2).text = f"¥{row['銷(xiāo)售額']:,.2f}"
# 設(shè)置對(duì)齊方式
table.cell(i + 1, 0).text_frame.paragraphs[0].alignment = PP_ALIGN.LEFT
table.cell(i + 1, 1).text_frame.paragraphs[0].alignment = PP_ALIGN.CENTER
table.cell(i + 1, 2).text_frame.paragraphs[0].alignment = PP_ALIGN.RIGHT
# 添加銷(xiāo)售趨勢(shì)圖幻燈片
slide_layout = prs.slide_layouts[5] # 僅標(biāo)題布局
slide = prs.slides.add_slide(slide_layout)
title = slide.shapes.title
title.text = "銷(xiāo)售趨勢(shì)"
# 數(shù)據(jù)處理 - 按日期分組統(tǒng)計(jì)
df['周'] = df['日期'].dt.strftime('%m-%d')
weekly_sales = df.groupby('周').agg({'銷(xiāo)售額': 'sum'}).reset_index()
# 創(chuàng)建圖表數(shù)據(jù)
chart_data = CategoryChartData()
chart_data.categories = weekly_sales['周'].tolist()
chart_data.add_series('銷(xiāo)售額', weekly_sales['銷(xiāo)售額'].tolist())
# 添加折線(xiàn)圖
x, y, cx, cy = Inches(2), Inches(2), Inches(9), Inches(4.5)
chart = slide.shapes.add_chart(
XL_CHART_TYPE.LINE, x, y, cx, cy, chart_data
).chart
# 設(shè)置圖表標(biāo)題
chart.has_title = True
chart.chart_title.text_frame.text = "周銷(xiāo)售額趨勢(shì)"
# 添加產(chǎn)品占比幻燈片
slide_layout = prs.slide_layouts[5] # 僅標(biāo)題布局
slide = prs.slides.add_slide(slide_layout)
title = slide.shapes.title
title.text = "產(chǎn)品銷(xiāo)售占比"
# 創(chuàng)建餅圖數(shù)據(jù)
chart_data = CategoryChartData()
chart_data.categories = product_sales['產(chǎn)品'].tolist()
chart_data.add_series('銷(xiāo)售額', product_sales['銷(xiāo)售額'].tolist())
# 添加餅圖
x, y, cx, cy = Inches(2), Inches(2), Inches(6), Inches(4.5)
chart = slide.shapes.add_chart(
XL_CHART_TYPE.PIE, x, y, cx, cy, chart_data
).chart
# 設(shè)置圖表標(biāo)題
chart.has_title = True
chart.chart_title.text_frame.text = "銷(xiāo)售額占比"
# 添加結(jié)論幻燈片
slide_layout = prs.slide_layouts[1] # 標(biāo)題和內(nèi)容布局
slide = prs.slides.add_slide(slide_layout)
title = slide.shapes.title
content = slide.placeholders[1]
title.text = "分析與建議"
# 計(jì)算一些基本統(tǒng)計(jì)數(shù)據(jù)
total_sales = df['銷(xiāo)售額'].sum()
best_product = product_sales.loc[product_sales['銷(xiāo)售額'].idxmax()]['產(chǎn)品']
best_product_sales = product_sales['銷(xiāo)售額'].max()
best_product_percentage = (best_product_sales / total_sales) * 100
# 添加分析內(nèi)容
tf = content.text_frame
tf.text = f"總銷(xiāo)售額: ¥{total_sales:,.2f}"
p = tf.add_paragraph()
p.text = f"最暢銷(xiāo)產(chǎn)品: {best_product},占總銷(xiāo)售額的 {best_product_percentage:.1f}%"
p = tf.add_paragraph()
p.text = "建議:"
p = tf.add_paragraph()
p.text = f"增加{best_product}的庫(kù)存,滿(mǎn)足市場(chǎng)需求"
p.level = 1
p = tf.add_paragraph()
p.text = "針對(duì)銷(xiāo)售較低的產(chǎn)品,考慮調(diào)整營(yíng)銷(xiāo)策略或價(jià)格"
p.level = 1
p = tf.add_paragraph()
p.text = "關(guān)注銷(xiāo)售趨勢(shì),及時(shí)調(diào)整銷(xiāo)售目標(biāo)"
p.level = 1
# 保存演示文稿
report_filename = "銷(xiāo)售報(bào)告.pptx"
prs.save(report_filename)
print(f"銷(xiāo)售報(bào)告已生成: {report_filename}")
return report_filename
# 執(zhí)行函數(shù)
# generate_sales_report("sales_data.xlsx")
場(chǎng)景二:培訓(xùn)課程幻燈片生成器
from pptx import Presentation
from pptx.util import Inches, Pt
from pptx.enum.text import PP_ALIGN
from pptx.dml.color import RGBColor
import os
def generate_training_slides(course_data):
"""生成培訓(xùn)課程幻燈片"""
# 創(chuàng)建演示文稿
prs = Presentation()
# 添加標(biāo)題幻燈片
slide_layout = prs.slide_layouts[0]
slide = prs.slides.add_slide(slide_layout)
# 設(shè)置標(biāo)題和副標(biāo)題
title = slide.shapes.title
subtitle = slide.placeholders[1]
title.text = course_data['title']
subtitle.text = f"講師: {course_data['instructor']}\n{course_data['date']}"
# 添加課程目標(biāo)幻燈片
slide_layout = prs.slide_layouts[1]
slide = prs.slides.add_slide(slide_layout)
title = slide.shapes.title
content = slide.placeholders[1]
title.text = "課程目標(biāo)"
tf = content.text_frame
tf.text = "完成本課程后,您將能夠:"
for objective in course_data['objectives']:
p = tf.add_paragraph()
p.text = objective
p.level = 1
# 添加課程大綱幻燈片
slide_layout = prs.slide_layouts[1]
slide = prs.slides.add_slide(slide_layout)
title = slide.shapes.title
content = slide.placeholders[1]
title.text = "課程大綱"
tf = content.text_frame
for i, module in enumerate(course_data['modules'], 1):
if i == 1:
tf.text = f"{i}. {module['title']}"
else:
p = tf.add_paragraph()
p.text = f"{i}. {module['title']}"
# 為每個(gè)模塊創(chuàng)建內(nèi)容幻燈片
for i, module in enumerate(course_data['modules'], 1):
# 模塊標(biāo)題幻燈片
slide_layout = prs.slide_layouts[2] # 節(jié)標(biāo)題布局
slide = prs.slides.add_slide(slide_layout)
title = slide.shapes.title
title.text = f"模塊 {i}: {module['title']}"
# 模塊內(nèi)容幻燈片
for topic in module['topics']:
slide_layout = prs.slide_layouts[1] # 標(biāo)題和內(nèi)容布局
slide = prs.slides.add_slide(slide_layout)
title = slide.shapes.title
content = slide.placeholders[1]
title.text = topic['title']
tf = content.text_frame
for j, point in enumerate(topic['points']):
if j == 0:
tf.text = point
else:
p = tf.add_paragraph()
p.text = point
# 添加總結(jié)幻燈片
slide_layout = prs.slide_layouts[1]
slide = prs.slides.add_slide(slide_layout)
title = slide.shapes.title
content = slide.placeholders[1]
title.text = "總結(jié)"
tf = content.text_frame
for i, point in enumerate(course_data['summary']):
if i == 0:
tf.text = point
else:
p = tf.add_paragraph()
p.text = point
# 添加問(wèn)答幻燈片
slide_layout = prs.slide_layouts[5] # 僅標(biāo)題布局
slide = prs.slides.add_slide(slide_layout)
title = slide.shapes.title
title.text = "問(wèn)題與討論"
# 在幻燈片中央添加大問(wèn)號(hào)
left = Inches(5.5)
top = Inches(3)
width = Inches(2)
height = Inches(2)
txBox = slide.shapes.add_textbox(left, top, width, height)
tf = txBox.text_frame
tf.text = "?"
p = tf.paragraphs[0]
p.alignment = PP_ALIGN.CENTER
run = p.runs[0]
run.font.size = Pt(120)
run.font.bold = True
run.font.color.rgb = RGBColor(0, 112, 192) # 藍(lán)色
# 保存演示文稿
output_file = f"{course_data['title'].replace(' ', '_')}_培訓(xùn)課程.pptx"
prs.save(output_file)
print(f"培訓(xùn)幻燈片已生成: {output_file}")
return output_file
# 示例課程數(shù)據(jù)
python_course = {
'title': "Python辦公自動(dòng)化實(shí)戰(zhàn)",
'instructor': "張教授",
'date': "2023年12月15日",
'objectives': [
"理解Python在辦公自動(dòng)化中的應(yīng)用場(chǎng)景",
"掌握Excel、Word和PPT文檔的自動(dòng)化處理",
"學(xué)會(huì)使用Python處理文件和目錄",
"能夠開(kāi)發(fā)簡(jiǎn)單的辦公自動(dòng)化腳本"
],
'modules': [
{
'title': "Python基礎(chǔ)入門(mén)",
'topics': [
{
'title': "Python環(huán)境搭建",
'points': [
"安裝Python解釋器",
"配置開(kāi)發(fā)環(huán)境",
"使用pip安裝第三方庫(kù)",
"編寫(xiě)第一個(gè)Python程序"
]
},
{
'title': "Python基本語(yǔ)法",
'points': [
"變量和數(shù)據(jù)類(lèi)型",
"條件語(yǔ)句和循環(huán)",
"函數(shù)定義和調(diào)用",
"模塊和包的使用"
]
}
]
},
{
'title': "Excel文檔自動(dòng)化",
'topics': [
{
'title': "使用openpyxl操作Excel",
'points': [
"讀取Excel文件",
"修改單元格內(nèi)容",
"添加公式和格式",
"創(chuàng)建圖表和數(shù)據(jù)透視表"
]
},
{
'title': "使用pandas處理Excel數(shù)據(jù)",
'points': [
"數(shù)據(jù)導(dǎo)入和導(dǎo)出",
"數(shù)據(jù)清洗和轉(zhuǎn)換",
"數(shù)據(jù)分析和統(tǒng)計(jì)",
"數(shù)據(jù)可視化"
]
}
]
},
{
'title': "Word和PPT文檔自動(dòng)化",
'topics': [
{
'title': "使用python-docx操作Word",
'points': [
"創(chuàng)建和修改Word文檔",
"添加文本、圖片和表格",
"設(shè)置格式和樣式",
"自動(dòng)生成報(bào)告"
]
},
{
'title': "使用python-pptx操作PPT",
'points': [
"創(chuàng)建和修改PPT演示文稿",
"添加幻燈片和內(nèi)容",
"插入圖表和圖形",
"批量生成演示文稿"
]
}
]
}
],
'summary': [
"Python是辦公自動(dòng)化的強(qiáng)大工具",
"掌握核心庫(kù)可以處理各種辦公文檔",
"自動(dòng)化腳本可以大幅提高工作效率",
"持續(xù)學(xué)習(xí)和實(shí)踐是提高技能的關(guān)鍵"
]
}
# 執(zhí)行函數(shù)
# generate_training_slides(python_course)
通過(guò)以上代碼示例和應(yīng)用場(chǎng)景,你可以輕松掌握Python PPT演示文稿自動(dòng)化的各種技巧,大幅提高工作效率。無(wú)論是創(chuàng)建簡(jiǎn)單的演示文稿,還是批量生成復(fù)雜的報(bào)告、培訓(xùn)材料,Python都能幫你輕松應(yīng)對(duì)。
以上就是Python使用python-pptx自動(dòng)化操作和生成PPT的詳細(xì)內(nèi)容,更多關(guān)于Python自動(dòng)化操作PPT的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
詳解如何使用Python實(shí)現(xiàn)刪除重復(fù)文件
這篇文章主要為大家詳細(xì)介紹了如何利用Python實(shí)現(xiàn)刪除重復(fù)文件功能,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Python有一定幫助,需要的可以參考一下2022-10-10
解決python圖像處理圖像賦值后變?yōu)榘咨膯?wèn)題
這篇文章主要介紹了解決python圖像處理圖像賦值后變?yōu)榘咨膯?wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-06-06
tensorflow轉(zhuǎn)onnx的實(shí)現(xiàn)方法
本文主要介紹了tensorflow轉(zhuǎn)onnx的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-03-03
python編譯環(huán)境配置的實(shí)現(xiàn)步驟
本文主要介紹了python編譯環(huán)境配置的實(shí)現(xiàn)步驟,文中通過(guò)圖文示例介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2025-05-05
python常用的兩種第三方庫(kù)下載方法小結(jié)
這篇文章主要介紹了python常用的兩種第三方庫(kù)下載方法的相關(guān)資料,安裝、卸載、版本查看及鏡像源使用等常用操作,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下2025-05-05
Python實(shí)現(xiàn)簡(jiǎn)單查找最長(zhǎng)子串功能示例
這篇文章主要介紹了Python實(shí)現(xiàn)簡(jiǎn)單查找最長(zhǎng)子串功能,涉及字符串遍歷、統(tǒng)計(jì)等相關(guān)操作技巧,需要的朋友可以參考下2019-02-02
Python tornado隊(duì)列示例-一個(gè)并發(fā)web爬蟲(chóng)代碼分享
這篇文章主要介紹了Python tornado隊(duì)列示例-一個(gè)并發(fā)web爬蟲(chóng)代碼分享,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-01-01
Python Flask基礎(chǔ)到登錄功能的實(shí)現(xiàn)代碼
這篇文章主要介紹了Python Flask基礎(chǔ)到登錄功能的實(shí)現(xiàn)代碼,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-05-05

