gpt4 book ai didi

excel - Python win32com PivotCache.CreatePivotChart() 错误 : 'Exception occurred'

转载 作者:行者123 更新时间:2023-12-04 21:52:11 26 4
gpt4 key购买 nike

2017 年 9 月的另一个问题解决了同样的问题,但没有答案:create a pivotchart with python win32com

我已经尝试了几种方法来让它工作,所以我想解释这些,并希望从某人那里得到一些关于如何让它工作的见解。这似乎不是一条破旧的道路,所以我没有寄予厚望。

环境细节:

  • window 10
  • 办公室 2013
  • python 3.6

  • 我用
    win32com.client.gencache.EnsureDispatch('Excel.Application') 

    但我也可以使用
    win32com.client.DispatchEx('Excel.Application') 

    或者
    win32com.client.dynamic.Dispatch('Excel.Application')

    每个都返回这个CLSID win32com.gen_py.00020813-0000-0000-C000-000000000046x0x1x8

    每一个也有同样的错误。

    我还按照文档 here 运行了这个命令:
    C:\Users\home_dir>python AppData\Local\Continuum\anaconda3\pkgs\pywin32-223-py36hfa6e2cd_1\Lib\site-packages\win32com\client\makepy.py -i "Microsoft Excel 15.0 Object Library"
    Output generated from makepy.py:
    Microsoft Excel 15.0 Object Library {00020813-0000-0000-C000-000000000046}, lcid=0, major=1, minor=8
    >>> # Use these commands in Python code to auto generate .py support
    >>> from win32com.client import gencache
    >>> gencache.EnsureModule('{00020813-0000-0000-C000-000000000046}', 0, 1, 8)

    此版本的 gencache 无法成功运行:
    Excel = win32com.client.gencache.EnsureModule('{00020813-0000-0000-C000-000000000046}', 0, 1, 8)

    源数据
    我使用 ExcelWriter 写入 Excel 的 Pandas 数据框中有 100 行和 18 列
    ew = pd.ExcelWriter('c:\devworkspace\SQL-Pandas-Excel\SampleData.xlsx')
    sample_data_df.to_excel(ew, sheet_name='Source Data')
    ew.save()
    ew.close()

    Excel = win32com.client.gencache.EnsureDispatch('Excel.Application')
    win32c = win32com.client.constants
    wb = Excel.Workbooks.Open('c:\devworkspace\SQL-Pandas-Excel\SampleData.xlsx')
    src_sheet = wb.Worksheets('Source Data')

    rng_row = 100
    rng_col = 18
    rng_beg = src_sheet.Cells(1,2)
    rng_end = src_sheet.Cells(rng_row,rng_col)
    pvt_src_rng = src_sheet.Range(rng_beg, rng_end)
    pvt_src_rng.Select()
    pvt_src = "%s!R1C2:R%dC%d"%(src_sheet.Name,rng_row+1,rng_col+1) #add 1 for header and df index

    枢轴缓存
    我使用 PivotCaches().Create() 而不是 .Add() 所以我可以指定 Version=win32c.xlPivotTableVersion15 这是 Office 2013 的正确版本。否则它似乎默认为版本 11。
    pc = wb.PivotCaches().Create(SourceType=win32c.xlDatabase, SourceData=pvt_src, Version=win32c.xlPivotTableVersion15)

    此更改移动了表盘,但没有解决我的问题 - 我仍然收到错误并且未创建图表:
  • 当我应用它时,数据透视表上的格式得到了增强
    改变。
  • 根错误代码从 -2147024809 更改为“The
    参数不正确”到根错误代码-2146827284

  • 它无法转换为人类可读的消息:
    print(win32api.FormatMessage(error.excepinfo[5]))
    error: (317, 'FormatMessageW', 'The system cannot find message text for message number 0x%1 in the message file for %2.')

    搜索此错误代码 2146827284,讨论似乎与 excel 对象正忙有关。但是 Excel.Visible 设置为 0 - 也是默认值 - 因此它以 headless 模式运行。

    添加工作表,创建数据透视表,添加字段成功
    这些都包含在实际代码中的 try-except 中 - 为简洁起见将其删除。
    pvt_sheet = wb.Sheets.Add(After=src_sheet)
    pvt_sheet.Name = 'Pivot Sheet'

    pvt_rng_beg = pvt_sheet.Cells(2,2)
    pvt_rng_end = pvt_sheet.Cells(2,2)
    pvt_dest_rng = pvt_sheet.Range(pvt_rng_beg, pvt_rng_end)


    pt = pc.CreatePivotTable(TableDestination=pvt_dest_rng,TableName='PivotTable1')
    pt.AddFields(RowFields="claimant_type_desc" , ColumnFields="claim_cause_desc" )
    pt.AddDataField(Field=pt.PivotFields("total_direct_payment"), Caption="Total Incurred")

    我可以将工作表或图表添加为“ChartDestination”,但两个选项都不会改变结果。我可以验证对象是否已成功添加。
    #chrt_sheet = wb.Charts.Add(After=pvt_sheet)
    chrt_sheet = wb.Sheets.Add(After=pvt_sheet)
    chrt_sheet.Name = 'Pivot Chart'

    ChartDestination 参数是唯一必需的参数,其他参数是可选的:XlChartType、Left、Top、Width、Height

    文档 here :

    根据示例,我将工作表或图表对象的名称作为字符串“数据透视表”传递。那应该行得通。
    pch = pc.CreatePivotChart(ChartDestination='Pivot Chart')

    因为参数被定义为 Variant,所以我将字符串显式分配给 Variant 对象。我尝试了一系列不同的变体类型,但并没有产生不同的结果。
    chrt_sheet_name_variant = win32com.client.VARIANT(pythoncom.VT_BYREF | pythoncom.VT_BSTR, chrt_sheet.Name)
    print(chrt_sheet_name_variant.value)
    print(chrt_sheet_name_variant.varianttype)
    print(chrt_sheet_name_variant.__class__)
    print(type(chrt_sheet_name_variant))
    pch = pc.CreatePivotChart(ChartDestination=chrt_sheet_name_variant)

    #Output:
    #Pivot Chart
    #16392
    #<class 'win32com.client.VARIANT'>
    #<class 'win32com.client.VARIANT'>

    这是生成的错误:
    File "C:\Users\xxxxxx\AppData\Local\Temp\gen_py\3.6\00020813-0000-0000-C000-000000000046x0x1x8\PivotCache.py", line 36, in CreatePivotChart
    , XlChartType, Left, Top, Width, Height

    com_error: (-2147352567, 'Exception occurred.', (0, None, None, None, 0, -2146827284), None)

    最佳答案

    感谢 Boussif 找到了解决办法。

    这是我的工作解决方案:

    从数据透视表生成数据透视图

    使用我们之前创建的 Workbook 对象,我们可以将图表“插入”到我们的工作簿并为我们的图表分配一个名称 - 名称出现在选项卡中。

    因为数据透视表是数据透视缓存中的一个对象——它是工作簿中的一个对象,所以图表对象被添加为数据透视图并使用数据透视表作为其数据。

    在此处阅读相关文档:

    https://docs.microsoft.com/en-us/office/vba/api/excel.workbook.charts

    https://docs.microsoft.com/en-us/office/vba/api/excel.chart(object)

    chrt_sheet = wb.Charts.Add()
    chrt_sheet.Name = 'Pivot Chart'

    指定图表类型

    图表类型对应于 Excel 程序中可用的相同图表类型。

    从枚举类型列表中选择。

    例如,3D 柱形图的值 xl3DColumn 编码如下:
    win32c.xl3DColumn

    使用前面定义的 win32c 对象 ew 来引用所有常量值,包括枚举列表。

    记录在这里:

    https://docs.microsoft.com/en-us/office/vba/api/excel.chart.charttype

    https://docs.microsoft.com/en-us/office/vba/api/excel.xlcharttype
    chrt_sheet.ChartType =  win32c.xl3DColumn

    设置图表标题

    在将 HasTitle 属性设置为 True 之前,工作表对象将没有 ChartTitle 属性
    chrt_sheet.HasTitle = True
    chrt_sheet.ChartTitle.Text = "Chart Title"

    设置配色方案

    ChartColor 值 10 - 26 对应于“图表工具”功能区的“设计”选项卡上的“更改颜色”菜单。
    chrt_sheet.ChartColor = 13

    指定图表布局

    布局是可选的

    布局与 Excel 程序中可供选择的布局列表相同。

    在这种情况下,它们不作为枚举列表提供。所以你必须为布局提供一个数字。它通常从 1 到 10。布局因各自的图表类型而异。要找出要选择的布局,您需要运行 Excel 程序并尝试每一个。如果您将鼠标悬停在布局选项上,它将显示带有布局名称的“工具提示”。例如:“布局 7”。您将提供与您各自的布局相关联的数字。

    您使用 ApplyLayout 方法来选择布局:
    ApplyLayout(Layout, Chart Type)

    记录在这里:

    https://docs.microsoft.com/en-us/office/vba/api/excel.chart.applylayout
    chrt_sheet.ApplyLayout(7, win32c.xl3DColumn)

    指定图表样式

    样式是可选的

    文档指出 1 到 48 是有效值。但是,正确的范围取决于选择的图表类型。

    根据图表类型 201 到 352 也是有效的。

    要获取与您的图表类型可用的样式选择相匹配的数字编号:
  • 从开发人员选项卡 - 运行宏
  • 从图表设计选项卡 - 选择所有样式
  • 从 Devloper 选项卡 - 停止运行宏
  • 从开发人员选项卡 - 编辑宏

  • 这将为您的案例显示正确的值

    对于 3D 柱形图类型,范围是 286 到 297

    相关文档在这里:

    https://docs.microsoft.com/en-us/office/vba/api/excel.chart.chartstyle
    xlChartStyle = 294
    chrt_sheet.ClearToMatchStyle
    chrt_sheet.ChartStyle = xlChartStyle

    图表样式实验

    如果您很好奇并想看看每个人的样子,请运行此代码

    提示:删除注释“#”
    #import time
    #from time import sleep

    #for xlChartStyle in range(286, 297):
    # try:
    # chrt_sheet.ClearToMatchStyle
    # chrt_sheet.ChartStyle = xlChartStyle
    # chrt_sheet.ChartTitle.Text = "Chart Style = "+str(xlChartStyle)
    # sleep(1)
    # except pythoncom.com_error as error:
    # print("Chart Style = %s" % str(xlChartStyle))

    ​​​
    格式化轴标签

    XlAxisType 枚举指定了三个轴维度
  • X 轴 = xlCategory
  • Y 轴 = xlValue
  • Z 轴 = xlSeriesAxis(仅限 3D 图表)

  • 在此示例中,我们还删除了 Z 轴刻度标签
    chrt_sheet.Axes(win32c.xlCategory).AxisTitle.Text = "X Axis Title"
    chrt_sheet.Axes(win32c.xlSeries).TickLabelPosition = win32c.xlNone
    chrt_sheet.Axes(win32c.xlSeries).HasTitle = True
    chrt_sheet.Axes(win32c.xlSeries).AxisTitle.Text = "Z Axis Title"
    chrt_sheet.Axes(win32c.xlValue).AxisTitle.Text = "Y Axis Title"

    关于excel - Python win32com PivotCache.CreatePivotChart() 错误 : 'Exception occurred' ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51953990/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com