openpyxl按行或列读取Excel应使用1-based索引,优先调用iter_rows()和iter_cols()配合values_only=True高效获取值,避免直接遍历sheet.rows/columns或手动cell(i,j)。
openpyxl 按行或按列读取 Excel,核心在于理解它用的是“1-based索引”(行号列号从1开始),不是 Python 常见的 0-based。操作前先加载工作簿、选中工作表,再用合适的方法遍历——不是硬套 for 循环加 cell(i,j),而是优先用内置迭代器更安全高效。
按行读取:推荐用iter_rows()比手动 range + cell(i,j) 更简洁、更健壮,自动跳过空单元格(除非指定),也支持限定范围:
读全部行:
for row in sheet.iter_rows():—— 默认从第1行第1列开始
读指定范围:
for row in sheet.iter_rows(min_row=2, max_row=5, min_col=1, max_col=3):每行返回的是 tuple of Cell 对象,取值要加 .value:[cell.value for cell in row]想直接转成列表嵌套(每行一个子列表):data = [list(row) for row in sheet.iter_rows(values_only=True)](values_only=True 是关键,省去反复写 .value)
按列读取:用iter_cols()逻辑和 iter_rows 类似,只是方向换成了列:Python 3.14.3微软官方的 Python 扩展,是 VS Code 安装量最高的扩展(209M+)。集成 IntelliSense(通过 Pylance)、调试(通过 Python Debugger)、代码检查、格式化、重构和单元测试等功能。支持 Jupyter Notebook、虚拟环境管理和多 Python 版本切换。
下载读第 A 列所有非空单元格:for col in sheet.iter_cols(min_col=1, max_col=1):读 B~D 列,第3到第10行:sheet.iter_cols(min_col=2, max_col=4, min_row=3, max_row=10)同样建议加values_only=True
直接得值:
[cell.value for cell in col]
或整列打包:
list(sheet.iter_cols(min_col=1, values_only=True))[0](取第1列值列表)
其他实用读取方式不总需要循环,有些场景更简单:
读某一行(比如第3行):
row3 = list(sheet[3])→ 返回第3行所有 Cell 对象;加values_only=True就是值列表读某一列(比如 A 列):col_a = list(sheet['A']);
sheet['A:C']可读多列读指定区域(如 A1:C5):cells = sheet['A1:C5']→ 返回二维 tuple,cells[0][0].value是 A1 值注意几个易错点不要用 sheet.rows / sheet.columns 直接遍历:它们是生成器,遍历一次就空了,且行为不稳定;坚持用iter_rows()和iter_cols()空单元格默认返回 None,不是空字符串,做 str 操作前建议判空如果文件很大,考虑启用只读模式:load_workbook(filename, read_only=True),内存占用低,但只能读不能改读取前确认工作表存在,避免KeyError:if 'Sheet1' in wb.sheetnames:基本上就这些。用对 iter_rows 和 iter_cols,再配上 values_only=True,读取就又快又干净。
