很多日常办公场景都会遇到 excel:整理销售数据、统计考勤、合并表格、批量改格式、给领导生成周报。如果每次都靠手动复制、筛选、改颜色,效率会很低,也容易出错。
openpyxl 是 python 里非常常用的 excel 处理库,适合操作 .xlsx 文件。本文用一份完整演示代码,带大家学会三个高频动作:
- 生成 excel 文件
- 读取 excel 内容
- 修改已有 excel 文件
适合刚开始学习 python、也想提升 excel 办公效率的小伙伴。
一、安装 openpyxl
先在命令行安装:
pip install openpyxl
如果你使用的是多个 python 版本,也可以这样安装:
python -m pip install openpyxl
二、完整演示代码
下面这段代码会完成一个完整流程:
- 生成一份
student_score.xlsx - 写入学生成绩数据
- 设置标题、表头、列宽、颜色、冻结窗格
- 读取 excel 并打印每一行
- 修改 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 时,不建议一开始就追求复杂功能。可以按下面顺序练习:
- 先会新建 excel、写入几行数据
- 再学读取已有 excel
- 再学修改单元格内容
- 然后学习样式、列宽、冻结窗格、筛选
- 最后结合真实工作表,把重复操作写成脚本
python 办公自动化的价值,不在于写出多复杂的代码,而在于把每天重复 30 分钟的事情,变成一个 3 秒钟执行完成的脚本。
七、总结
本文用一份完整代码演示了如何用 openpyxl 完成 excel 的生成、读取和修改。你可以把这个脚本当成模板,换成自己的业务字段,例如员工信息、订单数据、考勤记录、销售统计等。
掌握这些基础之后,再继续学习公式、图表、多文件合并、批量报表生成,python 处理 excel 的效率会非常明显。
以上就是python使用openpyxl生成、读取、修改excel的详细内容,更多关于python openpyxl操作excel的资料请关注代码网其它相关文章!
发表评论