使用openpyxl打开.xlsm文件遇IndexError,隐藏工作表致异常求助
解决openpyxl打开含隐藏工作表的.xlsm文件时的IndexError问题
方案1:升级openpyxl到最新版本
部分旧版本的openpyxl在解析带隐藏工作表的xlsm文件时存在兼容性bug,升级到最新版大概率能解决问题:
pip install --upgrade openpyxl
方案2:通过win32com预处理文件(无需手动修改原文件)
如果升级后仍报错,可借助pywin32库先将隐藏工作表临时设为可见,再用openpyxl加载:
import win32com.client as win32 from openpyxl import load_workbook # 后台启动Excel,处理文件 excel = win32.gencache.EnsureDispatch('Excel.Application') excel.Visible = False # 不弹出Excel窗口,后台运行 wb = excel.Workbooks.Open(r'你的文件路径.xlsm') # 遍历所有工作表,显示隐藏表 for sheet in wb.Sheets: if sheet.Visible == 0: # 0代表工作表处于隐藏状态 sheet.Visible = 1 # 设置为可见 wb.Save() wb.Close() excel.Quit() # 现在用openpyxl正常加载文件 wb = load_workbook(r'你的文件路径.xlsm', keep_vba=True)
方案3:只读模式下仅加载可见工作表
若不想修改原文件,可先通过win32com获取所有可见工作表名称,再让openpyxl只加载这些表:
import win32com.client as win32 from openpyxl import load_workbook # 获取所有可见工作表的名称 excel = win32.gencache.EnsureDispatch('Excel.Application') excel.Visible = False wb = excel.Workbooks.Open(r'你的文件路径.xlsm') visible_sheet_names = [sheet.Name for sheet in wb.Sheets if sheet.Visible != 0] wb.Close() excel.Quit() # 只读模式下仅加载指定的可见工作表 wb = load_workbook( r'你的文件路径.xlsm', read_only=True, keep_vba=True, sheet_names=visible_sheet_names )
方案4:修复损坏的工作表结构
如果隐藏工作表本身存在损坏(比如空表、无效单元格格式),可尝试用Excel的修复模式处理:
import win32com.client as win32 excel = win32.gencache.EnsureDispatch('Excel.Application') # 以修复模式打开文件 wb = excel.Workbooks.Open(r'你的文件路径.xlsm', CorruptLoad=1) wb.Save() wb.Close() excel.Quit() # 再用openpyxl加载修复后的文件 from openpyxl import load_workbook wb = load_workbook(r'你的文件路径.xlsm', keep_vba=True)
内容的提问来源于stack exchange,提问作者Iulian Manolache
相关产品推荐
相关产品推荐

