Python使用openpyxl生成、读取、修改Excel

 更新时间:2026年05月09日 09:47:09   作者:yuanpan  
本文介绍了使用Python的openpyxl库处理Excel文件的方法,包括生成、读取和修改Excel文件,适用于办公自动化场景,文中提供了完整代码示例,并强调了从简单到复杂逐步学习的重要性,需要的朋友可以参考下

很多日常办公场景都会遇到 Excel:整理销售数据、统计考勤、合并表格、批量改格式、给领导生成周报。如果每次都靠手动复制、筛选、改颜色,效率会很低,也容易出错。

openpyxl 是 Python 里非常常用的 Excel 处理库,适合操作 .xlsx 文件。本文用一份完整演示代码,带大家学会三个高频动作:

  • 生成 Excel 文件
  • 读取 Excel 内容
  • 修改已有 Excel 文件

适合刚开始学习 Python、也想提升 Excel 办公效率的小伙伴。

一、安装 openpyxl

先在命令行安装:

pip install openpyxl

如果你使用的是多个 Python 版本,也可以这样安装:

python -m pip install openpyxl

二、完整演示代码

下面这段代码会完成一个完整流程:

  1. 生成一份 student_score.xlsx
  2. 写入学生成绩数据
  3. 设置标题、表头、列宽、颜色、冻结窗格
  4. 读取 Excel 并打印每一行
  5. 修改 Excel:新增平均分、等级、备注,并保存为新文件

建议新建一个 openpyxl_excel_demo.py 文件,把代码复制进去直接运行。

from pathlib import Path

from openpyxl import Workbook, load_workbook
from openpyxl.styles import Font, PatternFill, Alignment, Border, Side
from openpyxl.utils import get_column_letter


BASE_DIR = Path(__file__).resolve().parent
SOURCE_FILE = BASE_DIR / "student_score.xlsx"
UPDATED_FILE = BASE_DIR / "student_score_updated.xlsx"


def create_excel(file_path: Path) -> None:
    """生成一份学生成绩 Excel。"""
    wb = Workbook()
    ws = wb.active
    ws.title = "成绩表"

    # 标题
    ws.merge_cells("A1:F1")
    ws["A1"] = "学生成绩统计表"
    ws["A1"].font = Font(name="微软雅黑", size=16, bold=True, color="FFFFFF")
    ws["A1"].fill = PatternFill("solid", fgColor="4472C4")
    ws["A1"].alignment = Alignment(horizontal="center", vertical="center")
    ws.row_dimensions[1].height = 28

    # 表头和数据
    headers = ["学号", "姓名", "语文", "数学", "英语", "班级"]
    rows = [
        [1001, "张三", 88, 92, 85, "一班"],
        [1002, "李四", 76, 81, 79, "一班"],
        [1003, "王五", 95, 89, 93, "二班"],
        [1004, "赵六", 68, 72, 70, "二班"],
        [1005, "孙七", 84, 86, 91, "三班"],
    ]

    ws.append([])
    ws.append(headers)
    for row in rows:
        ws.append(row)

    # 样式
    header_fill = PatternFill("solid", fgColor="D9EAF7")
    thin = Side(style="thin", color="D9D9D9")
    border = Border(left=thin, right=thin, top=thin, bottom=thin)

    for row in ws.iter_rows(min_row=3, max_row=ws.max_row, min_col=1, max_col=6):
        for cell in row:
            cell.border = border
            cell.alignment = Alignment(horizontal="center", vertical="center")

    for cell in ws[3]:
        cell.font = Font(bold=True)
        cell.fill = header_fill

    # 设置列宽
    column_widths = [12, 12, 10, 10, 10, 12]
    for index, width in enumerate(column_widths, start=1):
        ws.column_dimensions[get_column_letter(index)].width = width

    # 冻结表头,开启筛选
    ws.freeze_panes = "A4"
    ws.auto_filter.ref = f"A3:F{ws.max_row}"

    wb.save(file_path)
    print(f"已生成 Excel:{file_path}")


