You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

遍历Excel工作表触发IndexError:数组索引越界问题排查

分析与解决方案

首先,这个IndexError的核心原因很明确:当你尝试用worksheet_1.cell(5,4).value访问第6个工作表(i=6)的单元格时,这个位置超出了该工作表实际的行列范围——换句话说,这个工作表的总行数不足6行(xlrd的行索引从0开始,rowx=5对应第6行),或者总列数不足5列(colx=4对应第5列)。

你提到已经检查过对应单元格非空,但这里很可能是Excel界面的行列号和xlrd的索引规则混淆,或者这个工作表存在隐藏的结构差异:

可能的原因

  • 索引计数规则混淆:Excel界面的行/列号是从1开始的,但xlrd的cell(rowx, colx)是从0开始计数的。你在Excel里看到的"第6行第5列",对应xlrd的cell(5,4),但如果这个工作表的实际总行数小于6,或者总列数小于5,就会触发索引越界。
  • 工作表结构隐性差异:即使视觉上看起来结构一致,这个工作表可能存在隐藏行/列,或者保存时自动删除了末尾的空行/空列,导致xlrd读取到的有效行列数比其他工作表少。
  • Excel文件的格式异常:个别工作表可能存在轻微的格式损坏,导致xlrd读取的行列数和实际界面显示不一致。

解决步骤

1. 先确认该工作表的实际行列数

在循环里加入打印语句,输出第6个工作表的总行数和总列数,快速定位问题:

for i in range(1,17):
    df_1 = pd.read_excel(r'C:\Users\filippo.sebastio\OneDrive - ELEVATE\Target\Target Download 28 Feb\Quantitative data\SCHAEFER_Putian ZhangSheng\zhangsheng -- RSAP Factory Metrics Tool- Hardcopy Form draft to publish 2018 12.xlsx', i , header = 4, index_col=1)
    worksheet_1 = workbook.sheet_by_index(i)
    # 添加这行打印
    print(f"工作表{i}:总行数={worksheet_1.nrows},总列数={worksheet_1.ncols}")
    # 后续代码...

运行后看第6个工作表的输出,如果nrows < 6或者ncols <5,就直接验证了问题所在。

2. 修正索引或检查工作表结构

  • 如果是索引计数错了:比如你实际要访问的是Excel里的第5行第4列,那对应的xlrd索引应该是cell(4,3),调整代码即可。
  • 如果是工作表行列数不足:打开这个工作表,取消所有隐藏的行和列(Excel菜单:开始→格式→隐藏和取消隐藏),确认是否存在缺失的行/列,或者是否有被误删的内容。

3. 添加异常处理避免循环中断

为了不让单个工作表的问题导致整个循环崩溃,可以给单元格访问部分加上异常捕获:

worksheet_1 = workbook.sheet_by_index(i)
try:
    month = worksheet_1.cell(5,4).value
except IndexError:
    print(f"警告:工作表{i}无法访问(5,4)位置的单元格")
    month = None  # 或者设置一个默认值,比如"未知"
    # 如果这个工作表数据无效,也可以直接跳过
    # continue
# 后续代码...

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

火山引擎 最新活动