我编写了一个 Powershell 脚本来获取 CSV,从中创建 Excel 工作表,并创建一个包含几行和汇总值的数据透视表。 我还可以添加一个过滤字段,但我无法成功地告诉过滤字段我希望它过滤什么值。
PivotFilters.Add 和 PivotFilters.Add2 方法总是抛出“值不在预期范围内”错误。
这是代码的相关部分:
# Add PivotTable
$WS2 = $WBK1.Worksheets.Add()
$WS2.Name = "PivotTable"
$xlPivotTableVersion15 = 5 # Excel 2013
$xlPivotTableVersion12 = 3 # Excel 2007
$xlDescending = 2
$xlDatabase = 1 # this just means local sheet data
$xlHidden = 0
$xlRowField = 1
$xlColumnField = 2
$xlFilterField = 3
$xlDataField = 4
$xlSum = -4157
$xlAverage = -4106
$xlCount = -4112
$xlRight = -4152
$pivotRange = $WS1.UsedRange
$PivotTable = $WBK1.PivotCaches().Create($xlDatabase,$pivotRange,$xlPivotTableVersion15)
$PivotTable.CreatePivotTable("R1C1","Tables1") | Out-Null
[void]$WS2.Select()
$WBK1.ShowPivotTableFieldList = $true
# configure pivottable fields
$PivotFields = $WS2.PivotTables("Tables1").PivotFields("VmName")
$PivotFields.Orientation = $xlRowField
$PivotFields = $WS2.PivotTables("Tables1").PivotFields("RAM")
$PivotFields.Orientation = $xlDataField
$PivotFields.Function = $xlAverage
$PivotFields = $WS2.PivotTables("Tables1").PivotFields("vCPU")
$PivotFields.Orientation = $xlDataField
$PivotFields.Function = $xlAverage
$PivotFields = $WS2.PivotTables("Tables1").PivotFields("Dept") # I also tried commenting these lines out
$PivotFields.Orientation = $xlFilterField # I also tried commenting these lines out
$xlValueEquals = 7
$xlCaptionEquals = 15
$WS2.PivotTables("Tables1").PivotFields("Dept").PivotFilters.Add2($xlValueEquals, "Finance")
我尝试同时使用 PivotFilters.Add 和 PivotFilters.Add2,无论哪种方式我总是得到“值不在预期范围内。”
我还尝试注释掉上面注释的行,因为我想知道创建的过滤器是否会使它感到困惑。
非常感谢任何建议!
好吧,最后我发现基本上将一个值写入我使用...创建的过滤器的单元格中......
$PivotFields = $WS2.PivotTables("Tables1").PivotFields("Dept")
$PivotFields.Orientation = $xlFilterField
...有效,所以我可以取消 PivotFilters.Add / PivotFilters.Add2 方法。 如果有人知道答案,我相信 t'interweb 上的人会很感激分享的解决方案。
我也从未使用过
PivotFilters.Add
方法。然而,对我有用的是创建和操作切片器。
创建并配置后(例如日期切片器),您可以查询切片器的
SlicerCacheLevel.SlicerItems
数组中的有效值,然后通过更新 SlicerCache.VisibleSlicerItemsList
中的数组来应用过滤/切片数据。
令人困惑的是,当您尝试更新它时,有一个
SlicerCacheLevel.VisibleSlicerItemsList
会出错。由于 SlicerCache.VisibleSlicerItemsList
有效,我没有进一步研究。
我使用 Add2 没有问题,但是早期的 powersell 帮助文件对于如何正确格式化 Add2() 并不准确。 使用以下格式。
PivotFilter.Add2(XlPivotFilterType 类型、变体数据字段、变体值 1、变体值 2、变体顺序、变体名称、变体描述、变体 MemberPropertyField,变体 WholeDayFilter)
对于 XlPivotFilterType 输入代表过滤器类型的正确数字。 对于变体数据字段,您需要使用完整路径,即: $wb.Sheets('Sheet1').PivotTables("PivotTable01").PivotFields("Count of date") 对于 Variant Value1,请使用您要过滤的值。
这是我的一个拉取示例,它在日期字段上过滤以过滤“开始于”2024-05-01。
$wb.Sheets('Sheet1').PivotTables('PivotTable01').PivotFields('日期').PivotFilters.Add2(17,$wb.Sheets('Sheet1').PivotTables("PivotTable01").PivotFields( “日期计数”),“2024-05-01”)