通过编程创建Excel数据透视表,主要有两种方法,一种是使用工作表对象的PivotTableWizard方法,通过向导进行创建;另一种是使用缓存对象的CreatePivotTable方法进行创建。[大谦Excel,dqexcel点com]
用PivotTableWizard方法创建数据透视表
图7-1所示工作表中为订购各种蔬菜水果的数据,现使用工作表对象的PivotTableWizard方法创建数据透视表。将数据中的“类别”作为页字段、将“产品”作为列字段、将“产地”作为行字段、将“金额”作为值字段。
图7-1 创建数据透视表的数据源
【Excel VBA】
示例文件的存放路径为Samples\ch19\Excel VBA\创建透视表1.xlsm。PVT过程用工作表对象的PivotTableWizard方法创建数据透视表。
代码首先获取数据源,新建存放数据透视表的工作表。
Dim shtData As Worksheet
Dim shtPVT As Worksheet
Dim rngData As Range
Dim PVT As PivotTable
'数据所在工作表
Set shtData = Worksheets("数据源")
'数据所在单元格区域
Set rngData = shtData.Range("A1").CurrentRegion
'新建透视表所在工作表
Set shtPVT = Worksheets.Add()
shtPVT.Name = "数据透视表" '工作表的名称
指定数据源的类型和单元格区域,创建透视表。
Set PVT = shtPVT.PivotTableWizard(SourceType:=xlDatabase, _
SourceData:=rngData)
PVT.Name = "透视表" '透视表的名称
然后设置透视表的各种字段。将数据中的“类别”作为页字段、将“产品”作为列字段、将“产地”作为行字段、将“金额”作为值字段。
With PVT
.PivotFields("类别").Orientation = xlPageField '页字段
.PivotFields("类别").Position = 1 '页字段中的第1个字段
.PivotFields("产品").Orientation = xlColumnField '列字段
.PivotFields("产品").Position = 1 '列字段中的第1个字段
.PivotFields("产地").Orientation = xlRowField '行字段
.PivotFields("产地").Position = 1 '行字段中的第1个字段
.PivotFields("金额").Orientation = xlDataField '值字段
End With
PVT过程的完整代码请参见文件。运行过程,新建名为“数据透视表”的工作表并在工作表中生成数据透视表如图7-2所示。
图7-2 创建数据透视表
【Python】
编写Python脚本,脚本文件的存放路径为Samples\ch19\Python\创建透视表1.py。
脚本中首先导入xlwings包和os包,创建Excel应用并打开指定路径下的数据文件,获取数据源工作表。
import xlwings as xw #导入xlwings
import os #导入os
root = os.getcwd() #获取当前路径
#创建Excel应用窗口,可见,不添加工作簿
app=xw.App(visible=True, add_book=False)
#打开数据文件,可写
bk=app.books.open(fullname=root+r'\创建透视表.xlsx',read_only=False)
#获取数据源工作表
sht_data=bk.sheets.active
获取数据所在的单元格区域,新建存放数据透视表的工作表。
rng_data=sht_data.api.Range('A1').CurrentRegion
#新建透视表所在工作表
sht_pvt=bk.sheets.add()
sht_pvt.name='数据透视表'
使用xlwings的API使用方式创建数据透视表。
Pvt=sht_pvt.api.PivotTableWizard(\
SourceType=xw.constants.PivotTableSourceType.xlDatabase,\
SourceData=rng_data)
pvt.Name=’透视表’
给数据透视表设置字段及该字段在所属类别字段中的位置。将数据中的“类别”作为页字段、将“产品”作为列字段、将“产地”作为行字段、将“金额”作为值字段。
pvt.PivotFields('类别').Orientation=\
xw.constants.PivotFieldOrientation.xlPageField #页字段
pvt.PivotFields('类别').Position=1 #页字段中的第1个字段
pvt.PivotFields('产品').Orientation=\
xw.constants.PivotFieldOrientation.xlColumnField #列字段
pvt.PivotFields('产品').Position=1 #列字段中的第1个字段
pvt.PivotFields('产地').Orientation=\
xw.constants.PivotFieldOrientation.xlRowField #行字段
pvt.PivotFields('产地').Position=1 #行字段中的第1个字段
pvt.PivotFields('金额').Orientation=\
xw.constants.PivotFieldOrientation.xlDataField #值字段
运行脚本,生成如图7-2所示的数据透视表。
用缓存创建数据透视表
用缓存创建数据透视表,Excel会给数据透视表建立一个缓存,通过该缓存,可以实现对数据源中数据的快速读取。用PivotCaches集合的Create方法创建PivotCache对象,即缓存对象,然后用缓存对象的CreatePivotTable方法创建数据透视表。
【Excel VBA】
示例文件的存放路径为Samples\ch19\Excel VBA\创建透视表2.xlsm。PVT过程实现数据透视表的创建。
代码首先获取数据源,新建存放数据透视表的工作表,指定在工作表中存放数据透视表的位置。
Dim shtData As Worksheet
Dim shtPVT As Worksheet
Dim rngData As Range
Dim rngPVT As Range
Dim pvc As PivotCache
Dim PVT As PivotTable
'数据所在工作表
Set shtData = Worksheets("数据源")
'数据所在单元格区域
Set rngData = shtData.Range("A1").CurrentRegion
'新建透视表所在工作表
Set shtPVT = Worksheets.Add()
shtPVT.Name = "数据透视表"
'放透视表的位置
Set rngPVT = shtPVT.Range("A1")
创建数据透视表关联的缓存,用缓存对象创建数据透视表。PivotCaches对象的Create方法指定数据源的类型和数据源所在的单元格区域。工作表对象的CreatePivotTable方法创建数据透视表,参数指定数据透视表的存放位置和名称。数据透视表的存放位置实际上是指定数据透视表所在区域的左上角位置。
'创建数据透视表关联的缓存
Set PVC= ActiveWorkbook.PivotCaches.Create( _
SourceType:=xlDatabase, SourceData:=rngData)
'创建透视表
Set PVT =PVC.CreatePivotTable(TableDestination:=rngPVT, _
TableName:="透视表")
给数据透视表设置字段。将数据中的“类别”作为页字段、将“产品”作为列字段、将“产地”作为行字段、将“金额”作为值字段。
With PVT
.PivotFields("类别").Orientation = xlPageField '页字段
.PivotFields("类别").Position = 1
.PivotFields("产品").Orientation = xlColumnField '列字段
.PivotFields("产品").Position = 1
.PivotFields("产地").Orientation = xlRowField '行字段
.PivotFields("产地").Position = 1
.PivotFields("金额").Orientation = xlDataField '值字段
End With
运行过程,生成数据透视表如图7-3中所示。
图7-3 用缓存创建数据透视表
【Python】
编写Python脚本,脚本文件的存放路径为Samples\ch19\Python\创建透视表2.py。
#前面代码省略,请参见Python文件
#......
#放透视表的位置
rng_pvt=sht_pvt.api.Range('A1')
#创建透视表关联的缓冲区
pvc=bk.api.PivotCaches.Create(\
SourceType=xw.constants.PivotTableSourceType.xlDatabase,\
SourceData=rng_data)
#创建透视表
pvt=sht_pvt.api.CreatePivotTable(\
TableDestination=rng_pvt,\
TableName='透视表')
运行脚本,在Python Shell窗口返回下面的出错信息。
>>> = RESTART: …\Samples\ch19\Python\创建透视表2.py
Traceback(most recent call last):
File "…\Samples\ch19\Python\创建透视表2.py", line 19, in <module>
pvc=bk.api.PivotCaches.Create(\
AttributeError: 'function' object has no attribute 'Create'
可见,使用xlwings包,用缓存创建数据透视表时存在问题,创建失败。所以,本章后面讨论的数据透视表都是用工作表对象的PivotTableWizard方法创建的。
数据透视表的引用
创建数据透视表以后,数据透视表对象存储在所在工作表的PivotTables集合中。如果需要对该集合中的某个数据透视表进行修改,要首先从集合中找到它并提取出来。所以,数据透视表的引用就是从集合中找到需要的数据透视表。
数据透视表的引用有使用索引号和使用名称两种方法。
【Excel VBA】
示例文件的存放路径为Samples\ch19\Excel VBA\透视表的引用.xlsm。文件中有两个过程,CreatePVT过程创建数据透视表,IndexPVT过程引用数据透视表。为简洁计,CreatePVT过程的代码省略。在进行数据透视表的引用之前,必须先运行CreatePVT过程,创建数据透视表。
IndexPVT过程的代码如下所示。用PivotTables集合的Count属性获取工作表中数据透视表的个数,然后用索引号引用集合中的第1个数据透视表,用名称引用集合中名为“透视表”的数据透视表。
Sub IndexPVT()
'透视表的引用
Dim shtPVT As Worksheet
Set shtPVT = Worksheets("数据透视表")
Debug.Print shtPVT.PivotTables.Count '工作表中数据透视表的个数
Debug.Print shtPVT.PivotTables(1).Name '用索引号引用
Debug.Print shtPVT.PivotTables("透视表").Name '用名称引用
End Sub
运行过程,在立即窗口输出结果。
1
透视表
透视表
【Python】
编写Python脚本,脚本文件的存放路径为Samples\ch19\Python\透视表的引用.py。
#前面代码省略,请参见Python文件
#......
#透视表的引用
#print(sht_pvt.api.PivotTables.Count) #出错
print(sht_pvt.api.PivotTables(1).Name) #用索引号引用
print(sht_pvt.api.PivotTables("透视表").Name) #用名称引用
运行过程,在Python Shell窗口输出数据透视表的名称。
>>> = RESTART: …\Samples\ch19\Python\透视表的引用.py
透视表
透视表
注意,上面代码中第1行被注释掉了。因为执行该行代码会触发类似用缓存创建数据透视表的function错误。可见,Python的xlwings包在处理数据透视表时还存在少量bug。
刷新数据透视表
刷新数据透视表使用PivotTable对象的RefreshTable方法。
【Excel VBA】
示例文件的存放路径为Samples\ch19\Excel VBA\刷新透视表.xlsm。文件中有两个过程,CreatePVT过程创建数据透视表,UpdatePVT过程刷新数据透视表。为简洁计,CreatePVT过程的代码省略。在刷新数据透视表之前,必须先运行CreatePVT过程,创建数据透视表。
UpdatePVT过程的代码如下所示。
Sub UpdatePVT()
'省略,获取数据透视表pvt
'…
pvt.RefreshTable
End Sub
运行过程,刷新数据透视表。
【Python】
编写Python脚本,脚本文件的存放路径为Samples\ch19\Python\刷新透视表.py。
#前面代码省略,请参见Python文件
#......
#刷新透视表
pvt.RefreshTable
运行脚本,刷新数据透视表。[大谦Excel,dqexcel点com]