You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 03:51:38