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

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

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

引言

最近遇到这样的需求,一份通过Excel手动整理的数据需要可视化到PPT上,PPT可给到销售和市场用作对外材料。

一般而言,Excel数据应该在Excel本身实现可视化,再把可视化结果复制或截图到其他使用场景。但我在实际测试这一做法时却发现,如果把Excel里面做好的可视化结果直接复制到PPT或者Word上都是会变形的,如果是截图的话又不利于二次编辑。无奈之下,只能硬着头皮用python实现。

好,废话不多说,上代码

库引入

这次主要用到的是xlwings和python-pptx,前者用于从Excel中读取数据,是python与Excel数据互通的利器,我之前还用这个表实现过文本打标签功能;后者用于对PPT中的内容进行创建或修改教案后记怎么写,针对这一次需求我主要使用的是修改部分的功能。感兴趣的读者可参考文章底部有官方链接详细了解。

from pptx import Presentationfrom pptx.chart.data import CategoryChartData as ChartDataimport xlwings as xwimport pandas as pd

读取Excel

建议将Excel读取封装为一个函数,因为PPT中有以下几种不同类型的对象:

函数如下:

def read_from_excel(data_select):    wb = xw.Book.caller()    sheet = wb.sheets['Sheet1']  # 指定sheet
if data_select == 'page4_table': shape = sheet.range('Q4:T18') # 获取数据范围,返回行、列 collist = ['city','rank','store','rate'] table_data = shape.value # 按行列读取数据 df_table = pd.DataFrame.from_records(table_data) # 写入df进行处理 df_table.columns = collist for index, row in df_table.iterrows(): df_table.loc[index:index,'rate'] = str(round(row['rate'] * 100,1)) + '%' # 百分比格式处理 df_table.loc[index:index,'store'] = '{:,}'.format(round(row['store'])) # Number类型取整,加上千位符
if data_select == 'page5_table': shape = sheet.range('V4:Y18') # 获取数据范围,返回行、列 collist = ['city','rank','store','rate'] table_data = shape.value # 按行列读取数据 df_table = pd.DataFrame.from_records(table_data) # 写入df进行处理 df_table.columns = collist for index, row in df_table.iterrows(): df_table.loc[index:index,'rate'] = str(round(row['rate'] * 100,1)) + '%' # 百分比格式处理 df_table.loc[index:index,'store'] = '{:,}'.format(round(row['store'])) # Number类型取整,加上千位符
if data_select == 'page7_table': shape = sheet.range('AA4:AB18') # 获取数据范围,返回行、列 collist = ['city','rank'] table_data = shape.value # 按行列读取数据 df_table = pd.DataFrame.from_records(table_data) # 写入df df_table.columns = collist
return df_table
# 函数调用前,要先把文件读进来,xlwings在工作时,Excel会同时打开xw.Book("数据文件.xlsx").set_mock_caller()
wb = xw.Book.caller()sheet = wb.sheets['Sheet1'] # 指定sheetreport_date = sheet.range('B1').value # 读取单个单元格:报告日期report_theme = sheet.range('C1').value # 读取单个单元格:报告主题report_data_date = sheet.range('D1').value # 读取单个单元格:数据日期top15_brand = sheet.range('C7:C18').value # 读取范围值,这里是一列top15_brand_store = sheet.range('D4:D18').valuetop15_brand_store = sorted(top15_brand_store)store_open_count1 = sheet.range('I4').valuestore_open_count2 = sheet.range('I5').valuestore_open_count3 = sheet.range('I6').valuestore_open_count4 = sheet.range('I11').valuetop15_brand_open = sheet.range('G7:G18').valuestore_close_count1 = sheet.range('N4').valuestore_close_count2 = sheet.range('N5').valuestore_close_count3 = sheet.range('N6').valuestore_close_count4 = sheet.range('N7').valuetop15_brand_close = sheet.range('M7:M18').value
page4_table = read_from_excel('page4_table') # 读取PPT第4页要用到的数据page5_table = read_from_excel('page5_table') # 读取PPT第5页要用到的数据

