## 需求: ppt中有图表,需要修改一列,其他数据都会自动变化.
#### 解决方法1: 如果按照人工操作步骤, 先把图表数据保存为一个excel,使用openpyxl修改一列的数据,其他数据会根据公式自动变化. 然后使用python-pptx修改数据 replace_data
问题1: 使用openpyxl修改一列数据后,save文件,其实并没有保存数据,再次读取文件读取到公式单元格为none, 使用excel打开文件还需要选择是否保存. 解决:使用xlwings,隐式打开excel
问题2: excel中图表只需选择固定列的数据, 使用pandas的usecols参数
from pptx import Presentation
from pptx.chart.data import CategoryChartData as ChartData
import pandas as pd
from openpyxl import load_workbook
import xlwings as xw
def replaceCategoryChart(df, dfcategory, chart, skipLastCol=0):
cols1 = list(df)
cols2 = list(dfcategory)
# create chart data object
chart_data = ChartData()
# create categories
chart_data.categories = dfcategory[cols2[0]]
# Loop over all series
for col in cols1[0:len(cols1) - skipLastCol]:
chart_data.add_series(col, df[col])
# replace chart data
chart.replace_data(chart_data)
prs = Presentation(r"E: est.pptx")
for i, slide in enumerate(prs.slides):
for shape in slide.shapes:
if shape.name == "图表11":
question_num = 4
file_name = rf'E:{question_num}.xlsx'
file_name1 = rf'E:{question_num}copy.xlsx'
# 使用openpyxl修改一列值,其他数据使用公式自动计算
workbook_ = load_workbook(file_name)
sheet = workbook_[workbook_.sheetnames[0]]
for i in range(2, question_num + 2):
sheet[f'F{i}'] = 9
workbook_.save(file_name1)
with xw.App(visible=False) as xapp: # 隐藏(不显示)打开的Excel
wb3 = xw.Book(file_name1)
# 不加with语句需要自己关闭Excel应用,否则再次打开时多个Excel并存可能冲突
wb3.save()
wb3.close()
df = pd.read_excel(file_name1, usecols='K:AD', nrows=question_num).fillna('')
dfcategory = pd.read_excel(file_name1, usecols='A', nrows=question_num)
S0_L_chart = shape.chart
replaceCategoryChart(df, dfcategory, S0_L_chart)
pptxFilepath = r"E: est1.pptx"
prs.save(pptxFilepath)
#### 解决方法2: 计算每一个分类每一个系列的值, 然后转成pandas数据结构,再进行ppt的replace_data