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

Python openpyxl批量操作详解:高效处理大量Excel数据教程

批量操作是高效处理大量Excel数据的关键。openpyxl提供了append()逐行追加、iter_rows()批量读取、列表推导式批量写入等方式。对于大规模数据操作,合理使用批量方法可以显著提升性能,避免逐单元格操作的低效问题。


一、概述

在实际工作中,我们常常需要处理成百上千行的Excel数据。如果逐单元格操作,不仅代码冗长,而且执行效率极低。openpyxl提供了多种批量操作方法,包括批量追加、批量读取、批量修改以及行列的插入和删除。掌握这些批量操作技巧,可以让你的数据处理效率成倍提升。

二、语法总览

openpyxl提供了多种批量操作语法,涵盖数据追加、读取、写入和结构修改:

代码示例

# 批量追加行
for row_data in data_list:
    ws.append(row_data)

# 批量读取
rows = list(ws.iter_rows(values_only=True))

# 批量写入(循环+cell)
for r, row_data in enumerate(data, 1):
    for c, value in enumerate(row_data, 1):
        ws.cell(row=r, column=c, value=value)

# 整行/整列操作
ws.insert_rows(idx, amount)
ws.insert_cols(idx, amount)
ws.delete_rows(idx, amount)
ws.delete_cols(idx, amount)

三、参数说明

insert_rows / delete_rows 参数

参数 类型 默认值 说明
idx int 必填 插入/删除的起始行号
amount int 1 插入/删除的行数

insert_cols / delete_cols 参数

参数 类型 默认值 说明
idx int 必填 插入/删除的起始列号
amount int 1 插入/删除的列数

四、返回值说明

insert/delete操作无返回值,直接修改工作表。append()无返回值。iter_rows()返回生成器对象,可以转换为列表。

五、代码示例

示例1:批量追加数据

演示如何使用append()方法批量追加多行数据到Excel工作表中。

代码示例

from openpyxl import Workbook

wb = Workbook()
ws = wb.active

# 表头
ws.append(['编号', '姓名', '部门', '工资'])

# 批量追加数据
employees = [
    [1, '张三', '技术部', 15000],
    [2, '李四', '市场部', 12000],
    [3, '王五', '技术部', 18000],
    [4, '赵六', '财务部', 13000],
    [5, '钱七', '技术部', 16000],
]
for emp in employees:
    ws.append(emp)

print(f"总行数: {ws.max_row}")
print(f"总列数: {ws.max_column}")

# 读取所有数据
for row in ws.iter_rows(values_only=True):
    print(f"  {row}")

wb.save('batch_append.xlsx')
print("批量追加文件已保存")

输出结果:

代码示例

总行数: 6
总列数: 4
  (1, '张三', '技术部', 15000)
  (2, '李四', '市场部', 12000)
  (3, '王五', '技术部', 18000)
  (4, '赵六', '财务部', 13000)
  (5, '钱七', '技术部', 16000)
批量追加文件已保存

示例2:批量写入与行列操作

演示使用cell()批量写入数据,以及insert_rows、insert_cols、delete_rows等行列操作方法。

代码示例

from openpyxl import Workbook

wb = Workbook()
ws = wb.active

# 使用cell()批量写入
data = [
    ['A1', 'B1', 'C1'],
    ['A2', 'B2', 'C2'],
    ['A3', 'B3', 'C3'],
]
for r, row_data in enumerate(data, 1):
    for c, value in enumerate(row_data, 1):
        ws.cell(row=r, column=c, value=value)

print("原始数据:")
for row in ws.iter_rows(values_only=True):
    print(f"  {row}")

# 插入行
ws.insert_rows(2, 2)  # 在第2行插入2行
print(f"\n插入2行后(max_row={ws.max_row}):")
for row in ws.iter_rows(values_only=True):
    print(f"  {row}")

# 插入列
ws.insert_cols(2, 1)  # 在第2列插入1列
print(f"\n插入1列后(max_column={ws.max_column}):")
for row in ws.iter_rows(min_row=1, max_row=1, values_only=True):
    print(f"  {row}")

# 删除行
ws.delete_rows(2, 1)  # 删除第2行
print(f"\n删除1行后(max_row={ws.max_row}):")
for row in ws.iter_rows(values_only=True):
    print(f"  {row}")

wb.save('batch_insert_delete.xlsx')
print("行列操作文件已保存")

输出结果:

代码示例

原始数据:
  ('A1', 'B1', 'C1')
  ('A2', 'B2', 'C2')
  ('A3', 'B3', 'C3')

插入2行后(max_row=5):
  ('A1', 'B1', 'C1')
  (None, None, None)
  (None, None, None)
  ('A2', 'B2', 'C2')
  ('A3', 'B3', 'C3')

插入1列后(max_column=4):
  ('A1', None, 'B1', 'C1')

删除1行后(max_row=4):
  ('A1', None, 'B1', 'C1')
  (None, None, None, None)
  ('A2', None, 'B2', 'C2')
  ('A3', None, 'B3', 'C3')
