openpyxl delete_rows方法无法删除最后一行问题求助
解决Excel最后一行无法删除的问题
我来帮你搞定这个小bug!你遇到的问题是当目标序列号在最后一行时,代码执行后该行依然存在,这大概率是因为循环范围的初始化方式和openpyxl对行的处理逻辑有细微冲突。我们来一步步修正:
问题分析
你的代码逻辑本身没问题,但当目标行是工作表最后一行时,ws.max_row在循环开始时就被固定,虽然理论上能遍历到最后一行,但openpyxl对最后一行的删除操作可能因为行计数的边界情况没有被正确触发。另外,初始的r=0存在潜在风险——如果没找到匹配项,会尝试删除行0(这会报错,但你说代码运行正常,说明你总能找到目标行)。
修正后的代码方案
方案1:反向遍历行(推荐)
从最后一行往上找,这样能直接定位到目标行,避免边界问题:
import openpyxl wb = openpyxl.load_workbook(filename) ws = wb[sheet] target_row = None # 从最后一行开始向上遍历,跳过表头行(行1) for i in range(ws.max_row, 1, -1): # 处理单元格值为None的情况,避免str()报错 cell_value = ws[f'C{i}'].value if cell_value is not None and str(cell_value) == SN: target_row = i break # 确认找到目标行后再删除 if target_row is not None: ws.delete_rows(target_row) wb.save(filename)
方案2:使用iter_rows获取行号
通过iter_rows直接遍历行对象,能更准确获取行号,避免手动拼接单元格地址的误差:
import openpyxl wb = openpyxl.load_workbook(filename) ws = wb[sheet] target_row = None # 从第2行开始遍历所有行 for row in ws.iter_rows(min_row=2): cell_c = row[2] # C列是第3个单元格(索引从0开始) cell_value = cell_c.value if cell_value is not None and str(cell_value) == SN: target_row = cell_c.row break if target_row is not None: ws.delete_rows(target_row) wb.save(filename)
关键优化点
- 增加了对
cell_value为None的判断,避免str(None)导致的字符串匹配错误 - 用
target_row = None替代初始的r=0,确保只有找到目标行时才执行删除操作 - 反向遍历或直接获取行对象的方式,能更可靠地处理最后一行的边界情况
这样修改后,不管目标序列号在第几行(包括最后一行),都能被正确定位并删除啦!
内容的提问来源于stack exchange,提问作者ahendawy
相关产品推荐
相关产品推荐