提前处理变量值

在这里需要注意的是,从Excel中提取的信息对应的是PPT上需要变化的内容,但一个变化的内容,比如报告时间常常会在PPT中的多种页使用。

因此这一步骤的重点在于把Excel输出的变量,转换为PPT上每一页要修改的内容,以下代码只保留结构,相关报告实际内容已隐去。

# 1 报告名称page1_ranklist_name = '{}报告'.format(report_theme)# 1 报告时间page1_ranklist_date = report_date
# 2 标题(含时间)page2_title1 = '产品名称 · 报告名称 · {}'.format(report_date)# 2 标题(含业态)page2_title2 = '{}·XXXXTOP15'.format(report_theme)# 2 数据说明(含时间)page2_datasource_spec = """1、数据来源:互联网公开平台 2、统计截止时间:{}""".format(report_data_date)# 2 page2_brand_list = top15_brand# 2 数据page2_chart_data = top15_brand_store
# 3 标题page3_title1 = '产品名称 · 报告名称 · {}'.format(report_date)page3_title2 = '{}·数量'.format(report_theme)# 3 page3_new1 = store_open_count1page3_new2 = store_open_count2page3_new3 = store_open_count3page3_new4 = store_open_count4# 3 page3_brand_list = top15_brand_openpage3_datasource_spec = """1、数据来源:互联网公开平台 2、统计截止时间:{}""".format(report_data_date)
# 4 标题page4_title1 = '产品名称 · 报告名称 · {}'.format(report_date)page4_title2 = '{}·TOP15'.format(report_theme)page4_title3 = '{}数'.format(str(int(report_date[5:6])-1) + '月')page4_datasource_spec = """1、数据来源:互联网公开平台 2、统计截止时间:{}""".format(report_data_date)# 4 表格page4_table = page4_table
# 5 标题page5_title1 = '产品名称 · 报告名称 · {}'.format(report_date)page5_title2 = '{}·增长率'.format(report_theme)page5_title3 = '{}数'.format(str(int(report_date[5:6])-1) + '月') page5_datasource_spec = """1、数据来源:互联网公开平台 2、统计截止时间:{}""".format(report_data_date)# 5 表格page5_table = page5_table

了解python-pptx解析结构

要把数据写入到ppt文件中,首先要知道python-pptx是如何对内容进行解析的,通过文档了解不够直观,因此可以先写一个循环把现有ppt内容读取出来:

prs = Presentation(r"/文件路径/文件名.pptx")
# 查看pptx解析情况for i, slide in enumerate(prs.slides): # 遍历每一页 print('\n=====第{}页====='.format(i+1)) for shape in slide.shapes: # 每一页里面的元素都是一个shape print('shape: {}'.format(shape.name)) if shape.has_text_frame: # 解析文本框 for paragraph in shape.text_frame.paragraphs: print('paragraph: {}'.format(paragraph.text)) for run in paragraph.runs: print('run: ',run.text) if shape.has_chart: # 解析图表 print('chart_type: ',shape.chart.chart_type) print('values: ',shape.chart.plots[0].series[0].values) if shape.has_table: # 解析表格 for row in shape.table.rows: for cell in row.cells: print('cell text: ',cell.text) print('cell margin_left: ',cell.margin_left)
=====第1页=====shape: 图形 4shape: 文本框 5paragraph: 产品名称 I 报告名称run: 产品名称 run: Irun: 报告名称shape: 文本框 6paragraph: XXX榜run:  XXX榜paragraph: shape: 文本框 8paragraph: 2022年N月run: 2022run: 年run: Nrun: 月shape: 矩形 12paragraph:
=====第2页=====shape: 文本框 15paragraph: 产品名称 · 报告名称 · 2022年2月run: 产品名称 run: · run: 报告名称 run: · 2022run: 年run: 2run: 月