创建图表

本节介绍用Python xlwings包创建Excel图表的几种方法。可以用xlwings包提供的方法直接创建,或者用API方式创建图表工作表,也可以用Shapes对象的AddChart2方法进行创建。

Excel对象模型中,用Chart对象表示图表,Charts对象作为集合对所有图表进行保存和管理。通过编程创建图表的过程,就是创建Chart对象并利用它本身及与之相关的一系列对象的属性和方法进行编程的过程。[大谦Excel,dqexcel点com]

用xlwings方式创建图表

利用xlwings包提供的charts对象的add方法可以创建图表。该方法的语法格式为:

code.python
sht.charts.add(left=0, top=0, width=355, height=211)

其中,sht表示工作表对象,有4个参数:

• left – 表示图表左侧的位置,单位为点,默认值为0。

• top - 表示图表顶端的位置,单位为点,默认值为0。

• width - 表示图表的宽度,单位为点,默认值为355。

• height – 表示图表的高度,单位位点,默认值为211。

该方法返回一个chart对象。

图5-1中工作表上部给出的是部分省市2011-2016年的GDP数据,利用该数据绘制复合条形柱状图,代码如下所示。

code.python
>>> import xlwings as xw  #导入xlwings
>>> app=xw.App()  #创建Excel应用
>>> wb=app.books.active  #活动工作簿
>>> sht=wb.sheets.active  #活动工作表
>>> cht=sht.charts.add(50, 200)  #添加图表
>>> cht.set_source_data(sht.range("A1").expand())  #图表绑定数据
>>> cht.chart_type="column_clustered"  #图表类型
>>> cht.api[1].HasTitle=True  #图表有标题
>>> cht.api[1].ChartTitle.Text="部分省市2011-2016年GDP数据"  #标题文本

生成图形如图5-1中所示。上面代码中,使用charts对象的add方法返回一个表示空白图表的chart对象,图表左上角的位置为(50,200)。用chart对象的set_source_data方法绑定绘图数据。参数中用range对象的expand方法获取单元格A1所在的数据表。用chart_type属性指定图表类型为复合柱状图。最后用API方式指定图表的标题,注意需要设置HasTitle属性的值为True。

Document Image

图5-1 用xlwings方式创建的图形

用API方式创建图表

在API方式下创建图表,创建的是图表工作表,即创建的图表占据整个工作表。通过Charts集合的Add方法可向集合中添加新的图表工作表,Add方法的语法格式为:

code.python
wb.api.Charts.Add(Before,After,Count,Type)

其中,wb表示指定的工作簿对象。该方法的参数都可省略,各参数的含义如下:

• Before - 指定工作表对象,新建的工作表将置于此工作表之前。

• After - 指定工作表对象,新建的工作表将置于此工作表之后。

• Count - 要添加的工作表个数。默认值为1。

• Type - 指定要添加的图表类型。

注意:如果Before和After两者都省略,新建的图表工作表将插入到活动工作表之前。

该方法返回一个Chart对象。

下面使用图5-1中相同的数据,用API方式创建复合柱状图。

code.python
>>> sht.api.Range("A1:H7").Select()  #图表数据
>>> cht=wb.api.Charts.Add()  #添加图表
>>> cht.ChartType= xw.constants.ChartType.xlColumnClustered  #图表类型
>>> cht.HasTitle=True  #有标题
>>> cht.ChartTitle.Text = "部分省市2011-2016年GDP数据"  #标题文本

生成图5-2所示的图表工作表。代码中,绑定数据的方式使用的是用Select方法选择数据区域,然后用Charts对象的Add方法创建图表工作表。Add方法返回一个Chart对象,用Chart对象的ChartType属性设置图表类型为复合柱状图。注意指定图表类型常数的方式。最后指定图表的标题。

熟悉VBA的同学知道,用VBA可以创建嵌入式图表,即可以将图表嵌入到普通工作表中显示。使用xlwings方式和API方式都无法创建嵌入式图表。

Document Image

图5-2 用API方式创建的图表工作表

用Shapes对象创建图表

用Shapes对象创建图表,实际上也是在xlwings的API使用方式下实现的。在API使用方式下,使用Shapes对象的AddChart2方法创建图表。该方法的语法格式为:

code.python
sht.api.Shapes.AddChart2(Style,XlChartType,Left,Top,Width,Height,NewLayout)

其中,sht为指定工作表。一共有7个参数,均可选。

• Style:图表样式,值为-1时表示各图形类型的默认样式。

• xlChartType:图表类型,值为XlChartType枚举类型,表5-1中列出了一部分。

• Left:图表左侧位置,省略时水平居中。

• Top:图表顶端位置,省略时垂直居中。

• Width:图表的宽度,省略时取默认值354。

• Height:图表的高度,省略时取默认值210。

• NewLayout:表示图表布局,如果值为True,则只有复合图形才会显示图例。

该方法返回一个表示图表的Shape对象。

下面利用图5-1所示工作表中的数据绘制复合柱状图。首先选择数据区域,然后用Shapes对象的AddChart2方法绘制。

code.python
>>> sht.api.Range("A1").CurrentRegion.Select()
>>> sht.api.Shapes.AddChart2(-1,xw.constants.ChartType.xlColumnClustered,30,150,300,200,True)

生成图5-3所示工作表下方的图形。对比图5-1不难发现,使用API方式下的Shapes对象创建的图表与使用xlwings方式绘制的图表效果相同。所以可以推测,xlwings对Win32COM进行重新封装时本质上是使用Shapes对象创建图表的。

Document Image

图5-3 利用给定数据绘复合柱状图

绑定数据

如5.1.1-5.1.3所述,可用两种方法绑定数据。

第一种方法是使用单元格区域的Select方法选择数据,在5.1.1-5.1.3介绍的创建图表的3中方法中,这种选择数据的方法适用于后面两种创建方法,即使用API方式创建的两种方法。

对于工作表sht,使用代码类似于下面的形式:

code.python
>>> sht.api.Range("A1").CurrentRegion.Select()

code.python
>>> sht.api.Range("A1:H7").Select()

另一种是使用chart(Chart)对象的set_source_data(SetSourceData)方法绑定数据,在5.1.1-5.1.3介绍的创建图表的3种方法中,这种选择数据的方法适用于前两种,即xlwings使用方式和第1种API使用方式。

在xlwings使用方式下,使用chart对象的set_source_data方法绑定数据。例如,对于工作表sht和图表cht,使用代码类似于下面的形式:

code.python
>>> cht.set_source_data(sht.range("A1").expand())

该方法只有一个参数,为一range对象,指定数据的范围。

使用第1种API使用方式可以创建图表工作表。通过Chart对象的SetSourceData方法,可为指定图表设置源数据区域。其语法格式如下:

code.python
cht.SetSourceData(Source, PlotBy)

其中,cht为生成的chart对象,有两个参数,含义如下:

• Source - 为一个Range对象,用来指定图表的源数据区域。

• PlotBy - 指定取数据的方式。值为1时表示按列取数据,值为2时表示按行取数据。

对于工作表sht和图表cht,使用代码类似于下面的形式:

code.python
>>> cht.SetSourceData(Source=sht.api.Range("A1:H7"), PlotBy=1)