使用openpyxl写入嵌套IF公式报索引越界错误如何解决
错误原因
这个报错是Python字符串格式化参数不匹配导致的:你写入公式的字符串里一共包含5个{}占位符(对应公式里5处O{}的行号替换位),但调用.format()方法时仅传入了1个row_num参数,解释器替换完第一个占位符后,找不到对应第二个及后续占位符的传入值,就会抛出索引超出范围的错误。
修正方案
你可以任选以下一种方式修改代码:
- 方案1:补全format传入的参数,因为同一行公式里所有O列引用的行号都是同一个
row_num,传入5个重复的行号参数即可:
for row_num in range(2, maxRow): ws['P{}'.format(row_num)] = '=IF(O{}<=30,"0-30",IF(O{}<=60,"31-60",IF(O{}<=90,"61-90",IF(O{}<=120,"91-120",IF(O{}>120,"120+")))))'.format(row_num, row_num, row_num, row_num, row_num)
- 方案2(更推荐,不容易写错占位符数量):直接使用f-string语法在字符串内嵌入变量,不需要手动统计占位符个数:
for row_num in range(2, maxRow): ws[f'P{row_num}'] = f'=IF(O{row_num}<=30,"0-30",IF(O{row_num}<=60,"31-60",IF(O{row_num}<=90,"61-90",IF(O{row_num}<=120,"91-120",IF(O{row_num}>120,"120+")))))'
额外优化提示:原公式最后一层
IF(O{}>120,"120+")属于冗余判断,前面4个区间判断已经覆盖了≤120的所有情况,剩下的结果必然是大于120的值,可以直接把最后一层IF去掉,简化为"120+"作为最外层IF的false返回值,公式运行效率更高,也不会出现逻辑问题。
内容的提问来源于stack exchange,提问作者Anil M
相关产品推荐
相关产品推荐

