openpyxl详细使用教程

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")

六、常见问题

  1. 公式不显示计算结果:读取时需设置 load_workbook(data_only=True),且需确保 Excel 已保存过公式计算结果。
  2. 中文乱码:确保文件保存为 .xlsx 格式,且代码文件编码为 UTF-8。
  3. 单元格样式设置无效:批量设置样式时需遍历单元格,而非直接对切片赋值(部分样式支持切片,如字体、填充)。
  4. 大文件内存溢出:使用只读/只写模式,避免一次性加载所有数据。

七、总结

openpyxl 是功能强大的 Excel 处理库,本文覆盖了基础的文件/工作表/单元格操作进阶的样式/公式/图片处理高级的大文件优化,满足日常办公自动化、数据处理的绝大多数需求。如需更复杂的功能(如图表、数据验证),可参考 openpyxl 官方文档

ps:ai生成

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值