使用Python和win32com创建组合图



我需要使用基于win32com的Python程序,从Excel数据生成一个组合图。我在编写正确的代码时遇到了问题,因为Microsoft API引用是针对VBA的,并且并不总是很容易理解哪一个是等效的Python代码。

使用AddChart2((方法创建两个分开的图表没有问题,但组合它们有问题。

要创建两个单独的图表很容易。例如,创建了一个散点图

chart_ws.Shapes.AddChart2(240, win32c.xlXYScatter, 0, 0, 480, 480).Select()
scatter_chart = wb.ActiveChart

而创建的是100%柱状堆积图

chart_ws.Shapes.AddChart2(-1, win32c.xlColumnStacked100, 0, 0, 480, 480).Select()
stacked_chart = wb.ActiveChart

请注意,chart_ws只是一个用于分配图表的工作表。我提前创建了它。一旦我有了任何图表,我可以添加一系列数据,如下

series = any_chart.SeriesCollection(1).NewSeries()
series.Values = [...] # A list of values, for example, from an Excel Range

这项工作做得很好。

现在我正在尝试创建一个单独的组合图表,我尝试了

chart_ws.Shapes.AddChart2(240, win32c.xlXYScatter, 0, 0, 480, 480).Select()
# Set combo chart properties
chart = wb.ActiveChart
chart.HasTitle = True
chart.ChartTitle.Text = "My Combo Chart"
# Here I try to set the first chart
chart.FullSeriesCollection(1).ChartType = win32c.xlXYScatter # Redundant?
chart.FullSeriesCollection(1).AxisGroup = 1
# Here is where I create a series for scatter chart
series = chart.SeriesCollection(1).NewSeries() # Only one series of (X,Y) data
series.Name = "Scatter Data"
series.XValues = [...] # A list of values
series.Values = [...] # A list of values
# Here I try to set the second chart (no title)
chart.FullSeriesCollection(2).ChartType = win32c.xlColumnStacked100 # Necessary
chart.FullSeriesCollection(2).AxisGroup = 2
# Here is where I create two series for column stacked chart
series = chart.SeriesCollection(2).NewSeries() # First series for stacked columns
series.Values = [...] # A list of values
series = chart.SeriesCollection(2).NewSeries() # Second series for stacked columns
series.Values = [...] # A list of values

然而,我得到一个错误,这是典型的错误使用API

(-2147352567, 'Exception occurred.', (0, 'S', 'Parameter not valid', None, 0, -2146827284), None)

所以,我的代码是错误的。这并不奇怪,但我很难理解为什么和在哪里。API参考手册没有支持我的例子。我花了一些时间在网上搜索一些例子,但我发现没有什么对我有用的。

感谢您的帮助。我希望我能清楚地描述这个问题。

已解决

我做了几次尝试来找出正确的解决方案,最终我做到了。诀窍是不要创建两个不同的图表系列集合,而只创建一个,并将ChartTypeAxisGroup属性直接关联到单个系列。这段代码运行良好,我把它发布在这里,以防对其他人有用。

chart_ws.Shapes.AddChart2(240, win32c.xlXYScatter, 0, 0, 480, 480).Select()
# Set combo chart properties
chart = wb.ActiveChart
chart.HasTitle = True
chart.ChartTitle.Text = "My Combo Chart"
# Here is where I create a series for scatter chart
series = chart.SeriesCollection().NewSeries() # Only one series of (X,Y) data
series.AxisGroup = win32c.xlPrimary
series.ChartType = win32c.xlXYScatter
series.Name = "Scatter Data"
series.XValues = [...] # A list of values
series.Values = [...] # A list of values
# Here is where I create two series for column stacked chart
series = chart.SeriesCollection().NewSeries() # First series for stacked columns
series.AxisGroup = win32c.xlSecondary
series.ChartType = win32c.xlColumnStacked100
series.Values = [...] # A list of values
series = chart.SeriesCollection().NewSeries() # Second series for stacked columns
series.AxisGroup = win32c.xlSecondary
series.ChartType = win32c.xlColumnStacked100
series.Values = [...] # A list of values

最新更新