pin_drop当前位置:知识文库 ❯ 图文

Python openpyxl单元格读取详解:多种读取方式与实战教程

openpyxl是Python中处理Excel文件的强大库,单元格读取是从Excel文件中获取数据的核心操作。openpyxl支持通过单元格坐标(如A1)、行列索引、行迭代、列迭代等多种方式读取数据。理解不同读取方式的适用场景和性能差异,可以高效地从Excel中提取所需信息。


一、概述

在数据处理工作中,我们经常需要从Excel文件中读取数据。openpyxl提供了多种灵活的读取方式,适用于不同的业务场景。无论是读取单个单元格、遍历整行整列,还是按条件筛选数据,都能找到合适的读取方法。掌握这些读取技巧,可以大大提升Python处理Excel数据的效率。

二、语法总览

openpyxl提供了四种主要的单元格读取语法,下面逐一介绍:

代码示例

# 按坐标读取
ws['A1'].value

# 按行列索引读取
ws.cell(row=1, column=1).value

# 行迭代
for row in ws.iter_rows():
    for cell in row:
        cell.value

# 列迭代
for col in ws.iter_cols():
    for cell in col:
        cell.value

三、参数说明

cell()方法参数

参数 类型 默认值 说明
row int 必填 行号(从1开始)
column int 必填 列号(从1开始)
value any None 设置单元格值

iter_rows()方法参数

参数 类型 默认值 说明
min_row int 1 最小行号
max_row int None 最大行号
min_col int 1 最小列号
max_col int None 最大列号
values_only bool False True只返回值,不返回Cell对象

iter_cols()方法参数

参数 类型 默认值 说明
min_col int 1 最小列号
max_col int None 最大列号
min_row int 1 最小行号
max_row int None 最大行号
values_only bool False True只返回值

四、返回值说明

  • ws['A1']:返回Cell对象,通过.value属性获取单元格值

  • ws.cell():返回Cell对象,可进一步获取coordinate、row、column等属性

  • iter_rows/iter_cols:返回生成器对象,可通过for循环遍历,配合values_only=True直接返回值

五、代码示例

示例1:基本单元格读取

本示例演示如何使用坐标读取和cell()方法读取单个单元格的值,并获取单元格的各种属性。

代码示例

from openpyxl import Workbook

wb = Workbook()
ws = wb.active

# 写入测试数据
data = [
    ['姓名', '年龄', '城市'],
    ['张三', 25, '北京'],
    ['李四', 30, '上海'],
    ['王五', 28, '广州']
]
for row in data:
    ws.append(row)

# 方式1:坐标读取
print(f"ws['A1'] = {ws['A1'].value}")
print(f"ws['B2'] = {ws['B2'].value}")

# 方式2:cell()方法读取
print(f"cell(1,1) = {ws.cell(row=1, column=1).value}")
print(f"cell(2,2) = {ws.cell(row=2, column=2).value}")

# 读取单元格属性
cell = ws['A1']
print(f"\n单元格坐标: {cell.coordinate}")
print(f"行号: {cell.row}, 列号: {cell.column}")
print(f"数据类型: {type(cell.value)}")

输出结果:

代码示例

ws['A1'] = 姓名
ws['B2'] = 25
cell(1,1) = 姓名
cell(2,2) = 25

单元格坐标: A1
行号: 1, 列号: 1
数据类型: <class 'str'>

示例2:行迭代读取

使用iter_rows()方法遍历Excel中的所有行数据,演示了values_only参数的差异和范围读取的技巧。

代码示例

from openpyxl import Workbook

wb = Workbook()
ws = wb.active

data = [['编号', '名称', '价格'],
        [1, '苹果', 5.5],
        [2, '香蕉', 3.2],
        [3, '橙子', 4.8]]
for row in data:
    ws.append(row)

# 遍历所有行(返回Cell对象)
print("iter_rows():")
for row in ws.iter_rows(min_row=1, max_row=4):
    values = [cell.value for cell in row]
    print(f"  {values}")

# values_only=True只返回值
print("\niter_rows(values_only=True):")
for row in ws.iter_rows(values_only=True):
    print(f"  {row}")

# 读取指定范围
print("\n只读取数据区域(跳过表头):")
for row in ws.iter_rows(min_row=2, values_only=True):
    print(f"  {row}")

输出结果:

代码示例

iter_rows():
  ['编号', '名称', '价格']
  [1, '苹果', 5.5]
  [2, '香蕉', 3.2]
  [3, '橙子', 4.8]

iter_rows(values_only=True):
  ('编号', '名称', '价格')
  (1, '苹果', 5.5)
  (2, '香蕉', 3.2)
  (3, '橙子', 4.8)

