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

使用openpyxl处理Excel时代码总是跳过最后一行,是什么原因?

问题排查与修复

核心问题:行号范围定义错误

Python 中range(start, end)生成的是左闭右开的整数序列,你写的range(1, len(data))最大只会生成到len(data) - 1的行号,自然会跳过对应行号为len(data)的最后一行。
如果data的长度和Excel工作表的总行数完全对应,修改行号生成逻辑即可:

# 原错误写法
# sample_rows = [i for i in range(1, len(data))]
# 修正后写法,end参数加1
sample_rows = [i for i in range(1, len(data) + 1)]

其他可优化的代码问题

  • 逻辑判断冗余:前两个if判断存在包含关系,只要满足cell.font.b == True就会把单元格值设为None,第二个同时判断粗体+斜体的条件完全没有执行机会,可以直接删除。
  • pandas索引错位风险:你代码里用data.iloc[r][col_number]赋值,pandas的iloc是从0开始计数的,而你的循环变量r是从1开始的Excel行号,这里会导致pandas数据和Excel行错位,建议改为data.iloc[r-1][col_number]。
  • 没必要额外生成列表:可以直接遍历range对象,不需要先转成列表占用额外内存。

修正后完整参考代码

import openpyxl
import re
wb_obj = openpyxl.load_workbook(path)
sheet_obj = wb_obj.active
# 行号范围修正为左闭右开,覆盖到最后一行
for r in range(1, len(data) + 1):
    cell = sheet_obj.cell(row=r, column=1)
    # 合并重复判断逻辑
    if cell.font.b or re.search('bold', cell.font.name.lower()):
        cell.value = None
    # 修正pandas iloc的索引偏移
    data.iloc[r-1][col_number] = cell.value

内容的提问来源于stack exchange,提问作者ashok

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 13:57:03