在Azure函数中运行openpyxl时出现defined_names.definedName属性错误
解决Azure函数中Openpyxl遍历Excel定义名称的错误
1. 修复DefinedNameDict无definedName属性的问题
你代码里直接用wb.defined_names.definedName是踩了Openpyxl内部属性的坑——这不是官方推荐的用法,本地能跑只是环境巧合,跨到Azure就暴露了兼容性问题。wb.defined_names本身是字典类对象,正确遍历方式有两种:
方式一:直接遍历所有定义名称对象
for dn in wb.defined_names.values(): if dn.name[:3] == 'FD_': # 你的业务逻辑代码
方式二:遍历名称与对象的键值对
for name, dn in wb.defined_names.items(): if name[:3] == 'FD_': # 你的业务逻辑代码
2. 解决3.1.1版本中ReadOnlyWorksheet的错误
升级到3.1.1时的报错,是因为你错从工作表对象(worksheet)调用defined_names,但这个属性只属于工作簿对象(wb)。无论是否用只读模式打开文件,都要从工作簿层级获取定义名称:
# 正确示例:从工作簿获取定义名称 wb = load_workbook('你的文件.xlsx', read_only=True) for dn in wb.defined_names.values(): # 处理逻辑
3. 环境一致性建议
- 用
requirements.txt锁定Azure函数的依赖版本,和本地保持完全一致:
openpyxl==3.1.0 # 若确认3.1.1适配你的场景,也可指定 # openpyxl==3.1.1
- 永远只使用Openpyxl官方文档里的公开API,别碰内部私有属性。
内容的提问来源于stack exchange,提问作者Gerrit Seigers
相关产品推荐
相关产品推荐

