You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用Python win32COM创建PIVOT TABLE时添加计算字段报错求助

解决Excel透视表计算字段报错:References, names and arrays are not supported in Pivot Table formulas

这个报错的核心原因是你在计算字段公式里直接引用了原始数据源的字段名,但透视表的计算字段只能引用透视表中已经存在的汇总后的数据字段,而且字段名的格式必须完全匹配(包括自动添加的汇总前缀,比如Sum of)。

问题分析

当你用AddDataField添加数据字段时,Excel默认会给字段名加上汇总函数前缀(比如Sum of Gross KgsSum of Amount (RS.)),而不是保留原始字段名。你直接写= Amount (RS.) / Gross Kgs,透视表无法识别这些原始字段,就会抛出不支持引用的错误。

修复方案

有两种方式可以解决这个问题,推荐第一种,因为更可控:

方式1:自定义数据字段名称,明确引用

在添加数据字段时,指定自定义名称,这样后续计算字段可以直接引用这个明确的名称:

import win32com.client
Excel = win32com.client.gencache.EnsureDispatch('Excel.Application')
win32c = win32com.client.constants
Wb = Excel.Workbooks.Open('MyWorkbook')
Excel.Visible = True
Ws = Wb.Sheets('PR Jan20')
Wb.Sheets.Add()
Wb.ActiveSheet.Name = 'PivotSheet'
WsP = Wb.Sheets('PivotSheet')
MaxR = Ws.UsedRange.Rows.Count
MaxC = Ws.UsedRange.Columns.Count
C1 = Ws.Cells(1,1)
C2 = Ws.Cells(MaxR, MaxC)
PivotSourceRange = Ws.Range(C1,C2)
PCache = Wb.PivotCaches().Create(SourceType=win32c.xlDatabase, SourceData=PivotSourceRange,Version=win32c.xlPivotTableVersion14)
PTable = PCache.CreatePivotTable(TableDestination=WsP.Range('B2'), TableName='RegisterPivot', DefaultVersion=win32c.xlPivotTableVersion14)

# 设置行字段
PTable.PivotFields('Party').Orientation = win32c.xlRowField
PTable.PivotFields('Party').Position = 1

# 添加数据字段时指定自定义名称,避免默认的Sum前缀
PTable.AddDataField(PTable.PivotFields('Gross Kgs'), 'Total Gross Kgs', win32c.xlSum)
PTable.AddDataField(PTable.PivotFields('Amount (RS.)'), 'Total Amount', win32c.xlSum)

# 现在用自定义的字段名添加计算字段,注意用双引号括起有空格的字段名
PTable.CalculatedFields().Add('Average Purchase Rate', '= "Total Amount" / "Total Gross Kgs"')

方式2:使用默认的汇总字段名

如果你不想自定义名称,就必须用Excel自动生成的带前缀的字段名,格式是Sum of [原始字段名]

# 替换报错的那一行:
PTable.CalculatedFields().Add('Average Purchase Rate', '= "Sum of Amount (RS.)" / "Sum of Gross Kgs"')

额外注意事项

  • 字段名如果包含空格、特殊字符,必须用英文双引号(或单引号)括起来,否则透视表无法识别。
  • 确保Gross Kgs字段不会出现0值,否则会触发除以零的错误,可以在公式里加判断,比如= IF("Total Gross Kgs"=0, 0, "Total Amount"/"Total Gross Kgs")

内容的提问来源于stack exchange,提问作者Waqas Muhammad

火山引擎 最新活动