openpyxl中DefinedName传value参数报错,按文档操作仍失败求助
解决openpyxl中DefinedName TypeError与联动下拉框实现问题
错误原因
你碰到的TypeError: DefinedName.__init__() got an unexpected keyword argument 'value'是因为openpyxl的DefinedName构造函数并不存在value参数,官方文档的表述可能存在误导或你混淆了参数名。正确指定名称引用的参数是attr_text,也可在实例化后设置text属性。
修正后完整代码
以下是修复错误并实现正确联动下拉框的代码:
from openpyxl import Workbook from openpyxl.worksheet.datavalidation import DataValidation from openpyxl.workbook.defined_name import DefinedName wb = Workbook() ws = wb.active ws.title = "DropdownSheet" # 一级下拉选项 dropdown1_values = ['Fruit', 'Vegetable', 'Meat'] # 二级下拉选项映射 dropdown2_values = { 'Fruit': ['Apple', 'Banana', 'Orange'], 'Vegetable': ['Carrot', 'Broccoli', 'Tomato'], 'Meat': ['Chicken', 'Beef', 'Pork'] } # 写入一级选项到A列 for idx, val in enumerate(dropdown1_values, 1): ws[f'A{idx}'] = val # 写入二级选项到隐藏列并定义对应名称范围 col_offset = 3 # 从D列开始 for category, items in dropdown2_values.items(): col = chr(ord('A') + col_offset) # 写入二级选项 for idx, item in enumerate(items, 1): ws[f'{col}{idx}'] = item # 定义命名范围 range_ref = f'{ws.title}!${col}$1:${col}${len(items)}' defined_name = DefinedName( name=category, localSheetId=0, attr_text=range_ref ) wb.defined_names.append(defined_name) col_offset += 1 # 一级下拉框(B1:B10) dv1 = DataValidation(type="list", formula1=f'={ws.title}!$A$1:$A${len(dropdown1_values)}') dv1.ranges = ['B1:B10'] ws.add_data_validation(dv1) # 二级联动下拉框(C1:C10),依赖B列选择 dv2 = DataValidation(type="list", formula1='=INDIRECT(B1)') dv2.ranges = ['C1:C10'] ws.add_data_validation(dv2) # 隐藏二级选项所在列 for col in ['D', 'E', 'F']: ws.column_dimensions[col].hidden = True wb.save('linked_dropdowns.xlsx')
关键修正说明
- DefinedName参数修正:替换错误的
value参数为attr_text,用于指定命名范围对应的单元格引用; - 联动逻辑优化:二级下拉框通过
INDIRECT(B1)动态匹配一级选择对应的命名范围,实现联动效果; - 数据验证拆分:分别创建两个数据验证对象,对应一级和二级下拉区域,修正原代码中错误的公式绑定;
- 隐藏辅助区域:将存放二级选项的列隐藏,避免用户误修改。
内容的提问来源于stack exchange,提问作者Jonathan Sandler
相关产品推荐
相关产品推荐

