遍历Excel命名范围时触发KeyError的问题求助
遍历Excel命名范围时触发KeyError的问题求助
我最近写了一段Python脚本,用来批量处理Excel里的命名区域:这些区域从DT_1到DT_30,全部在同一个工作簿的同一张工作表里,命名规则完全统一。脚本的目标是把每个区域转成同名的JPEG图片,保存到指定文件夹里。
但运行的时候出问题了:当脚本处理到DT_25时,直接抛出了KeyError: DT_25。之前我用24个命名区域的版本测试时,也遇到过同样的问题——当时是到DT_24就报错。
我的Python代码:
import matplotlib.pyplot as plt import openpyxl wb = openpyxl.load_workbook('C:\\Users\\barry\\Desktop\\WS_Generators\\Stats_WS_Generator_2024 TEST.xlsm', data_only=True) for i in range(30): named_range = wb.defined_names['DT_' + str(i+1)] cells = named_range.destinations # 获取第一个(也是唯一一个)单元格区域 sheet_name, cell_range = next(cells) sheet = wb[sheet_name] data = [[cell.value for cell in row] for row in sheet[cell_range]] # 创建图表和坐标轴 fig, ax = plt.subplots(figsize = (3,3), dpi = 400) fig.canvas.draw() # 隐藏坐标轴 ax.axis('off') # 创建表格 table = ax.table(cellText=data, loc='center', cellLoc='center') # 设置表格属性 table.auto_set_font_size(False) table.set_fontsize(11) table.scale(1, 1.5) # 添加边框并通过bbox减少空白 for cell in table._cells: table._cells[cell].set_edgecolor('black') table._cells[cell].set_linewidth(0.5) bbox = table.get_window_extent(fig.canvas.get_renderer()) bbox = bbox.from_extents(bbox.xmin-25, bbox.ymin-25, bbox.xmax+25, bbox.ymax+25) bbox_inches = bbox.transformed(fig.dpi_scale_trans.inverted()) # 显示表格(注释状态) #plt.show() plt.savefig("C:\\Users\\barry\\Desktop\\WS_Generators\\TempImage\\DT_" + str(i+1) + ".jpg", bbox_inches=bbox_inches, pad_inches = 0.1) plt.close()
报错回溯信息:
Traceback (most recent call last): File ~\anaconda3\Lib\site-packages\spyder_kernels\py3compat.py:356 in compat_exec exec(code, globals, locals) File c:\users\barry\.spyder-py3\python code useful for worksheet generators\table - create table image from excel named range and save several images test01.py:19 named_range = wb.defined_names['DT_' + str(i+1)] KeyError: 'DT_25'
我已经做了这些排查:
- 临时文件夹里已经成功生成了前24张JPEG,每张大小约50KB,格式完全正确;
- 手动检查了Excel工作簿,DT_25确实存在,命名格式和其他区域完全一致,是一个2×5的数字矩阵,和其他区域没有区别;
- 用Python打印
len(wb.defined_names),结果显示有25个条目; - 附上工作簿里所有命名区域的截图:

我已经在相关技术社区搜过问题,但没找到解决办法,希望有人能帮我看看问题出在哪?
备注:内容来源于stack exchange,提问作者Mark Barry
相关产品推荐
相关产品推荐

