openpyxl是Python生态中处理xlsx格式Excel文件最主流的第三方库,它不依赖Windows操作系统和Office软件,跨平台运行,非常适合批量生成报表、数据导出、自动化整理表格等场景。本文将从安装配置、基础读写、样式美化到进阶技巧,完整讲解openpyxl的使用方法。

一、环境安装与基本概念
openpyxl可以直接通过pip安装,建议在虚拟环境中操作以避免依赖冲突:
pip install openpyxl
安装完成后需要理解几个核心概念:Workbook代表整个Excel文件,Worksheet代表一张工作表,Cell则是最小的存储单元。一个xlsx文件可以包含多张工作表,每张表由行和列组成,列用字母标识(A、B、C),行用数字标识(1、2、3),两者组合即单元格地址,例如B3表示第B列第3行。
需要注意的一点是,openpyxl只支持xlsx、xlsm等基于Open XML的新格式,不支持Excel 97-2003的xls旧格式。如果必须处理xls文件,可以先用pandas配合xlrd读取,或者借助Excel另存为xlsx后再操作。
二、创建工作簿与读写数据
先看如何创建一个新文件并写入数据。下面的示例演示了新建工作簿、命名工作表、用三种方式写入单元格,最后保存文件:
from openpyxl import Workbook
# 创建工作簿,默认自带一张名为Sheet的表
wb = Workbook()
ws = wb.active
ws.title = "销售数据"
# 方式一:直接按单元格地址赋值
ws["A1"] = "产品名称"
ws["B1"] = "销量"
# 方式二:通过cell方法指定行列号,行和列从1开始
ws.cell(row=2, column=1, value="显示器")
ws.cell(row=2, column=2, value=150)
# 方式三:按行批量追加,适合从列表或数据库写入
data = [
["键盘", 320],
["鼠标", 450],
["耳机", 210],
]
for row in data:
ws.append(row)
wb.save("sales.xlsx")
print("文件保存成功")append方法非常实用,它会自动从当前表的下一空行开始追加,处理批量数据时无需手动维护行号,配合列表推导式可以轻松将数据库查询结果导入Excel。
读取已有文件同样简单,使用load_workbook加载后即可访问:
from openpyxl import load_workbook
wb = load_workbook("sales.xlsx")
ws = wb["销售数据"]
# 读取单个单元格
print(ws["A1"].value)
# 遍历所有有数据的行
for row in ws.iter_rows(min_row=1, max_row=ws.max_row, values_only=True):
print(row)这里有个重要参数值得注意:load_workbook("sales.xlsx", data_only=True)。默认情况下读取公式单元格得到的是公式字符串本身,加上data_only=True后会返回上次Excel保存时计算出的结果值。因此如果要读取公式的计算结果,务必加上这个参数;但要修改并回存文件时则不要用它,否则公式会被结果值覆盖丢失。
三、样式设置与公式操作
报表生成往往离不开格式美化,openpyxl提供了字体、边框、对齐、填充等样式对象:
from openpyxl import load_workbook
from openpyxl.styles import Font, Alignment, PatternFill, Border, Side
wb = load_workbook("sales.xlsx")
ws = wb["销售数据"]
# 表头加粗白字蓝底
header_font = Font(bold=True, color="FFFFFF", size=12)
fill = PatternFill(start_color="4472C4", end_color="4472C4", fill_type="solid")
center = Alignment(horizontal="center", vertical="center")
thin = Side(style="thin")
border = Border(left=thin, right=thin, top=thin, bottom=thin)
for cell in ws[1]: # 第一行所有单元格
cell.font = header_font
cell.fill = fill
cell.alignment = center
cell.border = border
# 数据区加边框并右对齐
for row in ws.iter_rows(min_row=2):
for cell in row:
cell.border = border
if cell.column == 2:
cell.alignment = Alignment(horizontal="right")
# 设置列宽和行高
ws.column_dimensions["A"].width = 20
ws.row_dimensions[1].height = 25
wb.save("sales_styled.xlsx")样式对象是不可变的,建议像示例中那样先定义再循环赋值,避免在循环里反复创建对象影响性能。除了外观样式,还可以设置数字格式,例如ws["C2"].number_format = "#,##0.00"让数值显示千分位和两位小数。
公式的写入与普通文本没有区别,直接把公式字符串赋给单元格即可:
ws["B5"] = "=SUM(B2:B4)"
ws["B6"] = "=AVERAGE(B2:B4)"
ws["C2"] = '=IF(B2>300,"畅销","普通")'
wb.save("sales.xlsx")写入公式后用openpyxl直接读取该单元格只会看到公式字符串,这就是前面提到data_only参数的由来。如果需要在服务端获取计算结果,要么用LibreOffice等工具转换,要么改用formulas这类专门计算公式的库。
四、多表管理与性能优化建议
实际项目中经常需要操作多张工作表。常用操作包括新建、复制、删除和切换:
ws2 = wb.create_sheet("汇总") # 新建表
ws3 = wb.copy_worksheet(wb["销售数据"]) # 复制表
ws3.title = "销售数据备份"
del wb["Sheet"] # 删除表
print(wb.sheetnames) # 查看所有表名当数据量达到几万行以上时,写入性能会成为瓶颈。openpyxl提供只写模式来显著提升速度:
from openpyxl import Workbook
wb = Workbook(write_only=True)
ws = wb.create_sheet()
for i in range(100000):
ws.append([f"商品{i}", i * 10])
wb.save("big_data.xlsx")只写模式下不能随机访问单元格,只能用append顺序写入,内存占用会大幅降低,十万行数据通常几秒即可完成。相应地,读取大文件可以使用read_only=True模式,它以流式方式解析,适合遍历超大数据集而不将整个文件载入内存。
最后总结几点实践建议:操作前备份原文件,避免公式被意外覆盖;样式和公式尽量批量设置减少对象创建;超大数据量优先考虑只写或只读模式;需要图表、数据透视等高级功能时可以探索openpyxl.chart和openpyxl.pivot模块。掌握这些内容后,绝大多数Excel自动化需求都可以用openpyxl优雅地解决。
openpyxlPython操作ExcelExcel自动化修改时间:2026-09-01 18:28:40