Python的win32com PivotCache.CreatePivotChart()错误: &

2019-10-31 06:46发布

有一个从2017年9月一个其他的问题,解决这个同样的问题,但没有一个答案: 建立与Python数据透视图win32com

我尝试了好几种方法来得到这个工作,所以我要解释这些并从别人如何得到这个工作,希望得到一些见解。 这似乎并非是一个陈旧的路,所以我不寄予厚望。

环境的详细信息:

  • 视窗10
  • 办公室2013
  • 蟒蛇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

每个人也有同样的错误。

我也跑这个命令按照文件在这里 :

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)

源数据有100行,18列的熊猫数据帧是我写的使用ExcelWriter Excel来

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()创建(),而不是。新增(),所以我可以指定版本= win32c.xlPivotTableVersion15这是2013年办公正确的版本,否则它似乎默认为11版。

pc = wb.PivotCaches().Create(SourceType=win32c.xlDatabase, SourceData=pvt_src, Version=win32c.xlPivotTableVersion15)

这种变化移动拨号,但并没有解决我的问题 - 我仍然得到一个错误,该图表是没有得到创建:

  • 当我应用这个变化对枢轴表的格式被增强。
  • 从-2147024809改变根的错误代码是“的参数是不正确”要根错误代码-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 - 也是默认的 - 因此它在无头的模式下运行。

添加表,创建数据透视表,添加字段是成功的 ,这些都包裹在尝试-除了在实际的代码-简洁,删除。

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,左,上,宽度,高度

文档在这里 :

基于实施例I通过片材或图表对象为字符串“枢轴表”的名称。 这应该工作。

pch = pc.CreatePivotChart(ChartDestination='Pivot Chart')

因为参数被定义为变体然后我明确指定的字符串变量对象。 我尝试了各种不同的变量类型,但是这并不会产生不同的结果。

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)

Answer 1:

感谢您Boussif寻找这个方式。

这是我工作的解决方案:

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

使用我们之前创建工作簿对象,我们可以在“插入”图表给我们的工作簿,并分配一个名称我们的图表 - 的名字出现在标签。

因为数据透视表在枢轴缓存的对象 - 这是在工作簿对象,图表对象被添加为透视图表,并使用数据透视表作为它的数据。

在这里阅读相关文章:

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

设置图表标题

该表对象不会有ChartTitle属性,直到设置HasTitle属性为True

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也是有效的。

拿到赛风格的选择可用于您的图表类型的数字编号:

  1. 在开发人员选项卡 - 运行宏
  2. 从图表设计选项卡 - 选择所有样式
  3. 从Devloper选项卡 - 停止运行宏
  4. 从开发工具选项卡 - 编辑宏

这将显示正确的值,你的情况

对于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"


文章来源: Python win32com PivotCache.CreatePivotChart() error: 'Exception occurred'