xlwings包因为实现了对VBA使用的Excel类库的二次封装,所以VBA能做的,它基本上都能做,包括图表绘制。用xlwings包可以调用Excel自身的图表功能,包括三维图表和透视表等。本章简单介绍用xlwings包绘制条形图和饼图。如果希望更深入地了解xlwings包的图表功能,推荐参阅《代替VBA! 用Python轻松实现Excel编程》一书。[大谦Excel,dqexcel点com]
条形图
【问题描述】
用给定数据,使用xlwings绘制二维条形图。
【示例12-1】
本例使用的Excel文件的完整路径为“D:/Samples/ch12/商品销量.xlsx”。该文件打开后如图12-1所示。试用该表数据绘制二维复合条形图。
图12-1 商品销量表
- ChatGPT提示词模板
新建ChatGPT会话,在提问文本框中输入下面的提示词:
你是xlwings专家,文件路径为:D:/Samples/ch12/商品销量.xlsx。用xlwings打开Excel文件。用A1:D6范围内的数据生成条形图。sht为工作表对象,用sht.api.Shapes对象的AddChart方法创建图表,不指定参数名称。SetSourceData方法绑定数据时单元格区域用sht.api.Range指定。注意属性和方法的大小写。注意参数为常数时,常数的完整写法为:xw.constants.枚举名称.常数值,常数值前面一般有”xl”前缀,比如:xw.constants.BorderWeight.xlThick。设置颜色用xw.utils.rgb_to_int函数。保存文件,退出xlwings应用。添加代码注释。
- ChatGPT提示词模板说明
注意,xlwings包有新语法和api两种用法,两种用法大多数情况下不能混合起来用,比如,不能使用api方式调用对象的方法,但是给方法的参数赋值时又使用新语法生成的对象。所以提示词中需要明确指定使用哪种方法。
第2个方面就是常数的写法,也要明确指出并举例说明。其他还有颜色的设置方法等,也要明确说明。
3. 代码
- 根据提示词得到类似下面的xlwings代码:
import xlwings as xw
# 打开Excel文件
wb = xw.Book(r'D:/Samples/ch12/商品销量.xlsx')
sht = wb.sheets[0]
# 用A1:D6范围内的数据生成条形图
chart = sht.api.Shapes.AddChart().Chart
chart.ChartType = xw.constants.ChartType.xlColumnClustered
chart.SetSourceData(sht.api.Range('A1:D6'))
# 设置颜色
color = xw.utils.rgb_to_int((255, 0, 0))
series = chart.SeriesCollection(1)
series.Format.Fill.ForeColor.RGB = color
# 保存文件并退出xlwings应用
wb.save()
wb.close()
4. 使用代码
打开Python IDLE,新建一个脚本文件,将上面生成的代码复制进去,保存到D:/Samples/1.py。运行脚本,生成复合条形图并添加到Excel工作表中,如图12-2所示。
图12-2 xlwings包生成复合条形图
【知识点扩展】
xlwings包的功能非常强大,但是知识体系也比较复杂,语法有两套,创建图表的方法、绑定数据的方法等都有多种。所以,使用ChatGPT时,提示词要写得很详细,关键的地方要讲得很明确不含糊。
在工作簿对象、工作表对象或单元格对象后面跟”.api”,如sht.api,其中sht是新语法得到的工作表对象,则现在工作表对象变成了COM对象,以后针对该对象及其子对象的编程都要使用类VBA的语法,常数指定等也有相应的要求。
本例使用下面的语句创建条形图:
chart = sht.api.Shapes.AddChart().Chart
chart.ChartType = xw.constants.ChartType.xlColumnClustered
chart.SetSourceData(sht.api.Range('A1:D6'))
注意,sht.api的后面,对象的属性和方法名称都变成了首字母大写,这是VBA的语法特点。现在工作表对象是一个COM对象了。使用Shapes.AddChart方法创建一个Shape对象,引用Shape对象的Chart属性,得到图表对象。用图表对象的ChartType属性指定图表类型,用SetSourceData方法绑定数据。注意该方法的参数,指定绘图数据所在的单元格区域必须是一个COM对象,因为chart是一个COM对象。
饼图
【问题描述】
用给定数据,使用xlwings绘制二维饼图。
【示例12-2】
本例使用的Excel文件的完整路径为“D:/Samples/ch12/访客年龄.xlsx”。该文件打开后如图12-3所示,试用该表数据绘制二维饼图。
图12-3 访客年龄和占比
- ChatGPT提示词模板
新建ChatGPT会话,在提问文本框中输入下面的提示词:
你是xlwings专家,文件路径为:D:/Samples/ch12/访客年龄.xlsx。用xlwings打开Excel文件。用A1:B5范围内的数据生成饼图。sht为工作表对象,用sht.api.Shapes对象的AddChart方法创建图表,不指定参数名称。SetSourceData方法绑定数据时单元格区域用sht.api.Range指定。注意属性和方法的大小写。注意参数为常数时,常数的完整写法为:xw.constants.枚举名称.常数值,常数值前面一般有"xl"前缀,比如:xw.constants.BorderWeight.xlThick。设置颜色用xw.utils.rgb_to_int函数。保存文件,退出xlwings应用。添加代码注释。
2. 代码
- 根据提示词得到类似下面的xlwings代码:
import xlwings as xw
# 打开Excel文件
filePath = 'D:/Samples/ch12/访客年龄.xlsx'
wb = xw.Book(filePath)
sht = wb.sheets[0]
# 用A1:B5范围内的数据生成饼图
chart = sht.api.Shapes.AddChart().Chart
chart.ChartType = xw.constants.ChartType.xlPie
dataRange = sht.api.Range('A1:B5')
chart.SetSourceData(dataRange)
# 设置饼图颜色
colors = [xw.utils.rgb_to_int((255, 0, 0)), xw.utils.rgb_to_int((0, 255, 0)),
xw.utils.rgb_to_int((0, 0, 255)), xw.utils.rgb_to_int((255, 255, 0)),
xw.utils.rgb_to_int((255, 0, 255))]
for i, pnt in enumerate(chart.SeriesCollection(1).Points()):
pnt.Format.Fill.ForeColor.RGB = colors[i]
# 保存Excel文件并退出应用
wb.save()
wb.close()
3. 使用代码
打开Python IDLE,新建一个脚本文件,将上面生成的代码复制进去,保存到D:/Samples/1.py。运行脚本,生成饼图并添加到Excel工作表中,如图12-4所示。
图12-4 绘制饼图