def read_excel(file_path: Path) -> None:
    """读取 Excel 内容并打印。"""
    wb = load_workbook(file_path)
    ws = wb["成绩表"]

    print("\n读取 Excel 内容:")
    for row in ws.iter_rows(min_row=4, values_only=True):
        student_id, name, chinese, math, english, class_name = row
        print(
            f"学号:{student_id},姓名:{name},"
            f"语文:{chinese},数学:{math},英语:{english},班级:{class_name}"
        )


def update_excel(source_path: Path, target_path: Path) -> None:
    """修改 Excel,增加平均分、等级、备注。"""
    wb = load_workbook(source_path)
    ws = wb["成绩表"]

    # 新增表头
    ws["G3"] = "平均分"
    ws["H3"] = "等级"
    ws["I3"] = "备注"

    for cell in ws[3]:
        cell.font = Font(bold=True)
        cell.fill = PatternFill("solid", fgColor="D9EAF7")
        cell.alignment = Alignment(horizontal="center", vertical="center")

    for row_index in range(4, ws.max_row + 1):
        chinese = ws.cell(row=row_index, column=3).value
        math = ws.cell(row=row_index, column=4).value
        english = ws.cell(row=row_index, column=5).value

        average = round((chinese + math + english) / 3, 2)
        ws.cell(row=row_index, column=7).value = average

        if average >= 90:
            level = "优秀"
            remark = "继续保持"
        elif average >= 80:
            level = "良好"
            remark = "表现稳定"
        elif average >= 70:
            level = "合格"
            remark = "仍有提升空间"
        else:
            level = "待提升"
            remark = "建议重点辅导"

        ws.cell(row=row_index, column=8).value = level
        ws.cell(row=row_index, column=9).value = remark

    # 给新增区域补样式
    thin = Side(style="thin", color="D9D9D9")
    border = Border(left=thin, right=thin, top=thin, bottom=thin)
    for row in ws.iter_rows(min_row=3, max_row=ws.max_row, min_col=1, max_col=9):
        for cell in row:
            cell.border = border
            cell.alignment = Alignment(horizontal="center", vertical="center")

    for column in range(7, 10):
        ws.column_dimensions[get_column_letter(column)].width = 14

    ws.auto_filter.ref = f"A3:I{ws.max_row}"
    wb.save(target_path)
    print(f"\n已修改并另存为:{target_path}")


def main() -> None:
    create_excel(SOURCE_FILE)
    read_excel(SOURCE_FILE)
    update_excel(SOURCE_FILE, UPDATED_FILE)


if __name__ == "__main__":
    main()

三、代码运行后会得到什么

运行命令:

python openpyxl_excel_demo.py

执行完成后,当前目录会生成两个文件:

  • student_score.xlsx:原始学生成绩表
  • student_score_updated.xlsx:新增平均分、等级、备注之后的成绩表

控制台也会打印读取到的数据,例如:

已生成 Excel:student_score.xlsx

读取 Excel 内容:
学号:1001,姓名:张三,语文:88,数学:92,英语:85,班级:一班
学号:1002,姓名:李四,语文:76,数学:81,英语:79,班级:一班

已修改并另存为:student_score_updated.xlsx

四、核心知识点拆解

1. 创建工作簿

wb = Workbook()
ws = wb.active
ws.title = "成绩表"

Workbook() 表示新建一个 Excel 文件,wb.active 获取默认工作表,ws.title 可以修改工作表名称。

2. 写入单元格

ws["A1"] = "学生成绩统计表"
ws.append(["学号", "姓名", "语文", "数学", "英语", "班级"])

常见写法有两种:

  • ws["A1"] = 值:适合写入指定单元格
  • ws.append([...]):适合按行批量追加数据

3. 读取工作簿

wb = load_workbook("student_score.xlsx")
ws = wb["成绩表"]

读取已有 Excel 文件时使用 load_workbook()。如果文件里有多个 sheet,可以通过名称获取对应工作表。

4. 遍历行数据

for row in ws.iter_rows(min_row=4, values_only=True):
    print(row)

iter_rows() 很适合批量读取表格数据。

  • min_row=4 表示从第 4 行开始读
  • values_only=True 表示只读取单元格的值,不读取单元格对象

5. 修改并保存为新文件

wb = load_workbook("student_score.xlsx")
ws = wb["成绩表"]
ws["G3"] = "平均分"
wb.save("student_score_updated.xlsx")

