一、前言
日常工作经常需要处理 Excel 表格:批量录入数据、统计分数、筛选内容、汇总台账,手动操作耗时且容易出错。本篇使用openpyxl库实现 Excel 自动化,支持读写.xlsx格式文件,无需打开 Excel 软件,纯代码完成表格处理,适合学生成绩、台账、报表批量操作。
二、环境安装 openpyxl
CMD 执行安装命令,国内镜像加速:
bash
运行
pip install openpyxl -i https://pypi.tuna.tsinghua.edu.cn/simple
适用文件:.xlsx(Office2007 及以上版本),不支持旧版.xls文件。
三、Excel 基础概念
工作簿 (Workbook):整个 Excel 文件
工作表 (Worksheet):底部 Sheet1/Sheet2 分页
单元格 (Cell):表格最小格子,定位方式
行号,列号(行从 1 开始,列从 1 开始)行、列:批量读取整行 / 整列数据
四、基础 1:新建 Excel 并写入数据
python
运行
from openpyxl import Workbook
# 1. 创建空白工作簿
wb = Workbook()
# 获取默认工作表
ws = wb.active
# 修改工作表名称
ws.title = "学生成绩表"
# 方式1:直接指定单元格写入
ws["A1"] = "姓名"
ws["B1"] = "年龄"
ws["C1"] = "分数"
# 方式2:行号列号写入
ws.cell(row=2, column=1, value="张三")
ws.cell(row=2, column=2, value=18)
ws.cell(row=2, column=3, value=88)
# 方式3:批量追加一行数据
ws.append(["李四", 19, 92])
ws.append(["王五", 18, 76])
# 保存文件到本地
wb.save("学生成绩.xlsx")
print("Excel文件创建完成!")
五、基础 2:读取已有 Excel 表格
python
运行
from openpyxl import load_workbook
# 打开Excel文件,read_only=False代表可读可写
wb = load_workbook("学生成绩.xlsx")
# 根据工作表名获取sheet
ws = wb["学生成绩表"]
# 1. 读取单个单元格
name = ws["A2"].value
score = ws["C2"].value
print(f"{name} 的分数:{score}")
# 2. 循环读取所有行数据
print("\n===== 全部学生数据 =====")
for row in ws.iter_rows(min_row=2, values_only=True):
# row = (姓名,年龄,分数)
print(f"姓名:{row[0]},年龄:{row[1]},分数:{row[2]}")
# 关闭工作簿
wb.close()
参数min_row=2:跳过第一行表头;values_only=True直接获取单元格内容,简化代码。
六、基础 3:修改表格、追加新数据
python
运行
from openpyxl import load_workbook
wb = load_workbook("学生成绩.xlsx")
ws = wb["学生成绩表"]
# 修改已有单元格数据
ws["C2"] = 95
# 新增一行学生
ws.append(["赵六", 17, 90])
# 保存覆盖原文件
wb.save("学生成绩.xlsx")
wb.close()
print("表格数据修改成功")
七、实战 1:批量统计平均分
读取表格所有学生分数,计算班级平均分并写入表格末尾
python
运行
from openpyxl import load_workbook
wb = load_workbook("学生成绩.xlsx")
ws = wb["学生成绩表"]
score_list = []
# 遍历所有学生分数
for row in ws.iter_rows(min_row=2, values_only=True):
score = row[2]
if isinstance(score, (int, float)):
score_list.append(score)
# 计算平均分
avg = sum(score_list) / len(score_list)
# 在表格最后一行写入平均分
last_row = ws.max_row + 1
ws.cell(row=last_row, column=1, value="班级平均分")
ws.cell(row=last_row, column=3, value=round(avg, 2))
wb.save("学生成绩.xlsx")
wb.close()
print(f"班级平均分:{avg:.2f},已写入表格")
八、实战 2:分数筛选,导出及格 / 不及格名单
python
运行
from openpyxl import load_workbook
wb = load_workbook("学生成绩.xlsx")
ws = wb["学生成绩表"]
pass_list = []
fail_list = []
for row in ws.iter_rows(min_row=2, values_only=True):
name, age, score = row
if score >= 60:
pass_list.append(name)
else:
fail_list.append(name)
print("及格学生:", pass_list)
print("不及格学生:", fail_list)
wb.close()
九、完整封装工具函数:一键批量写入成绩
python
运行
from openpyxl import Workbook
def create_score_excel(save_name, data_list):
"""
生成学生成绩Excel
:param save_name: 保存文件名
:param data_list: 二维列表,存放学生数据 [[姓名,年龄,分数],...]
"""
wb = Workbook()
ws = wb.active
ws.title = "成绩"
# 写入表头
ws.append(["姓名", "年龄", "分数"])
# 批量写入所有学生
for student in data_list:
ws.append(student)
wb.save(save_name)
print(f"{save_name} 创建完成,共{len(data_list)}条记录")
# 调用函数
if __name__ == "__main__":
student_data = [
["小明", 18, 93],
["小红", 18, 85],
["小周", 19, 58],
["小陈", 18, 77]
]
create_score_excel("班级成绩汇总.xlsx", student_data)
十、新手常见报错与解决
文件不存在:
FileNotFoundError,检查 Excel 文件路径、文件名打不开 xls 文件:openpyxl 仅支持 xlsx,另用 xlrd 库处理旧 xls
保存后表格空白:忘记执行
wb.save()数据修改不生效:打开文件时手动占用,关闭 Excel 再运行代码
数值计算报错:单元格内容是文字而非数字,增加类型判断
isinstance
十一、下期预告
下一篇:Python 简易文字聊天机器人完整实现,综合循环、判断、输入输出、函数做趣味交互小项目。