文章目录
openpyxl 是 Python 中用于读写 Excel 2010 及以上版本(.xlsx/.xlsm 格式)的强大库,支持单元格数据操作、样式设置、公式计算、图表生成等功能,广泛用于自动化报表生成、数据导入导出等场景。它不支持旧版 .xls 格式(需用 xlrd/xlwt 库处理)。
一、核心功能
- 读写 Excel 文件:创建新工作簿、读取已有文件,支持单元格数据的读取和修改。
- 工作表操作:新增、删除、重命名工作表,切换活跃工作表。
- 单元格操作:通过坐标(如
A1)或行列号(如row=1, column=1)访问单元格,支持数据类型(字符串、数字、日期等)。 - 样式设置:自定义单元格字体(大小、颜色、加粗)、对齐方式(居中、换行)、边框、填充色等。
- 高级功能:合并/取消合并单元格、插入公式(如求和、平均值)、遍历数据、设置行高列宽等。
二、安装
pip install openpyxl
三、基本使用与代码示例
示例 1:创建新工作簿并写入数据
from openpyxl import Workbook
# 1. 创建工作簿对象(默认包含一个名为 "Sheet" 的工作表)
wb = Workbook()
# 2. 获取活跃工作表(默认第一个工作表)
ws = wb.active
# 重命名工作表
ws.title = "学生成绩表"
# 3. 写入数据(两种方式:通过单元格坐标或行列号)
# 方式1:直接指定单元格坐标(如 A1, B1)
ws["A1"] = "学号"
ws["B1"] = "姓名"
ws["C1"] = "分数"
# 方式2:通过 row(行号)和 column(列号,从1开始)
ws.cell(row=2, column=1, value="001") # 第2行第1列(A2)
ws.cell(row=2, column=2, value="张三") # B2
ws.cell(row=2, column=3, value=95) # C2
# 批量写入多行数据
data = [
("002", "李四", 88),
("003", "王五", 92),
("004", "赵六", 79)
]
for row in data:
ws.append(row) # append 会自动追加到下一行
# 4. 保存工作簿(若文件已存在,会覆盖)
wb.save("学生成绩.xlsx")
示例 2:读取已有 Excel 文件
from openpyxl import load_workbook
# 1. 加载已有工作簿(data_only=True 表示读取公式计算结果而非公式本身)
wb = load_workbook("学生成绩.xlsx", data_only=True)
# 2. 查看所有工作表名称
print("工作表列表:", wb.sheetnames) # 输出:['学生成绩表']
# 3. 获取指定工作表(两种方式)
ws = wb["学生成绩表"] # 方式1:通过名称
# ws = wb.active # 方式2:获取活跃工作表
# 4. 读取单元格数据
print("A1 的值:", ws["A1"].value) # 输出:学号
print("B2 的值:", ws.cell(row=2, column=2).value) # 输出:张三
# 5. 遍历行数据(获取所有学生成绩)
print("\n所有学生数据:")
# iter_rows:从第2行到最后一行,第1列到第3列
for row in ws.iter_rows(min_row=2, max_row=ws.max_row, min_col=1, max_col=3, values_only=True):
# values_only=True 直接返回单元格值,否则返回 Cell 对象
print(f"学号:{row[0]}, 姓名:{row[1]}, 分数:{row[2]}")
# 6. 关闭工作簿(非必须,但推荐)
wb.close()
示例 3:设置单元格样式(字体、对齐、边框)
from openpyxl import Workbook
from openpyxl.styles import Font, Alignment, Border, Side
# 创建工作簿和工作表
wb = Workbook()
ws = wb.active
ws.title = "样式示例"
# 定义样式
# 1. 字体:20号、加粗、蓝色
title_font = Font(size=20, bold=True, color="0000FF") # 颜色用十六进制(RRGGBB)
# 2. 对齐:水平居中、垂直居中、自动换行
center_align = Alignment(horizontal="center", vertical="center", wrap_text=True)
# 3. 边框:细实线边框
thin_border = Border(
left=Side(style="thin"),
right=Side(style="thin"),
top=Side(style="thin"),
bottom=Side(style="thin")
)
# 应用样式到标题单元格
ws["A1"] = "带样式的标题"
ws["A1"].font = title_font
ws["A1"].alignment = center_align
ws["A1"].border = thin_border
# 合并单元格(A1到C1)
ws.merge_cells("A1:C1")
# 调整行高和列宽
ws.row_dimensions[1].height = 30 # 第1行行高
ws.column_dimensions["A"].width = 20 # A列列宽
# 保存文件
wb.save("样式示例.xlsx")
示例 4:使用公式与计算
from openpyxl import Workbook
wb = Workbook()
ws = wb.active
ws.title = "公式示例"
# 写入数据
ws["A1"] = "数值1"
ws["B1"] = "数值2"
ws["C1"] = "求和结果"
ws["A2"] = 10
ws["B2"] = 20
ws["A3"] = 30
ws["B3"] = 40
# 插入公式(注意:公式需用英文输入,与Excel中写法一致)
ws["C2"] = "=SUM(A2:B2)" # 计算 A2+B2
ws["C3"] = "=A3+B3" # 计算 A3+B3
ws["C4"] = "=AVERAGE(C2:C3)" # 计算平均值
# 保存文件(此时用 Excel 打开会自动计算结果)
wb.save("公式示例.xlsx")
# 注意:若用 load_workbook 读取时,需设置 data_only=True 才能获取计算结果
# 但首次保存的文件未被 Excel 打开过,结果可能为 None,需用 Excel 打开后重新保存才会生效
示例 5:新增/删除工作表
from openpyxl import Workbook
wb = Workbook()
ws1 = wb.active
ws1.title = "表1"
# 新增工作表(插入到最后)
ws2 = wb.create_sheet(title="表2")
# 新增工作表(插入到最前面,index=0)
ws3 = wb.create_sheet(title="表3", index=0)
print("新增后工作表:", wb.sheetnames) # 输出:['表3', '表1', '表2']
# 删除工作表
del wb["表3"]
print("删除后工作表:", wb.sheetnames) # 输出:['表1', '表2']
wb.save("工作表操作.xlsx")
四、常见问题与注意事项
- 不支持 .xls 格式:仅处理 .xlsx/.xlsm,.xls 需用
xlrd(读)和xlwt(写)。 - 公式计算:
load_workbook(data_only=True)读取的是上次 Excel 计算的结果,若文件未被 Excel 打开过,可能返回None。 - 大型文件性能:处理十万行以上数据时,建议使用
read_only=True模式加载工作簿,减少内存占用:wb = load_workbook("大型文件.xlsx", read_only=True) - 样式复用:多次使用的样式建议定义为变量,避免重复创建(提高效率)。
五、总结
openpyxl 是处理 Excel 2010+ 文件的首选库,其核心优势在于:
- 功能全面:支持数据读写、样式设置、公式、图表等几乎所有 Excel 操作。
- 易用性:API 设计直观,通过对象(工作簿、工作表、单元格)层级操作,易于理解。
- 灵活性:可用于自动化报表生成、数据清洗、批量处理等场景。
掌握 openpyxl 能极大提高 Excel 相关工作的效率,尤其适合需要批量处理大量表格数据的场景。
1万+

被折叠的 条评论
为什么被折叠?



