使用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
相关产品推荐
相关产品推荐