实际工作中,建议不要直接覆盖原始文件。可以先读取源文件,再另存为新文件,这样出错时还能保留原始数据。

五、openpyxl 适合哪些办公自动化场景

openpyxl 可以帮你处理很多重复性的 Excel 工作,例如:

  • 批量生成日报、周报、月报
  • 批量读取多个 Excel 文件的数据
  • 给 Excel 自动加表头、颜色、边框、列宽
  • 根据分数、金额、状态自动计算等级
  • 自动筛选异常数据
  • 批量修改表格格式
  • 自动生成带公式的统计表

如果你每天都在重复打开 Excel、复制粘贴、改格式,那么这类脚本很值得学习。

六、学习建议

刚学 openpyxl 时,不建议一开始就追求复杂功能。可以按下面顺序练习:

  1. 先会新建 Excel、写入几行数据
  2. 再学读取已有 Excel
  3. 再学修改单元格内容
  4. 然后学习样式、列宽、冻结窗格、筛选
  5. 最后结合真实工作表,把重复操作写成脚本

Python 办公自动化的价值,不在于写出多复杂的代码,而在于把每天重复 30 分钟的事情,变成一个 3 秒钟执行完成的脚本。

七、总结

本文用一份完整代码演示了如何用 openpyxl 完成 Excel 的生成、读取和修改。你可以把这个脚本当成模板,换成自己的业务字段,例如员工信息、订单数据、考勤记录、销售统计等。

掌握这些基础之后,再继续学习公式、图表、多文件合并、批量报表生成,Python 处理 Excel 的效率会非常明显。

以上就是Python使用openpyxl生成、读取、修改Excel的详细内容,更多关于Python openpyxl操作Excel的资料请关注脚本之家其它相关文章!

相关文章

  • Python 模拟员工信息数据库操作的实例

    Python 模拟员工信息数据库操作的实例

    下面小编就为大家带来一篇Python 模拟员工信息数据库操作的实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-10-10
  • python requests包的request()函数中的参数-params和data的区别介绍

    python requests包的request()函数中的参数-params和data的区别介绍

    这篇文章主要介绍了python requests包的request()函数中的参数-params和data的区别介绍,具有很好参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-05-05
  • Linux下安装python3.6和第三方库的教程详解

    Linux下安装python3.6和第三方库的教程详解

    这篇文章主要介绍了Linux下安装python3.6和第三方库的教程详解,需要的朋友可以参考下
    2018-11-11
  • numpy.delete删除一列或多列的方法

    numpy.delete删除一列或多列的方法

    下面小编就为大家分享一篇numpy.delete删除一列或多列的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-04-04
  • tensorflow 模型权重导出实例

    tensorflow 模型权重导出实例

    今天小编就为大家分享一篇tensorflow 模型权重导出实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-01-01
  • 教你如何用python操作摄像头以及对视频流的处理

    教你如何用python操作摄像头以及对视频流的处理

    这篇文章主要介绍了教你如何用python操作摄像头以及对视频流的处理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-10-10
  • Pandas多个条件(AND,OR,NOT)中提取行

    Pandas多个条件(AND,OR,NOT)中提取行

    本文主要介绍了Pandas多个条件(AND,OR,NOT)中提取行,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-02-02
  • 使用celery和Django处理异步任务的流程分析

    使用celery和Django处理异步任务的流程分析

    Celery是 一个专注于实时处理的任务队列,它还支持任务调度。 Celery快速,简单,高度可用且灵活。这篇文章主要介绍了使用celery和Django处理异步任务的流程分析,需要的朋友可以参考下
    2020-02-02
  • Python 爬虫学习笔记之多线程爬虫

    Python 爬虫学习笔记之多线程爬虫

    本文给大家介绍的是python基于XPath实现多线程爬虫的实例以及XPath的介绍安装和简单用法,非常的细致,有需要的小伙伴可以参考下
    2016-09-09
  • Python中断多重循环的几种方法

    Python中断多重循环的几种方法

    跳出单循环不管是什么编程语言,都有可能会有跳出循环的需求,本文主要介绍了Python中断多重循环的几种方法,具有一定的参考价值,感兴趣的可以了解一下
    2023-11-11

最新评论