简介
不管你爱不爱,Powerpoint都被广泛应用于商务场合。文章不会争辩Powerpoint的优点,而是向你展示如何用Python使创建Powerpoint幻灯片自动化,以便去除掉在使用Powerpoint过程中一些单调乏味的工作。
幸运的是,有一个优秀的用于创建和更新PowerPoint文件的Python库:python-pptx。该库的API非常详细,所以很容易使用。唯一棘手的部分是理解PowerPoint文档的结构,包括各种总体布局和元素。一旦你了解了基础知识,自动创建你自己的PowerPoint幻灯片会相对容易很多。本文将通过一个例子研究和分析一些pandas的Excel数据,创建一些可嵌入在PowerPoint文件里的图表。
PowerPoint文件的基础
Python-pptx可以创建空白PowerPoint文件,但大多数人会喜欢在一个根据自己的内容设定好的的模板上工作。Python-pptx的API支持这个预定义的过程并且非常简单,只要你知道关于你的模板的几件事就好了。
在深入一些代码示例之前,你需要了解两个关键部分:幻灯片布局和占位符。在下面的图片你可以看到两种不同的布局以及模板占位符的一个例子,你可以把内容填充在其中。
在下面的图片中,你可以看到,我们使用的是布局0,在幻灯片的第一页有一个占位符。
这幅图中,我们使用了外观完全不同的布局1。
为了让您更轻松地使用自己的模板,我创建了一个简单的独立脚本,这个脚本使用一个模板,并用各种元素来标记这个模板。
我不会一行一行地解释下面的代码,但是你可以自己在github上看analyze_ppt.py,下面是完成主要工作的函数:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
def analyze_ppt(input, output): """ 读入文件并分析结构。 输出文件包含标记信息,使生成后面的PowerPoint模板更容易。 """ prs = Presentation(input) # 每个PowerPoint文件有多种布局 # 循环找出不同的元素位置 for index, _ in enumerate(prs.slide_layouts): slide = prs.slides.add_slide(prs.slide_layouts[index]) # 不是每张幻灯片都有标题 try: title = slide.shapes.title title.text = 'Title for Layout {}'.format(index) except AttributeError: print("No Title for Layout {}".format(index)) # 遍历所有占位符,并通过索引和类型识别它们 for shape in slide.placeholders: if shape.is_placeholder: phf = shape.placeholder_format # 不要覆写仅仅是一个特殊占位符的标题 try: if 'Title' not in shape.text: shape.text = 'Placeholder index:{} type:{}'.format(phf.idx, shape.name) except AttributeError: print("{} has no text attribute".format(phf.type)) print('{} {}'.format(phf.idx, shape.name)) prs.save(output) |
这个函数的基本流程是通过循环并创建每一个包含在源PowerPoint文件中的布局实例。然后在每一页幻灯片上,将填充一个标题(如果有的话)。最后,它会遍历所有包含在模板中的占位符并显示占位符索引以及类型。
如果你想自己试试:
1 |
python analyze_ppt.py simple-template.ppt simple-template-markup.ppt |
创建你自己的幻灯片
对于数据收集和分析,我将从Pandas Pivot Table复制一些通用Excel报告的分析。这篇文章对Pandas数据操作解释得更加细致,所以这将使你在深入代码之前便对它非常了解,这对你肯定非常有用。
让我们从程序的输入和基本命令开始:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
from __future__ import print_function from pptx import Presentation from pptx.util import Inches import argparse import pandas as pd import numpy as np from datetime import date import matplotlib.pyplot as plt import seaborn as sns # 函数在这里运行 if __name__ == "__main__": args = parse_args() df = pd.read_excel(args.report.name) report_data = create_pivot(df) create_chart(df, "report-image.png") create_ppt(args.infile.name, args.outfile.name, report_data, "report-image.png") |
在我们创建命令行参数之后,我们将源Excel文件读入Pandas数据框架,然后,我们使用数据框架作为输入来创建Pivot_table总结:
简介
不管你爱不爱,Powerpoint都被广泛应用于商务场合。文章不会争辩Powerpoint的优点,而是向你展示如何用Python使创建Powerpoint幻灯片自动化,以便去除掉在使用Powerpoint过程中一些单调乏味的工作。
幸运的是,有一个优秀的用于创建和更新PowerPoint文件的Python库:python-pptx。该库的API非常详细,所以很容易使用。唯一棘手的部分是理解PowerPoint文档的结构,包括各种总体布局和元素。一旦你了解了基础知识,自动创建你自己的PowerPoint幻灯片会相对容易很多。本文将通过一个例子研究和分析一些pandas的Excel数据,创建一些可嵌入在PowerPoint文件里的图表。
PowerPoint文件的基础
Python-pptx可以创建空白PowerPoint文件,但大多数人会喜欢在一个根据自己的内容设定好的的模板上工作。Python-pptx的API支持这个预定义的过程并且非常简单,只要你知道关于你的模板的几件事就好了。
在深入一些代码示例之前,你需要了解两个关键部分:幻灯片布局和占位符。在下面的图片你可以看到两种不同的布局以及模板占位符的一个例子,你可以把内容填充在其中。
在下面的图片中,你可以看到,我们使用的是布局0,在幻灯片的第一页有一个占位符。
这幅图中,我们使用了外观完全不同的布局1。
为了让您更轻松地使用自己的模板,我创建了一个简单的独立脚本,这个脚本使用一个模板,并用各种元素来标记这个模板。
我不会一行一行地解释下面的代码,但是你可以自己在github上看analyze_ppt.py,下面是完成主要工作的函数:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
def analyze_ppt(input, output): """ 读入文件并分析结构。 输出文件包含标记信息,使生成后面的PowerPoint模板更容易。 """ prs = Presentation(input) # 每个PowerPoint文件有多种布局 # 循环找出不同的元素位置 for index, _ in enumerate(prs.slide_layouts): slide = prs.slides.add_slide(prs.slide_layouts[index]) # 不是每张幻灯片都有标题 try: title = slide.shapes.title title.text = 'Title for Layout {}'.format(index) except AttributeError: print("No Title for Layout {}".format(index)) # 遍历所有占位符,并通过索引和类型识别它们 for shape in slide.placeholders: if shape.is_placeholder: phf = shape.placeholder_format # 不要覆写仅仅是一个特殊占位符的标题 try: if 'Title' not in shape.text: shape.text = 'Placeholder index:{} type:{}'.format(phf.idx, shape.name) except AttributeError: print("{} has no text attribute".format(phf.type)) print('{} {}'.format(phf.idx, shape.name)) prs.save(output) |
这个函数的基本流程是通过循环并创建每一个包含在源PowerPoint文件中的布局实例。然后在每一页幻灯片上,将填充一个标题(如果有的话)。最后,它会遍历所有包含在模板中的占位符并显示占位符索引以及类型。
如果你想自己试试:
1 |
python analyze_ppt.py simple-template.ppt simple-template-markup.ppt |
创建你自己的幻灯片
对于数据收集和分析,我将从Pandas Pivot Table复制一些通用Excel报告的分析。这篇文章对Pandas数据操作解释得更加细致,所以这将使你在深入代码之前便对它非常了解,这对你肯定非常有用。
让我们从程序的输入和基本命令开始:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
from __future__ import print_function from pptx import Presentation from pptx.util import Inches import argparse import pandas as pd import numpy as np from datetime import date import matplotlib.pyplot as plt import seaborn as sns # 函数在这里运行 if __name__ == "__main__": args = parse_args() df = pd.read_excel(args.report.name) report_data = create_pivot(df) create_chart(df, "report-image.png") create_ppt(args.infile.name, args.outfile.name, report_data, "report-image.png") |
在我们创建命令行参数之后,我们将源Excel文件读入Pandas数据框架,然后,我们使用数据框架作为输入来创建Pivot_table总结: