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

  • 相关阅读:
    程序员的7中武器
    需要强化的知识
    微软中国联合小i推出MSN群Beta 不需任何插件
    XML Notepad 2006 v2.0
    Sandcastle August 2006 Community Technology Preview
    [推荐] TechNet 广播 SQL Server 2000完结篇
    《太空帝国 4》(Space Empires IV)以及 xxMod 英文版 中文版 TDM Mod 英文版 中文版
    IronPython 1.0 RC2 更新 1.0.60816
    Microsoft .NET Framework 3.0 RC1
    《Oracle Developer Suite 10g》(Oracle Developer Suite 10g)V10.1.2.0.2
  • 原文地址:https://www.cnblogs.com/jackduan/p/15242004.html
Copyright © 2011-2022 走看看