如何使用Python的win32com模块折叠/展开Excel数据透视表?
解决win32com创建Excel透视表后折叠整个表的方法
可以通过以下两种方法实现透视表的完全折叠,直接整合到现有代码中即可:
方法一:调用行字段的CollapseAll()方法
针对透视表中的行字段(Period和Name),直接调用字段的CollapseAll()方法,一键折叠所有层级的项。
将折叠逻辑放到insert_pt_field_set函数末尾即可:
def insert_pt_field_set(pt): field_rows = {} field_rows['Period'] = pt.PivotFields('Period') field_rows['Name'] = pt.PivotFields('Name') field_values = {} field_values['Name'] = pt.PivotFields("Name") field_rows['Period'].Orientation = 1 field_rows['Period'].Position = 1 field_rows['Name'].Orientation = 1 field_rows['Name'].Position = 2 field_values['Name'].Orientation = 4 field_values['Name'].Function = -4112 # 新增:折叠所有行字段的项 field_rows['Period'].CollapseAll() field_rows['Name'].CollapseAll()
方法二:遍历字段项手动设置折叠
如果CollapseAll()方法在你的Excel版本中不生效,可手动遍历每个字段的所有项,设置ShowDetail=False实现折叠:
def insert_pt_field_set(pt): # ... 原字段设置代码 ... # 新增:遍历Period字段的所有项并折叠 for item in pt.PivotFields('Period').PivotItems(): item.ShowDetail = False # 新增:遍历Name字段的所有项并折叠 for item in pt.PivotFields('Name').PivotItems(): item.ShowDetail = False
完整修改后的代码示例
import win32com.client def insert_pt_field_set(pt): field_rows = {} field_rows['Period'] = pt.PivotFields('Period') field_rows['Name'] = pt.PivotFields('Name') field_values = {} field_values['Name'] = pt.PivotFields("Name") field_rows['Period'].Orientation = 1 field_rows['Period'].Position = 1 field_rows['Name'].Orientation = 1 field_rows['Name'].Position = 2 field_values['Name'].Orientation = 4 field_values['Name'].Function = -4112 # 折叠所有行字段项 field_rows['Period'].CollapseAll() field_rows['Name'].CollapseAll() xlApp = win32com.client.Dispatch('Excel.Application') xlApp.Visible = True wb = xlApp.Workbooks.Open('output.xlsx') ws = wb.Worksheets('Sheet1') ws_pivot = wb.Worksheets('Pivot_Sheet1') pt_cache = wb.PivotCaches().Create(1, ws.Range("A1").CurrentRegion) pt = pt_cache.CreatePivotTable(ws_pivot.Range("B3"), "PivotName") pt.ColumnGrand = True pt.RowGrand = False pt.SubtotalLocation(2) pt.RowAxisLayout(2) pt.TableStyle2 = "PivotStyleMedium2" insert_pt_field_set(pt) wb.Close(True) xlApp.Quit() # 建议添加此代码,避免后台残留Excel进程
注意事项
- 操作完成后调用
xlApp.Quit(),防止Excel进程在后台残留占用资源。 - 若方法一无效,直接替换为方法二的遍历逻辑即可适配不同Excel版本。
内容的提问来源于stack exchange,提问作者David Amar
相关产品推荐
相关产品推荐

