您现在的位置:首页 > 教案怎么写 > 正文

教案后记怎么写 如何让Excel里的数据自动跑到PPT上去?(2)

2022-04-26 20:11 网络整理 教案网

部分解析结果略,大家根据自己的实际解析结果进行分析。

通过分析可以发现一个奇怪的地方,原本一个文本框里面的文字会按照中文、数字、标点拆成多个text,比如:

shape: 文本框 15paragraph: 产品名称 · 报告名称 · 2022年3月run:  产品名称 run:  · run:  报告名称 run:  · 2022run:  年run:  3run:  月

这意味着你不能对整个paragraph的text进行赋值,会把文本框附带的格式清空;也不能只对其中一个run的text进行修改,因为后续的text会保留导致内容写得不对。

同理一个表格内的单元格也是文本框教案后记怎么写,因此可以对这两种情况的处理封装成函数:

prs = Presentation(r"/文件路径/文件名.pptx")
# 修改文本框函数def modify_text_frame(shape, pnum, rtext): pi = 0 for paragraph in shape.text_frame.paragraphs: # 遍历paragraph if pi == pnum: # 有的文本框中存在多个paragraph,只对要修改的进行操作,默认为 0 r = 0 for run in paragraph.runs: # 遍历paragraph下的run,只修改第一个,后面置空 if r == 0: run.text = rtext else: run.text = '' r = r + 1 pi = pi + 1
# 修改单元格文本函数(与上述函数同理)def modify_cell_text(cell, pnum, rtext): pi = 0 for paragraph in cell.text_frame.paragraphs: if pi == pnum: r = 0 for run in paragraph.runs: if r == 0: run.text = rtext else: run.text = '' r = r + 1 pi = pi + 1

搞定变量和部分写入函数之后,可以开始编写修改ppt内容的代码了,我的做法是一页一页地去改,这样代码结构看起来会更为清晰。因为ppt本身并不能对各种对象命名,所以只能代码中hard code很多“文本框 XX”,所以这里需要注意的是,只有当ppt的整体内容相对固定时才能做此自动化,而后续每次ppt的内容修改后,以下代码也都要相应修改才能使用。

最后只要把修改好的pptx保存到相应位置就可以了。

# 修改内容for i, slide in enumerate(prs.slides):    if i == 0: # page 1        for shape in slide.shapes:            if shape.has_text_frame:                if shape.name == '文本框 6':                    modify_text_frame(shape, 0, page1_ranklist_name)                if shape.name == '文本框 8':                    modify_text_frame(shape, 0, page1_ranklist_date)    if i == 1: # page 2        for shape in slide.shapes:            if shape.has_text_frame:                if shape.name == '文本框 15':                    modify_text_frame(shape, 0, page2_title1)                if shape.name == '文本框 16':                    modify_text_frame(shape, 0, page2_title2)                if shape.name == '文本框 2':                    modify_text_frame(shape, 3, page2_datasource_spec)                if shape.name == '文本框 46':                    brand_num = 0                    for brand in page2_brand_list:                        modify_text_frame(shape, brand_num, brand)                        brand_num = brand_num + 1            if shape.has_chart:                chart_data = ChartData()                chart_data.categories = shape.chart.plots[0].categories                chart_data .add_series('Series 1',page2_chart_data)                shape.chart.replace_data(chart_data)
# 部分代码从略
pptxFilepath = r"/文件路径/文件名_output.pptx"prs.save(pptxFilepath)

后记

老实说,作为一个大半桶水研发 + 半桶水产品的人来说,我在接到这个需求的第一反应是,为什么不在数据库里面把所有数据都处理好,然后再通过前端把各个看板和表格固定下来呢?又或者直接在Excel中实现可视化效果,然后通过一个插件把Excel中的可视区域导出为PDF。从可复用、可自动化、不限制Excel和ppt内容修改的角度来看,现在的xlwings+pptx都不能满足(而且还不能迁移到完全不懂技术的同事电脑上去跑)。

但在实际工作的情况中,数据并不能一次性全部准备好,链路还没跑通,更也无法形成接口。而所谓的ppt固化模板也只是第一版,为了节省后续人工,你不得不做一个简单的自动化工具以解燃眉之急。这时只能想方设法在python体系里挖宝,把原来要人工做一个小时的事情简化为一分钟,那也可以为你节省未来的N个小时。这就是python办公自动化的优势。

参考资料

python-pptx:

xlwings: