Python如何操作Excel文件?openpyxl库使用详解

来源:SQLServer教程作者:缓存小熊猫头衔:程序员
导读:本期聚焦于缓存小熊猫创作的《Python如何操作Excel文件?openpyxl库使用详解》,敬请观看详情。用Python读写Excel文件是办公自动化中最常见的需求之一,openpyxl作为专门处理xlsx格式文件的第三方库,能够完成单元格读写、批量数据填充、样式设置、公式计算乃至图表生成等任务。本文将从环境安装讲起,逐步演示如何创建工作簿、遍历行列数据、修改单元格样式与格式,再进阶到公式的写入与读取、多工作表管理以及大数据量写入的性能优化技巧。文中所有示例均附带可直接运行的代码,同时也会说明openpyxl不支持旧版xls格式的局限及替代方案,帮助你快速上手Excel自动化处理。

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

Python如何操作Excel文件?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.chartopenpyxl.pivot模块。掌握这些内容后,绝大多数Excel自动化需求都可以用openpyxl优雅地解决。

openpyxlPython操作ExcelExcel自动化修改时间:2026-09-01 18:28:40

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。