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

 

posted @ 2021-09-08 11:30  jackduan1  阅读(179)  评论(0编辑  收藏  举报