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 类似,只是方向换成了列:
- 读第 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,读取就又快又干净。
以上就是openpyxl怎样按行和按列读取excel的详细内容,更多请关注php中文网其它相关文章!