使用Python openpyxl给Excel列批量写入带递增引用的VLOOKUP公式
openpyxl写入VLOOKUP公式行号不递增的解决方法
你的代码核心问题是公式字符串的拼接逻辑放在了循环外,仅在初始化时生成了一次引用N2的固定公式,后续循环中仅更新了part2变量,没有重新生成新的公式字符串,所以所有单元格写入的都是同一个固定公式。
修正方案1:调整公式拼接位置
仅需要把公式拼接逻辑移入循环内即可,适配你原本的写法:
"""Add formula columns""" from openpyxl import load_workbook # 加载工作簿 book = load_workbook('export1.xlsx') # 指定工作表 sheet = book['RAW DATA'] part1 = "=VLOOKUP(N" part2 = 2 part3 = ",Matrix!L:M,2,FALSE)" for cell in sheet['V']: # 每次循环重新拼接当前行的公式 cell.value = part1 + str(part2) + part3 part2 += 1 # 设置列名,会覆盖V1单元格之前写入的公式 sheet['V1'] = 'New Column' # 保存关闭 book.save('testing.xlsx') book.close()
修正方案2:直接使用单元格行号属性(更简洁)
openpyxl的单元格对象自带row属性,可以直接获取当前单元格的行号,不需要额外维护计数变量,代码更简洁不易出错:
"""Add formula columns""" from openpyxl import load_workbook book = load_workbook('export1.xlsx') sheet = book['RAW DATA'] for cell in sheet['V']: # 直接取当前单元格行号拼接公式 cell.value = f'=VLOOKUP(N{cell.row},Matrix!L:M,2,FALSE)' sheet['V1'] = 'New Column' book.save('testing.xlsx') book.close()
优化建议(可选)
如果你的表格只有部分行有数据,不想给整列空单元格都写入公式,可以只遍历有效数据行,减少无效操作:
# 仅从第2行到最后一行有数据的行写入公式 for row in range(2, sheet.max_row + 1): sheet[f'V{row}'].value = f'=VLOOKUP(N{row},Matrix!L:M,2,FALSE)'
内容的提问来源于stack exchange,提问作者frito
相关产品推荐
相关产品推荐

