openpyxl 是 Python 中处理 Excel 2010 及以上版本(.xlsx/.xlsm/.xltx/.xltm)文件的主流库,支持读取、写入、修改Excel 数据,还能操作单元格样式、公式、图表等。本文将从环境安装、基础操作、进阶功能三个维度,详细讲解 openpyxl 的使用方法。
一、环境安装
首先通过 pip 安装 openpyxl 库:
pip install openpyxl
若需处理包含图片的 Excel 文件,需额外安装 pillow:
pip install pillow
二、核心概念
在操作前,需明确 Excel 文件的层级关系:
- 工作簿(Workbook):整个 Excel 文件(
.xlsx)。 - 工作表(Worksheet):工作簿中的单个表格(如 Sheet1、Sheet2)。
- 单元格(Cell):工作表中的最小单位,通过行号(数字)和列标(字母,如 A、B)定位(如 A1、B3)。
三、基础操作
3.1 创建新的 Excel 文件
通过 Workbook() 创建工作簿,默认包含一个工作表,可通过 save() 保存文件。
from openpyxl import Workbook
# 1. 创建工作簿对象
wb = Workbook()
# 2. 获取默认工作表(第一个工作表)
ws = wb.active # 等价于 wb.worksheets[0]
# 3. 重命名工作表
ws.title = "学生成绩表"
# 4. 保存文件(路径需存在,否则报错)
wb.save("学生成绩.xlsx")
3.2 打开已有的 Excel 文件
通过 load_workbook() 加载本地 Excel 文件,支持只读/读写模式。
from openpyxl import load_workbook
# 1. 打开工作簿(read_only=False 为可写模式,默认)
wb = load_workbook("学生成绩.xlsx")
# 2. 可选:只读模式(适合大文件,提升性能)
# wb = load_workbook("学生成绩.xlsx", read_only=True)
# 3. 关闭工作簿(操作完成后建议关闭)
# wb.close()
3.3 工作表操作
包括创建、选择、复制、删除工作表。
from openpyxl import Workbook
wb = Workbook()
# 1. 创建新工作表(可指定位置,0 为第一个)
ws1 = wb.create_sheet("数学成绩", 0) # 插入到第一个位置
ws2 = wb.create_sheet("语文成绩") # 默认插入到最后
# 2. 选择工作表(三种方式)
ws = wb["学生成绩表"] # 通过名称选择(推荐)
ws = wb.worksheets[0] # 通过索引选择
ws = wb.active # 选择当前活动工作表
# 3. 复制工作表(仅复制数据和样式,公式需重新计算)
ws_copy = wb.copy_worksheet(ws)
ws_copy.title = "学生成绩表-副本"
# 4. 删除工作表
del wb["语文成绩"] # 通过名称删除
# 或 wb.remove(ws2) # 通过对象删除
# 5. 查看所有工作表名称
print(wb.sheetnames) # 输出:['数学成绩', '学生成绩表', '学生成绩表-副本']
wb.save("学生成绩.xlsx")
3.4 单元格操作
单元格是核心操作单元,支持赋值、取值、批量操作。
3.4.1 单个单元格操作
通过列标+行号(如 A1)或cell() 方法(行、列数字)定位单元格。
from openpyxl import Workbook
wb = Workbook()
ws = wb.active
ws.title = "学生成绩表"
# 1. 给单元格赋值(两种方式)
ws["A1"] = "姓名" # 列标+行号
ws["B1"] = "数学"
ws.cell(row=2, column=1, value="张三") # cell(行, 列, 值)
ws.cell(row=2, column=2, value=95)
# 2. 获取单元格值
name = ws["A2"].value
math_score = ws.cell(row=2, column=2).value
print(f"姓名:{name},数学成绩:{math_score}") # 输出:姓名:张三,数学成绩:95
# 3. 获取单元格的行、列、坐标信息
cell = ws["B2"]
print(f"行:{cell.row},列:{cell.column},坐标:{cell.coordinate}") # 输出:行:2,列:2,坐标:B2
wb.save("学生成绩.xlsx")
3.4.2 批量单元格操作
通过切片或循环批量处理单元格,适合大量数据录入/读取。
from openpyxl import Workbook
wb = Workbook()
ws = wb.active
ws.title = "学生成绩表"
# 1. 批量赋值(二维列表)
data = [
["姓名", "数学", "语文", "英语"],
["张三", 95, 88, 92],
["李四", 80, 90, 78],
["王五", 75, 85, 90]
]
# 方式1:逐行写入
for row in data:
ws.append(row) # append() 向工作表末尾添加一行
# 方式2:切片赋值(适合指定区域)
# ws["A1:D4"] = data # 需保证切片区域与数据维度一致
# 2. 批量读取(三种方式)
# 方式1:按行读取(推荐)
for row in ws.iter_rows(min_row=1, max_row=4, min_col=1, max_col=4, values_only=True):
print(row) # values_only=True 仅返回值,否则返回单元格对象
# 方式2:按列读取
for col in ws.iter_cols(min_row=1, max_row=4, min_col=1, max_col=4, values_only=True):
print(col)
# 方式3:读取所有行
all_rows = list(ws.rows) # 返回单元格对象的行列表
all_values = [ [cell.value for cell in row] for row in all_rows ]
print(all_values)
wb.save("学生成绩.xlsx")
四、进阶功能
4.1 单元格样式设置
openpyxl.styles 模块支持设置字体、对齐、边框、填充等样式,让 Excel 更美观。
from openpyxl import Workbook
from openpyxl.styles import Font, Alignment, Border, Side, PatternFill
wb = Workbook()
ws = wb.active
ws.title = "学生成绩表"
# 写入表头和数据
data = [
["姓名", "数学", "语文", "英语"],
["张三", 95, 88, 92],
["李四", 80, 90, 78],
["王五", 75, 85, 90]
]
for row in data:
ws.append(row)
# 1. 设置字体(表头:黑体、14号、加粗、红色)
header_font = Font(name="黑体", size=14, bold=True, color="FF0000")
ws["A1:D1"].font = header_font # 批量设置表头字体
# 2. 设置对齐(所有单元格居中对齐)
center_alignment = Alignment(horizontal="center", vertical="center")
for row in ws.iter_rows(min_row=1, max_row=4, min_col=1, max_col=4):
for cell in row:
cell.alignment = center_alignment
# 3. 设置边框(黑色细边框)
thin_side = Side(style="thin", color="000000")
border = Border(left=thin_side, right=thin_side, top=thin_side, bottom=thin_side)
for row in ws.iter_rows(min_row=1, max_row=4, min_col=1, max_col=4):
for cell in row:
cell.border = border
# 4. 设置填充(表头浅灰色填充)
fill = PatternFill(fill_type="solid", fgColor="E6E6E6")
ws["A1:D1"].fill = fill
# 5. 调整列宽和行高
ws.column_dimensions["A"].width = 10 # A列宽度
ws.column_dimensions["B"].width = 8
ws.row_dimensions[1].height = 20 # 第1行高度
wb.save("学生成绩_带样式.xlsx")
4.2 公式与函数
openpyxl 支持写入 Excel 公式,公式以**等号(=)**开头,需注意公式语法与 Excel 一致(英文逗号分隔参数)。
from openpyxl import Workbook
wb = Workbook()
ws = wb.active
ws.title = "学生成绩表"
# 写入数据
data = [
["姓名", "数学", "语文", "英语", "总分"],
["张三", 95, 88, 92, ""],
["李四", 80, 90, 78, ""],
["王五", 75, 85, 90, ""]
]
for row in data:
ws.append(row)
# 1. 写入求和公式(计算总分)
ws["E2"] = "=SUM(B2:D2)"
ws["E3"] = "=SUM(B3:D3)"
ws["E4"] = "=SUM(B4:D4)"
# 2. 写入平均值公式(计算数学平均分)
ws["B5"] = "数学平均分"
ws["C5"] = "=AVERAGE(B2:B4)"
# 3. 读取公式计算结果(需确保公式已计算,默认保存后自动计算)
wb.save("学生成绩_带公式.xlsx")
# 重新打开文件,读取计算后的值
from openpyxl import load_workbook
wb2 = load_workbook("学生成绩_带公式.xlsx", data_only=True) # data_only=True 读取计算结果而非公式
ws2 = wb2.active
print("张三总分:", ws2["E2"].value) # 输出:275
print("数学平均分:", ws2["C5"].value) # 输出:83.33333333333333
wb2.close()
4.3 合并与拆分单元格
通过 merge_cells() 合并单元格,unmerge_cells() 拆分单元格。
from openpyxl import Workbook
from openpyxl.styles import Alignment
wb = Workbook()
ws = wb.active
ws.title = "合并单元格示例"
# 1. 合并单元格(A1:C1)
ws.merge_cells("A1:C1")
ws["A1"] = "学生成绩汇总表"
ws["A1"].alignment = Alignment(horizontal="center", vertical="center") # 居中
# 2. 合并指定行和列的单元格(row2-row3, col1-col1)
ws.merge_cells(min_row=2, min_col=1, max_row=3, max_col=1)
ws["A2"] = "姓名"
# 3. 拆分单元格(仅拆分已合并的)
# ws.unmerge_cells("A1:C1")
# 调整行高和列宽
ws.row_dimensions[1].height = 30
ws.column_dimensions["A"].width = 15
wb.save("合并单元格.xlsx")
4.4 插入图片
通过 openpyxl.drawing.image.Image 插入图片到 Excel,需提前安装 pillow。
from openpyxl import Workbook
from openpyxl.drawing.image import Image
wb = Workbook()
ws = wb.active
ws.title = "插入图片示例"
# 1. 加载图片(支持png/jpg等格式)
img = Image("logo.png") # 替换为你的图片路径
# 2. 调整图片大小(可选)
img.width = 100
img.height = 80
# 3. 插入图片到指定单元格(A1)
ws.add_image(img, "A1")
wb.save("带图片的Excel.xlsx")
五、高级技巧
5.1 处理大文件
对于超大 Excel 文件(百万行数据),使用**只读模式(read_only=True)和只写模式(write_only=True)**提升性能,避免内存溢出。
# 只写模式:适合批量写入大量数据
from openpyxl import Workbook
wb = Workbook(write_only=True) # 只写模式
ws = wb.create_sheet("大文件数据")
# 批量写入10万行数据
for i in range(100000):
ws.append([f"数据{i+1}", i+1, "测试"])
wb.save("大文件.xlsx")
5.2 冻结窗格
通过 freeze_panes 冻结表头或指定区域,方便查看大表格。
from openpyxl import Workbook
wb = Workbook()
ws = wb.active
ws.title = "冻结窗格示例"
# 冻结首行(A2 表示冻结A2上方和左侧的区域)
ws.freeze_panes = "A2"
# 冻结首列和首行(B2 表示冻结B2上方和左侧)
# ws.freeze_panes = "B2"
wb.save("冻结窗格.xlsx")
六、常见问题
- 公式不显示计算结果:读取时需设置
load_workbook(data_only=True),且需确保 Excel 已保存过公式计算结果。 - 中文乱码:确保文件保存为
.xlsx格式,且代码文件编码为 UTF-8。 - 单元格样式设置无效:批量设置样式时需遍历单元格,而非直接对切片赋值(部分样式支持切片,如字体、填充)。
- 大文件内存溢出:使用只读/只写模式,避免一次性加载所有数据。
七、总结
openpyxl 是功能强大的 Excel 处理库,本文覆盖了基础的文件/工作表/单元格操作、进阶的样式/公式/图片处理和高级的大文件优化,满足日常办公自动化、数据处理的绝大多数需求。如需更复杂的功能(如图表、数据验证),可参考 openpyxl 官方文档。
ps:ai生成

1万+

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



