如何通过PyWin32从ListObject创建Excel数据透视表?报错求助
问题:从ListObject创建数据透视表时触发com_error
已完成的代码逻辑
使用Python的win32com库自动化生成Excel报表,已完成以下操作:
- 打开目标工作簿
- 创建名为
SummaryTable的ListObject并设置样式 - 新增名为
People Summary的工作表
对应代码:
import os import sys from win32com.client import gencache, constants as win32c from pywintypes import com_error excel = win32.gencache.EnsureDispatch('Excel.Application') excel.Visible = True try: wb = excel.Workbooks.Open("\\".join((os.getcwd(), file))) except com_error as e: if e.excepinfo[5] == -2146827284: print(f"Filepath invalid: {file}") else: raise e sys.exit(1) # 创建ListObject table_db_property = wb.ActiveSheet.ListObjects.Add() table_db_property.Name = "SummaryTable" table_db_property.TableStyle = "TableStyleMedium2" # 新增工作表 ws = wb.Worksheets.Add() ws.Name = "People Summary"
出错的代码与错误信息
执行以下创建数据透视表的代码时触发com_error:
PivotCache = wb.PivotCaches().Create(SourceType=win32c.xlDatabase, SourceData=table_db_property.Range, Version=win32c.xlPivotTableVersion14) PivotTargetRange= wb.Worksheets("People Summary").Range("C5") PivotTable = PivotCache.CreatePivotTable(TableDestination=PivotTargetRange, TableName="Test", DefaultVersion=win32c.xlPivotTableVersion14)
错误堆栈:
--------------------------------------------------------------------------- com_error Traceback (most recent call last) <ipython-input-175-4216b80db72c> in <module> ----> 1 PivotTable = PivotCache.CreatePivotTable(TableDestination=PivotTargetRange, TableName="Test", DefaultVersion=win32c.xlPivotTableVersion14) ~\AppData\Local\Temp\42\gen_py\3.8\00020813-0000-0000-C000-000000000046x0x1x9\PivotCache.py in CreatePivotTable(self, TableDestination, TableName, ReadData, DefaultVersion) 42 # Result is of type PivotTable 43 def CreatePivotTable(self, TableDestination=defaultNamedNotOptArg, TableName=defaultNamedOptArg, ReadData=defaultNamedOptArg, DefaultVersion=defaultNamedOptArg): ---> 44 ret = self._oleobj_.InvokeTypes(1836, LCID, 1, (9, 0), ((12, 1), (12, 17), (12, 17), (12, 17)),TableDestination 45 , TableName, ReadData, DefaultVersion) 46 if ret is not None: com_error: (-2147352567, 'Exception occurred.', (0, None, None, None, 0, -2146827284), None)
已尝试修改SourceData为table_db_property.Range()、table_db_property.DataBodyRange,均无效。
排查与解决思路
确认ListObject的有效性:空的ListObject(无数据行)会导致数据源无效,先检查表是否包含数据:
if table_db_property.DataBodyRange is None: print("ListObject未包含数据,请先填充数据") sys.exit(1)改用ListObject名称作为数据源:win32com中直接传递Range对象容易出现COM类型不匹配问题,改用表的字符串引用更可靠:
sheet_name = table_db_property.Parent.Name # 构造带工作表名的表引用格式 source_data = f"'{sheet_name}'!{table_db_property.Name}" PivotCache = wb.PivotCaches().Create(SourceType=win32c.xlDatabase, SourceData=source_data)验证目标工作表存在性:避免因工作表名称拼写错误导致的定位失败,先确认目标工作表存在:
target_ws = None for ws in wb.Worksheets: if ws.Name == "People Summary": target_ws = ws break if not target_ws: print("目标工作表不存在,请检查名称拼写") sys.exit(1) PivotTargetRange = target_ws.Range("C5")简化参数调试:暂时移除
Version和DefaultVersion参数,使用Excel默认值,排除版本兼容性问题:# 简化创建逻辑 PivotCache = wb.PivotCaches().Create(SourceType=win32c.xlDatabase, SourceData=source_data) PivotTable = PivotCache.CreatePivotTable(TableDestination=PivotTargetRange, TableName="Test")检查Excel版本兼容性:如果使用Office 2013及以后版本,尝试将版本参数改为
win32c.xlPivotTableVersion15或更高,或直接省略版本参数让Excel自动适配。
内容的提问来源于stack exchange,提问作者MPadilla
相关产品推荐
相关产品推荐

