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 参数
insert_cols / delete_cols 参数
四、返回值说明
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()是最高效的逐行追加方式,适合从数据源批量写入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。也可以将条件封装成函数,使代码更清晰。
本文涉及AI创作
内容由AI创作,请仔细甄别