zoukankan      html  css  js  c++  java
  • 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:	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

  • 相关阅读:
    能自证的任意类型即为动态类型
    类型系统:类型信息引用 isa
    类型系统:类型检查、类型转换、任意类型-强类型、类型转换
    动态类型与弱类型
    Swift Intermediate Language (SIL)
    swift -Dynamic Dispatch
    swift VTables
    Which dispatch method would be used in Swift?
    Which dispatch method would be used in Swift?-Existential Container
    Swift protocol extension method is called instead of method implemented in subclass
  • 原文地址:https://www.cnblogs.com/jackduan/p/15242004.html
Copyright © 2011-2022 走看看