使用openpyxl报错AttributeError: 'str'对象无'row'属性,求排查
错误原因与修复方案
问题根源
你调用worksheet.iter_rows()时传入了values_only=True参数,这个参数会让迭代返回的每一行是单元格值组成的元组(比如字符串、数字),而非单元格对象。所以object_row[0]是单元格里的字符串内容,自然没有.row属性,这就是AttributeError的原因。
修复方法(两种可选)
方法一:移除values_only=True,直接操作单元格对象
这种方式保留原逻辑结构,仅调整迭代返回的对象类型:
def add_to_database(object_name, value): workbook = openpyxl.load_workbook(DATABASE_FILE) worksheet = workbook[DATABASE_SHEET] object_row = None # 移除values_only=True,迭代返回单元格对象 for row in worksheet.iter_rows(min_row=1, max_row=worksheet.max_row + 1): # 判断单元格的value属性是否匹配 if row[0].value == object_name: object_row = row break if object_row: # 直接通过单元格对象获取行号 worksheet.cell(row=object_row[0].row, column=2).value += value else: # 注意:原代码此处会覆盖最后一行,需改为max_row+1新增行 last_row = worksheet.max_row + 1 worksheet.cell(row=last_row, column=1).value = object_name worksheet.cell(row=last_row, column=2).value = value workbook.save(DATABASE_FILE) workbook.close()
方法二:保留values_only=True,记录行号
如果想继续使用值迭代,可以用enumerate同步记录行号:
def add_to_database(object_name, value): workbook = openpyxl.load_workbook(DATABASE_FILE) worksheet = workbook[DATABASE_SHEET] target_row_num = None # 用enumerate获取行号,start=1对应Excel的行号 for row_num, row in enumerate(worksheet.iter_rows(min_row=1, max_row=worksheet.max_row + 1, values_only=True), start=1): if row[0] == object_name: target_row_num = row_num break if target_row_num: worksheet.cell(row=target_row_num, column=2).value += value else: last_row = worksheet.max_row + 1 worksheet.cell(row=last_row, column=1).value = object_name worksheet.cell(row=last_row, column=2).value = value workbook.save(DATABASE_FILE) workbook.close()
额外注意
原代码中新增数据的逻辑存在bug:last_row = worksheet.max_row会覆盖当前工作表最后一行的内容,必须改为last_row = worksheet.max_row + 1才能在新行添加数据。
内容的提问来源于stack exchange,提问作者Nikolay
相关产品推荐
相关产品推荐