行列操作文件已保存

示例3:批量修改与条件更新

演示如何遍历数据并根据条件批量修改单元格值,同时批量添加公式列和汇总行。

代码示例

from openpyxl import Workbook

wb = Workbook()
ws = wb.active

# 创建测试数据
ws.append(['姓名', '部门', '工资'])
employees = [
    ['张三', '技术部', 15000],
    ['李四', '市场部', 12000],
    ['王五', '技术部', 18000],
    ['赵六', '财务部', 13000],
    ['钱七', '技术部', 16000],
]
for emp in employees:
    ws.append(emp)

# 批量修改:技术部员工工资加2000
for row in ws.iter_rows(min_row=2):
    if row[1].value == '技术部':
        row[2].value += 2000
        print(f"  {row[0].value}: {row[2].value - 2000} -> {row[2].value}")

# 批量添加公式列
ws['D1'] = '年薪'
for row in range(2, ws.max_row + 1):
    ws.cell(row=row, column=4, value=f'=C{row}*12')

# 添加汇总行
ws.append(['合计', '', f'=SUM(C2:C{ws.max_row})', f'=SUM(D2:D{ws.max_row})'])

print("\n修改后数据:")
for row in ws.iter_rows(values_only=True):
    print(f"  {row}")

wb.save('batch_update.xlsx')
print("批量更新文件已保存")

输出结果:

代码示例

  张三: 15000 -> 17000
  王五: 18000 -> 20000
  钱七: 16000 -> 18000

修改后数据:
  ('姓名', '部门', '工资', '年薪')
  ('张三', '技术部', 17000, '=C2*12')
  ('李四', '市场部', 12000, '=C3*12')
  ('王五', '技术部', 20000, '=C4*12')
  ('赵六', '财务部', 13000, '=C5*12')
  ('钱七', '技术部', 18000, '=C6*12')
  ('合计', '', '=SUM(C2:C6)', '=SUM(D2:D6)')
批量更新文件已保存

六、实际应用场景

  • 数据导入:从CSV或数据库批量读取数据写入Excel,用于数据迁移和备份

  • 报表更新:批量修改满足条件的数据,如工资调整、状态更新等业务场景

  • 数据整理:插入/删除行列调整表格结构,处理不规范的Excel数据

七、注意事项

注意:insert_rows/insert_cols会移动已有数据,公式引用可能需要更新,建议在插入后重新检查公式。

注意:批量操作大文件时,建议使用write_only模式提升性能,但只写模式不支持修改已有数据。

注意:delete_rows/delete_cols操作不可撤销,建议在执行删除操作前先备份数据或保存副本。

八、批量操作方式对比

方式 效率 适用场景 说明
append() 逐行追加 从末尾添加
cell()循环 精确位置写入 可指定任意位置
insert_rows/cols 插入空行/列 移动已有数据
delete_rows/cols 删除行/列 不可撤销
iter_rows+修改 条件更新 遍历+判断+修改

九、小结

  • append()是最高效的逐行追加方式,适合从数据源批量写入Excel

  • cell()循环适合精确位置写入,如从二维数组填充表格

  • insert_rows/cols插入空行空列,delete_rows/cols删除行和列,操作会直接影响表格结构

  • 批量修改通过iter_rows()遍历+条件判断+直接修改Cell实现,灵活高效

十、练习题

练习1

使用append()批量写入50行学生数据(姓名、成绩),计算平均分。

练习2

创建一个3x3的数据表,在第2行插入2行空行,在第2列插入1列空列。

练习3

创建一个工资表,批量将工资低于15000的员工工资增加10%。


常见问题

insert_rows和append()有什么区别?

append()始终从工作表末尾追加数据,不会影响已有数据。insert_rows在指定位置插入空行,会向下移动插入点之后的所有数据。如果需要批量追加数据,使用append()更高效;如果需要在中间位置插入,使用insert_rows。

批量操作10万行数据时如何提高性能?

使用Workbook(write_only=True)创建只写模式工作簿,配合ws.append()写入,可以显著提升写入速度。对于读取大文件,使用load_workbook(read_only=True)以只读模式打开。另外,可以考虑使用pandas库处理超大数据集。

delete_rows后公式引用会出错吗?

删除行后,Excel会自动更新公式中受影响的单元格引用。但如果公式引用了被删除的单元格,会显示#REF!错误。建议在删除前先检查公式依赖关系,必要时先备份数据。

如何批量修改满足多个条件的数据?

使用iter_rows()遍历数据,在循环中使用多个if条件判断。例如:if row[1].value == '技术部' and row[2].value > 15000: row[2].value *= 1.1。也可以将条件封装成函数,使代码更清晰。


标签: openpyxl 批量操作 insert_rows Excel数据处理 Python教程

本文涉及AI创作

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

list快速访问

上一篇: Python openpyxl单元格写入详解:多种写入方式与数据类型教程 下一篇: Python openpyxl样式设置详解:打造专业美观Excel报表教程

poll相关推荐