告别重复劳动,把时间还给思考
小张是公司里做运营分析,每个月都要把销售数据整理成报表,给老板做汇报。以前他都是手动在Excel里点来点去,选数据范围、插入柱状图、调颜色、改字体,一套操作下来至少半小时。
碰上数据更新频繁的日子,他得重复做三四遍同样的操作,烦到想摔鼠标。
有一天他跑来问我:“有没有办法让Excel自动处理这些?我每次数据格式都一样,就是数值变了。”
我说:“用Python,写一次脚本,以后一键生成。”
他眼睛亮了。
今天,我们就把这套方法彻底拆开,手把手教你用Python让Excel“飞起来”。
为什么是Python?
很多人会问:Excel自带的VBA不是也能自动化吗?
Python确实有它不可替代的优势:
· 跨平台:Windows、Mac、Linux通吃,不挑系统· 生态丰富:Openpyxl、Pandas、XlsxWriter等库覆盖从读写到分析的全场景· 无缝扩展:处理完的数据可以一键接上数据库、Web服务甚至AI模型· 可维护性强:代码清晰、易于调试,改了参数就能复用
你可以先不用纠结哪个库最好,真正重要的是——先让一个能跑的脚本跑起来。
准备工作:装好这3个库就够了
打开命令行,执行下面这一行命令:
pip install openpyxl pandas matplotlib
💡 小贴士:建议用python -m pip install openpyxl,确保模块装到了你当前使用的Python环境中,避免“装了但脚本找不到”的情况。
各司其职:
· openpyxl:Excel文件的读、写、格式调整,负责精确保留样式和公式· pandas:数据分析的“瑞士军刀”,处理表格数据极快· matplotlib:画图担当,几乎能画出你想要的所有图表
如果你习惯用Jupyter Notebook写代码,那更好——每一步都能看到数据长什么样,调试起来一目了然。
四大核心库:什么时候用哪个?
Python处理Excel有好几个库,简单了解它们的特点,就知道该用谁:
库 擅长做的事 什么时候用openpyxl 读写.xlsx,支持样式、公式、图表、单元格精细控制 报表生成、格式美化、保留原模板结构pandas 批量数据清洗、分组统计、合并拆分、数据分析 大数据量(10万行以上)、需要快速计算xlsxwriter 高性能写入、高级图表生成 只写不读、打造专业仪表盘xlwings 调用Excel原生程序、执行宏、交互操作 需保留VBA功能或操作打开的Excel窗口
⚡ 性能实测:处理10万行数据,openpyxl逐行读取约47分钟,而pandas只需要23秒。选对工具,效率立竿见影。
基础操作:从第一行代码开始
创建新Excel文件并写入数据
1from openpyxl import Workbook 2 3# 1. 创建一个工作簿 4wb = Workbook() 5 6# 2. 获取当前活动的工作表,并给它改个名字 7ws = wb.active 8ws.title = "销售数据" 910# 3. 写入表头11ws["A1"] = "产品名称"12ws["B1"] = "销量(件)"13ws["C1"] = "销售额(元)"1415# 4. 批量写入数据(append会自动换行)16ws.append(["手机", 500, 250000])17ws.append(["平板", 300, 120000])18ws.append(["耳机", 1000, 99000])1920# 5. 保存文件21wb.save("销售报表.xlsx")读取已有Excel文件
1from openpyxl import load_workbook 2 3# 加载已有的Excel文件 4wb = load_workbook("销售报表.xlsx") 5ws = wb.active 6 7# 读取A1单元格的值 8print(ws["A1"].value) # 输出:产品名称 910# 按行遍历整个表(跳过表头)11for row in ws.iter_rows(min_row=2, values_only=True):12 print(f"产品:{row[0]},销量:{row[1]}")核心要点:
· 创建用Workbook(),读取用load_workbook()· 单元格赋值:ws["A1"] = "内容"是最直接的写法· 整行追加:ws.append()会自动换行· 批量遍历:推荐用iter_rows(),内存友好且代码简洁
样式设置:让报表看起来更专业
数据有了,但表格光秃秃的不够专业。来看看怎么给Excel加上格式:
1from openpyxl import Workbook 2from openpyxl.styles import Font, PatternFill, Alignment 3 4wb = Workbook() 5ws = wb.active 6ws.title = "销售数据" 7 8# 先写入表头 9ws["A1"] = "产品名称"10ws["B1"] = "销量(件)"11ws["C1"] = "销售额(元)"1213# 定义标题样式14title_font = Font(name="微软雅黑", bold=True, size=12)15title_fill = PatternFill(start_color="4CAF50", end_color="4CAF50", fill_type="solid")16title_alignment = Alignment(horizontal="center", vertical="center")1718# 应用到表头(第1行)19for cell in ws[1]:20 cell.font = title_font21 cell.fill = title_fill22 cell.alignment = title_alignment2324# 写入数据(后面接着写)25data = [["手机", 500, 250000], ["平板", 300, 120000], ["耳机", 1000, 99000]]26for row in data:27 ws.append(row)2829# 调整列宽30ws.column_dimensions["A"].width = 1531ws.column_dimensions["B"].width = 1232ws.column_dimensions["C"].width = 153334wb.save("销售报表_美化版.xlsx")样式设置速查:
· Font:控制字体、是否加粗、字号· PatternFill:填充背景色,start_color是六位十六进制颜色值· Alignment:水平/垂直对齐方式· 列宽设置:ws.column_dimensions["A"].width = 20
数据分析:用pandas批量处理数据
如果Excel里已经有成百上千行数据需要汇总分析,用pandas会更高效。pandas的数据结构叫DataFrame,你可以把它理解成一个超级强大的数据表,支持各种筛选、排序、分组操作。
读取、清洗、汇总一条龙
1import pandas as pd 2 3# 读取Excel文件 4df = pd.read_excel("销售记录.xlsx") 5 6# 看一眼前5行数据,确认格式 7print(df.head()) 8 9# 数据清洗四连10df_clean = (df11 .drop_duplicates() # 删除重复行12 .dropna(subset=["客户名称"]) # 删除客户名称为空的记录13 .assign(月=df["日期"].dt.month) # 从日期提取月份14)1516# 按区域汇总销售额(这才是数据分析的精髓)17area_summary = df_clean.groupby("区域")["销售额"].sum().reset_index()18print(area_summary)1920# 输出汇总结果到新的Excel文件21area_summary.to_excel("区域销售汇总.xlsx", index=False)一行读取、几行处理,几百行的Excel几秒钟跑完。
图表生成:一键插入柱状图
数据整理好了,还需要一张直观的图表来呈现趋势。
pandas + matplotlib画图,并嵌入Excel
1import pandas as pd 2import matplotlib.pyplot as plt 3from openpyxl import load_workbook 4from openpyxl.drawing.image import Image 5 6# 1. 读取数据并处理 7df = pd.read_excel("销售汇总.xlsx") 8df.plot(x="月份", y=["产品A", "产品B"], kind="bar", figsize=(8, 5)) 9plt.title("各产品月度销售对比")10plt.xlabel("月份")11plt.ylabel("销售额(万元)")12plt.tight_layout()13plt.savefig("销售图表.png") # 先保存图片1415# 2. 把图片插入到Excel报表中16wb = load_workbook("销售报表.xlsx")17ws = wb.active18img = Image("销售图表.png")19img.width = 50020img.height = 30021ws.add_image(img, "E2") # 放在E2单元格位置22wb.save("销售报表_带图表.xlsx")如果想直接在Excel内部创建可动态更新的图表(柱状图、折线图等),也可以用openpyxl的chart模块。关键就是用Reference指定数据范围,然后add_chart()插入到指定位置。
进阶技巧:批量处理多文件
真实工作中,经常会遇到需要合并多个Excel文件的情况。下面是完整的实战代码:
1import pandas as pd 2import glob 3 4# 读取指定文件夹下所有Excel文件 5file_list = glob.glob("部门报表/*.xlsx") 6all_data = [pd.read_excel(file) for file in file_list] 7 8# 合并所有数据 9merged_df = pd.concat(all_data, ignore_index=True)1011# 去重、补空、过滤负值12cleaned = (merged_df13 .drop_duplicates()14 .assign(销售额=lambda x: x["销售额"].fillna(0))15 .query("销售额 >= 0")16)1718# 输出合并后的总表19cleaned.to_excel("总报表.xlsx", index=False)这个脚本会读取部门报表文件夹下的所有Excel文件,自动合并、清洗后输出一份总报表。
1# 合并之后,再按条件拆分成多个工作表2with pd.ExcelWriter("按区域拆分.xlsx") as writer:3for region, group in cleaned.groupby("区域"):4 group.to_excel(writer, sheet_name=region, index=False)这个代码会按“区域”列拆分成多个工作表,同一个区域的数据放进同一个sheet中。
高分秘笈:告别逐行遍历
写Python操作Excel时,新手容易犯的一个错误是逐行逐格地循环处理。这在数据量小时没问题,但一旦数据量大起来,速度会慢到你怀疑人生。
❌ 低效写法(逐行循环):
1for i in range(len(df)):2if df.loc[i, "Value"] > 100:3 df.loc[i, "Flag"] = 1✅ 高效写法(向量化):
1df["Flag"] = np.where(df["Value"] > 100, 1, 0)向量化是pandas的核心优势,直接用内置方法操作整列,远快于逐行循环。
实战场景选库速查
面对不同的需求场景,按这个指引选择最合适的库:
你想要实现的功能 首选方案 备选/补充创建并写入Excel openpyxl xlsxwriter读取Excel并保留样式 openpyxl xlrd合并几十个Excel文件 pandas —对海量数据进行汇总统计 pandas —生成带格式、公式的专业报表 openpyxl xlsxwriter在Excel中插入动态柱状图/折线图 openpyxl.chart matplotlib + 嵌入图片需要操作正在运行的Excel软件 xlwings —处理超大文件(100万行以上) pandas + 分块读取 openpyxl read_only模式兼容.xls旧文件 xlrd/xlwt —
原则很简单:数据层面的事交给pandas,页面排版和精确格式交给openpyxl。
最后的小建议
学习Python处理Excel,初学者最容易进入的误区是:装了一堆库、看了一堆概念,但迟迟没有跑通过一个真正能生成Excel文件的脚本。这样学下去会很虚,因为你不知道自己的Python、模块、路径到底有没有打通。
真正有效的方法是:
- 先跑通一个最小脚本,确认Python能稳定读写Excel
- 逐步增加功能:读取、筛选、汇总、格式化、批量处理
- 遇到问题分步排查:先确认环境和路径正常,再检查代码逻辑
把今天文章里的第一个“创建Excel”脚本跑通——你的Python自动化大门,就在那一刻真正打开了。
希望这篇文章对你有帮助。如果实践过程中遇到问题,欢迎在评论区留言交流。
如果你觉得有用,记得点个“分享”,分享给同样被Excel折磨的同事朋友。
你的时间,值得花在更有价值的事情上。
夜雨聆风