windows 使用openpyxl xlwings python-pptx
## 需求: 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:\test.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:\test1.pptx" prs.save(pptxFilepath)
#### 解决方法2: 计算每一个分类每一个系列的值, 然后转成pandas数据结构,再进行ppt的replace_data