参数传递下,调用这个模板2,查看下生成的效果:
接下来如法炮制剩下的三个模板,主要是难点是控件的位置和宽高设置, 有两种操作:
最简单的操作:
随便填个坐标和宽高,运行后打开生成的PPT,自行调整 位置,然后记录下何时的位置和宽高,然后改代码。
复杂点的操作:
自行计算,比如模板5,三个小标题,先减去左右的间隔, 然后三等分,循环动态计算小标题的起始位置。
3.配置文件读取
接下来编写一个读取文件内容,调用对应方法的函数,代码如下
# 读取配置文件调用模板的方法 def read_rules(prs, filename): if os.path.exists(filename): with open(filename, 'r+', encoding='utf-8') as f: for rule in f: word_list = rule.replace('\n', '').split(',') if 'png' in rule or 'jpg' in rule: if len(word_list) == 1: model_1(prs, os.path.join(c.res_pictures, word_list[0])) else: model_3(prs, word_list[0], os.path.join(c.res_pictures, word_list[1])) else: if len(word_list) == 1: model_2(prs, word_list[0]) elif len(word_list) == 2: model_4(prs, word_list[0], word_list[1]) elif len(word_list) == 4: model_5(prs, word_list[0], word_list[1], word_list[2], word_list[3])
4.代码执行
调用配置文件读取的函数
if __name__ == '__main__': t.is_dir_existed(c.outputs_documents_path) ppt_existed(ppt_file_name) presentation = Presentation(ppt_file_name) read_rules(presentation, rules_path) presentation.save(ppt_file_name)
运行结果:
4.有些东西要说说
批量生成是挺爽的,不过呢,不支持直接生成动画哦!!! 然后这种简单的PPT,其实粘贴复制修改图片的效率可能比起你一个个 模板编写快一些...不得不说有些鸡肋,哦,对哦,这个还支持生成图表, 怎么整可以自行查阅官方文档。
另外的win32com的库,貌似功能更加强大,可能支持动画吧,但是文档是 真的难啃,就没有深入去研究了,有兴趣可以自己去折腾折腾。附上用win32com这个库时遇到的问题的解决方法:
1.Python3安装win32com
pip install pypiwin32
2.哪里有win32com的文档
微软官网有,不过看到脑壳痛,介绍个工具:oleview,网上一搜一堆 不过这个用的时候会遇到一个问题,这里顺带记录下笔者win10电脑遇到的 一些情况:
IVIEWERS.DLL缺失:
网上搜下这个dll文件,下载完把文件复制到Windows/system32, 然后管理员模式打开命令提示符,键入:regsvr32 iviewers.dll注册这个dll运行库就可以了。不过呢,win10 64位这样的执行是会报错的:
模块iviewers.dll可能与您正在运行的Windows版本不兼容,检查该模块是否与 regsvr.exe的x86或x64版本兼容
你要做的是把dll文件拷贝到Windows/SysWOW64,然后管理员模式打开命令提示符cd到这个目录下,接着执行regsvr32 iviewers.dll即可。
如果出现:对DllRegisterServer的调用失败,错误代码为0x80070005那是UAC的缘故,你没有以管理员模式打开命令提示符。
如果解决了,应该能正常打开,左侧招到PowerPoint那项,双击打开, 然后呢,这个工具不支持查找,你可以把内容全选然后复制到如Sublime Text 这样的代码查看工具上,ctrl + f 查找关键字,然后一步步定位出实现某个 功能需要用到的一些函数。
小结
本节讲解了一波利用Python-pptx批量生成N张PPT的套路
参考文献:
附:最终代码(都可以在:github.com/coder-pig/R… 找到):
import pptx import config as c import tools as t from pptx import Presentation from pptx.dml.color import RGBColor from pptx.util import Inches, Pt from pptx.enum.text import MSO_VERTICAL_ANCHOR, PP_PARAGRAPH_ALIGNMENT import os rules_path = os.path.join(c.res_documents, 'ppt_rules.txt') ppt_bg_path = os.path.join(c.res_pictures, 'ppt_bg.png') laoluo_bg_path = os.path.join(c.res_pictures, 'laoluo.jpg') last_bg_path = os.path.join(c.res_pictures, 'last.png') story_bg_path = os.path.join(c.res_pictures, 'story.png') ppt_file_name = os.path.join(c.outputs_documents_path, 'result.pptx') # 厘米转英寸 def cm_to_in(cm): return Inches(cm / 2.54) # 判断课件是否存在,不存在的新建一个空白 def ppt_existed(ppt_name): if not os.path.exists(ppt_name): prs = Presentation() prs.slide_height = cm_to_in(14.35) prs.slide_width = cm_to_in(25.5) prs.save(ppt_name) # 模板1:只有一张图片 def model_1(prs, pic_path): slide = prs.slides.add_slide(prs.slide_layouts[6]) slide.shapes.add_picture(pic_path, cm_to_in(0), cm_to_in(0), cm_to_in(25.4), cm_to_in(14.288)) # 模板2:只有一个标题 def model_2(prs, title): slide = prs.slides.add_slide(prs.slide_layouts[6]) slide.shapes.add_picture(ppt_bg_path, cm_to_in(0), cm_to_in(0), cm_to_in(25.4), cm_to_in(14.288)) title_box = slide.shapes.add_textbox(cm_to_in(3.89), cm_to_in(5.35), cm_to_in(17.61), cm_to_in(3.59)) paragraph = title_box.text_frame.add_paragraph() paragraph.text = title paragraph.vertical_anchor = MSO_VERTICAL_ANCHOR.MIDDLE paragraph.alignment = PP_PARAGRAPH_ALIGNMENT.CENTER paragraph.font.size = Pt(60) paragraph.font.name = '微软雅黑' paragraph.font.color.rgb = RGBColor(255, 255, 255) # 模板3:有字,有图片 def model_3(prs, title, pic_path): slide = prs.slides.add_slide(prs.slide_layouts[6]) slide.shapes.add_picture(ppt_bg_path, cm_to_in(0), cm_to_in(0), cm_to_in(25.4), cm_to_in(14.288)) img = slide.shapes.add_picture(pic_path, cm_to_in(0), cm_to_in(0), height=cm_to_in(11.72)) img.left = int(prs.slide_width / 2 + (prs.slide_width / 2 - img.width) / 2) img.top = int((prs.slide_height - img.height) / 2) title_box = slide.shapes.add_textbox(cm_to_in(2), cm_to_in(5.35), int(prs.slide_width / 3), cm_to_in(3.59)) paragraph = title_box.text_frame.add_paragraph() paragraph.text = title paragraph.font.size = Pt(44) paragraph.font.name = '微软雅黑' paragraph.font.color.rgb = RGBColor(255, 255, 255) # 模板4:两行文字,一大一小 def model_4(prs, title, content): slide = prs.slides.add_slide(prs.slide_layouts[6]) slide.shapes.add_picture(ppt_bg_path, cm_to_in(0), cm_to_in(0), cm_to_in(25.4), cm_to_in(14.288)) # 一级标题 title_box_1 = slide.shapes.add_textbox(cm_to_in(1.27), cm_to_in(2.04), cm_to_in(22.86), cm_to_in(3.18)) paragraph_1 = title_box_1.text_frame.add_paragraph() paragraph_1.text = title paragraph_1.vertical_anchor = MSO_VERTICAL_ANCHOR.MIDDLE paragraph_1.alignment = PP_PARAGRAPH_ALIGNMENT.CENTER paragraph_1.font.size = Pt(44) paragraph_1.font.name = '微软雅黑' paragraph_1.font.color.rgb = RGBColor(255, 255, 255) # 二级标题 title_box_2 = slide.shapes.add_textbox(cm_to_in(7.46), cm_to_in(6.4), cm_to_in(10.47), cm_to_in(2.39)) paragraph_2 = title_box_2.text_frame.add_paragraph() paragraph_2.text = title paragraph_2.vertical_anchor = MSO_VERTICAL_ANCHOR.MIDDLE paragraph_2.alignment = PP_PARAGRAPH_ALIGNMENT.CENTER paragraph_2.font.size = Pt(32) paragraph_2.font.name = '微软雅黑' paragraph_2.font.color.rgb = RGBColor(255, 255, 255) # 模板5:一行文字,多个小标题 def model_5(prs, title, *content): slide = prs.slides.add_slide(prs.slide_layouts[6]) slide.shapes.add_picture(ppt_bg_path, cm_to_in(0), cm_to_in(0), cm_to_in(25.4), cm_to_in(14.288)) title_box_1 = slide.shapes.add_textbox(cm_to_in(1.27), cm_to_in(2.04), cm_to_in(22.86), cm_to_in(3.18)) paragraph_1 = title_box_1.text_frame.add_paragraph() paragraph_1.text = title paragraph_1.vertical_anchor = MSO_VERTICAL_ANCHOR.MIDDLE paragraph_1.alignment = PP_PARAGRAPH_ALIGNMENT.CENTER paragraph_1.font.size = Pt(44) paragraph_1.font.name = '微软雅黑' paragraph_1.font.color.rgb = RGBColor(255, 255, 255) # 动态构建小标题 module_width = (prs.slide_width - cm_to_in(1.27) * 2) / len(content) for i in range(0, 3): title_box = slide.shapes.add_textbox(cm_to_in(1.27) + i * module_width, cm_to_in(6.4), module_width, cm_to_in(2.39)) paragraph = title_box.text_frame.add_paragraph() paragraph.text = content[i] paragraph.vertical_anchor = MSO_VERTICAL_ANCHOR.MIDDLE paragraph.alignment = PP_PARAGRAPH_ALIGNMENT.CENTER paragraph.font.size = Pt(32) paragraph.font.name = '微软雅黑' paragraph.font.color.rgb = RGBColor(255, 255, 255) # 读取配置文件调用模板的方法 def read_rules(prs, filename): if os.path.exists(filename): with open(filename, 'r+', encoding='utf-8') as f: for rule in f: word_list = rule.replace('\n', '').split(',') if 'png' in rule or 'jpg' in rule: if len(word_list) == 1: model_1(prs, os.path.join(c.res_pictures, word_list[0])) else: model_3(prs, word_list[0], os.path.join(c.res_pictures, word_list[1])) else: if len(word_list) == 1: model_2(prs, word_list[0]) elif len(word_list) == 2: model_4(prs, word_list[0], word_list[1]) elif len(word_list) == 4: model_5(prs, word_list[0], word_list[1], word_list[2], word_list[3]) if __name__ == '__main__': t.is_dir_existed(c.outputs_documents_path) ppt_existed(ppt_file_name) presentation = Presentation(ppt_file_name) read_rules(presentation, rules_path) presentation.save(ppt_file_name)