只读取数据区域(跳过表头):
  (1, '苹果', 5.5)
  (2, '香蕉', 3.2)
  (3, '橙子', 4.8)

示例3:列迭代与条件读取

演示列迭代读取方法,以及如何结合条件判断筛选特定数据。

代码示例

from openpyxl import Workbook

wb = Workbook()
ws = wb.active

data = [['姓名', '部门', '工资'],
        ['张三', '技术部', 15000],
        ['李四', '市场部', 12000],
        ['王五', '技术部', 18000],
        ['赵六', '财务部', 13000]]
for row in data:
    ws.append(row)

# 列迭代
print("iter_cols():")
for col in ws.iter_cols(min_col=1, max_col=3, values_only=True):
    print(f"  {col}")

# 条件读取:工资大于13000的员工
print("\n工资>13000的员工:")
for row in ws.iter_rows(min_row=2, values_only=True):
    if row[2] > 13000:
        print(f"  {row[0]}: {row[2]}")

# 读取特定列
print("\n只读取姓名和工资:")
for row in ws.iter_rows(min_row=2, min_col=1, max_col=3, values_only=True):
    print(f"  {row[0]}: {row[2]}")

输出结果:

代码示例

iter_cols():
  ('姓名', '张三', '李四', '王五', '赵六')
  ('部门', '技术部', '市场部', '技术部', '财务部')
  ('工资', 15000, 12000, 18000, 13000)

工资>13000的员工:
  张三: 15000
  王五: 18000

只读取姓名和工资:
  张三: 15000
  李四: 12000
  王五: 18000
  赵六: 13000

六、实际应用场景

  • 数据导入:读取Excel文件的数据到数据库或pandas DataFrame,常用于ETL数据处理流程

  • 数据筛选:按条件读取特定行或列的数据,例如筛选出成绩优秀的学生或销售额达标的产品

  • 报表汇总:从多个工作表读取数据合并计算,生成综合统计报表

七、注意事项

注意:行列索引从1开始,不是0,这与Python列表不同,初学者容易犯此错误。

注意:values_only=True时返回元组而非列表,性能更好,适合只读取数据的场景。

注意:读取空单元格时返回None,在数据处理时需要注意判断,避免引发TypeError。

八、读取方式对比

方式 语法 返回类型 适用场景
坐标读取 ws['A1'] Cell对象 读取单个单元格
cell()方法 ws.cell(row, col) Cell对象 按索引读取
行迭代 iter_rows() 生成器 按行遍历数据
列迭代 iter_cols() 生成器 按列遍历数据
ws.values ws.values 生成器 快速读取所有值

九、小结

  • ws['A1']和ws.cell(row, column)是两种基本的单元格读取方式,适用于精确位置读取

  • iter_rows()按行遍历,iter_cols()按列遍历,values_only=True只返回值而不返回Cell对象,性能更好

  • 行列索引从1开始,空单元格返回None,处理数据时需要注意判断

  • 条件读取通过遍历+判断实现,可以灵活筛选所需数据

十、练习题

练习1

创建一个3x4的数据表,分别使用坐标和cell()方法读取所有单元格的值。

练习2

使用iter_rows()遍历一个5行3列的数据表,分别测试values_only=True和False的差异。

练习3

创建一个学生成绩表,读取所有成绩大于80分的学生信息。


常见问题

为什么行列索引从1开始而不是0?

因为Excel的行号列标本身就是从1开始的(A列是第1列,第1行是行号1),openpyxl遵循Excel的索引规则,与Excel界面保持一致。这与Python列表从0开始不同,使用时需要注意。

iter_rows()和ws.values有什么区别?

iter_rows()返回的是Cell对象(values_only=False时)或值元组(values_only=True时),可以指定行列范围。ws.values等价于iter_rows(values_only=True),但更简洁,返回整个工作表的值。

读取空单元格为什么会返回None?

在Excel中,空单元格没有值,openpyxl用None表示空值。在数据处理时,需要对None进行判断,例如使用if cell.value is not None或if row[2]跳过空值。

读取大文件时如何提高性能?

对于大型Excel文件,建议使用load_workbook(data_only=False, read_only=True)以只读模式打开,配合iter_rows(values_only=True)读取,可以显著减少内存占用并提高读取速度。


标签: openpyxl 单元格读取 iter_rows Excel处理 Python教程

本文涉及AI创作

内容由AI创作,请仔细甄别

list快速访问

上一篇: Python openpyxl工作表操作教程 - 创建删除复制冻结 下一篇: Python openpyxl单元格写入详解:多种写入方式与数据类型教程

poll相关推荐