使用openpyxl获取Excel单个单元格值报TypeError问题求助
问题解答
库选择建议
- 如果你的需求仅涉及简单的单元格读写、需要保留原Excel的格式(比如公式、单元格样式),选择Openpyxl即可
- 如果核心需求是做数值计算、表格批量处理,优先选择Pandas,它底层可以对接Openpyxl完成Excel读写,处理表格数据的代码量会少很多,不需要自行遍历行处理单元格
代码出错的原因
报错'<' not supported between instances of 'tuple' and 'int'的核心问题出在for i in burndownData.iter_rows():这行:
iter_rows()遍历返回的每一项i是当前行所有单元格组成的元组,不是行号整数,你直接把元组传给cell()方法的row参数,自然会触发类型不匹配的报错。
Openpyxl写法修正
你可以直接遍历iter_rows()返回的单元格元组拿值,不需要额外调用cell()方法,修正代码示例:
import numpy as np collectionOrder = np.empty([numRows,2], dtype='object') numCountries = 0 # min_row参数可以跳过表头,values_only=True直接返回单元格值,不用再取.value for row_idx, row_val in enumerate(burndownData.iter_rows(min_row=1, values_only=True), start=1): first_col_val = row_val[0] # 取第一列的值,对应你之前的column=1 print("elemnt=", first_col_val) # 先判断是数值类型再调用np.isnan,避免非数值类型报错 if first_col_val is not None and isinstance(first_col_val, (int, float)) and not np.isnan(first_col_val): idx = int(first_col_val) collectionOrder[idx][0] = first_col_val collectionOrder[idx][1] = row_idx # 这里存储的是Excel对应的实际行号 numCountries += 1
更简便的Pandas实现方式
如果用Pandas完成这个需求,代码会更简洁,示例如下:
import pandas as pd import numpy as np # 读取Excel表,sheet_name替换成你要读取的工作表名 df = pd.read_excel("你的Excel文件路径.xlsx", sheet_name="burndownData对应的工作表名") # 筛选第一列非空的数值行 valid_mask = df.iloc[:,0].notna() & df.iloc[:,0].apply(lambda x: isinstance(x, (int, float))) valid_df = df[valid_mask] # 直接生成你需要的collectionOrder结构 collectionOrder = np.empty([len(df),2], dtype='object') collectionOrder[valid_df.iloc[:,0].astype(int).values, 0] = valid_df.iloc[:,0].values collectionOrder[valid_df.iloc[:,0].astype(int).values, 1] = valid_df.index + 1 # 行号默认从1开始和Excel对应 numCountries = len(valid_df) # 计算完成后输出新工作表 with pd.ExcelWriter("输出文件路径.xlsx", engine="openpyxl") as writer: # 你可以把计算后的结果转成DataFrame写入 pd.DataFrame(collectionOrder, columns=["数值列", "行号列"]).to_excel(writer, sheet_name="新工作表名", index=False)
内容的提问来源于stack exchange,提问作者cpeddie
相关产品推荐
相关产品推荐

