Python xlwings复制含数据透视表的Excel工作表报错如何解决
报错触发原因
- 工作表包含跨表引用的
INDEX/MATCH函数,单独复制工作表时引用的全量数据源工作表不存在于新工作簿,触发Excel内置保护限制 - 工作表中数据透视表关联的数据源缓存绑定了原工作簿的其他工作表,无法直接单独复制
- 筛选状态的区域在后台无UI模式复制时,容易触发Excel COM接口异常
- 默认开启的Excel弹窗告警在后台静默运行时无法人工确认,会直接抛出复制失败错误
可行解决方法
优先修改脚本关闭Excel告警,改用单元格全量复制的方式替代整张工作表复制,如果不需要保留动态公式和透视表,直接粘贴值与格式即可,稳定度更高,参考代码如下:
import xlwings as xw EXCEL_FILE = 'NPS_Report_Template.xlsx' try: # 启动Excel时关闭告警、屏幕更新,提升运行稳定性 excel_app = xw.App(visible=False, add_book=False) excel_app.display_alerts = False excel_app.screen_updating = False wb = excel_app.books.open(EXCEL_FILE) for sheet in wb.sheets: # 新建空白工作簿 wb_new = excel_app.books.add() # 复制原工作表所有已使用单元格 sheet.used_range.copy() # 粘贴到新工作簿第一个工作表,粘贴值+数字格式+单元格格式 wb_new.sheets[0].range('A1').paste(paste='values') wb_new.sheets[0].range('A1').paste(paste='formats') # 若需要保留动态公式,将上方values参数改为formulas即可 # 重命名新工作表和原表一致 wb_new.sheets[0].name = sheet.name # 保存关闭 wb_new.save(f'{sheet.name}.xlsx') wb_new.close() print(f'{sheet.name} 导出成功') finally: # 恢复Excel默认配置再退出,避免影响后续本地Excel使用 excel_app.display_alerts = True excel_app.screen_updating = True excel_app.quit()
如果需要保留透视表的动态筛选能力,可以先把原工作簿的全量数据源工作表复制到每一个新工作簿中,再复制对应员工工作表,最后删除新工作簿内多余的其他工作表即可,不会触发引用丢失问题。
内容的提问来源于stack exchange,提问作者SchrodingersStat
相关产品推荐
相关产品推荐

