【从零开始学excel办公自动化】第二十课:告别 Excel 加班!2小时的报表工作,我用 5 分钟做完了

10年青少年编程教育经验 | 资深Python专家
前大厂技术总监 | 现编程教育创业者
专注青少年编程教育技能提升

大家好,我是浩浩学编程的方老师,这是excel办公自动化系列的第20课。
今日技能
📱 一文给大家快速掌握python处理数据生成excel的报表
前面方老师带大家学习了通过pandas来处理excel的格式问题:
【从零开始学excel办公自动化】第十八课:这个pandas输出Excel 怎么能高亮显示数据呢?方老师给这个例子你就会了
【从零开始学excel办公自动化】第十九课:别再手动给 Excel 加进度条了!10秒就能搞定
日常办公场景:一键生成销售数据可视化报表
在日常办公中,大家有没有遇到这样的场景:
手里有一份月度销售数据 Excel 表,需要统计各区域、各产品的销售情况,还要生成直观的图表给领导汇报。
如果用手动 Excel 操作,不仅要花时间做数据透视表,还要调整图表格式,重复操作又容易出错。
如果遇到那就要好好看看今天的内容,方老师就教大家用 Pandas,手把手教你如何一键完成数据处理 + 图表生成,5 分钟搞定原本要 2 小时的工作。
一、环境准备:30 秒装好需要的工具
首先我们需要安装几个 Python 库,这些都是处理 Excel 和做图表的必备工具,打开你的命令提示符(CMD)或者终端,输入下面的命令安装:
# 安装核心库pip install pandas openpyxl xlsxwriter matplotlib
解释一下这些库是做什么的:
pandas:处理表格数据的核心工具,相当于超级 Excel
openpyxl:读写 Excel 文件的引擎,支持.xlsx 格式
xlsxwriter:用来给 Excel 添加图表和高级格式
matplotlib:用来生成可视化图表
安装完成后,我们就可以开始写代码了。
二、第一步:准备你的测试数据
如果你还没有现成的销售数据,可以用下面这段代码自动生成一份模拟的销售数据 Excel,完全贴合真实办公场景:
import pandas as pdimport numpy as npfrom datetime import datetime, timedelta# 生成模拟销售数据np.random.seed(42)# 固定随机种子,保证每次生成的数据一样regions = ['华东', '华北', '华南', '西南', '西北']products = ['手机', '电脑', '平板', '耳机', '智能手表']# 生成3个月的销售数据start_date = datetime(2024, 1, 1)dates = [start_date + timedelta(days=x) for x in range(90)]data = []for date in dates:for region in regions:for product in products:# 随机生成销量和销售额quantity = np.random.randint(1, 20)price = np.random.randint(1000, 8000)sales = quantity * pricedata.append([date, region, product,quantity, sales])# 转换成DataFramedf = pd.DataFrame(data, columns=['订单日期','销售区域', '产品类别', '销售数量', '销售额'])# 保存为Excel文件df.to_excel('销售数据.xlsx', index=False)print("示例数据已生成:销售数据.xlsx")
运行这段代码,你就会得到一个名为销售数据.xlsx的文件,里面有我们需要的所有原始数据,和你平时拿到的业务数据一模一样。
三、第二步:读取 Excel 数据,做基础清洗
接下来我们读取这个 Excel 文件,先做一些基础的数据处理,把脏数据清理掉,这是做分析的基础。
import pandas as pdimport matplotlib.pyplot as plt# --------- 1. 解决中文乱码问题(必加!)--plt.rcParams['font.sans-serif'] = ['SimHei']# 用来正常显示中文标签plt.rcParams['axes.unicode_minus'] = False# 用来正常显示负号# ----------- 2. 读取Excel数据 -------df = pd.read_excel('销售数据.xlsx')# 查看数据前5行,确认数据是否正确读取print("数据前5行:")print(df.head())# 查看数据的基本信息,有没有缺失值print("\n数据基本信息:")print(df.info())# ---------------------- 3. 数据清洗 ----------------------# 把订单日期转换成标准的日期格式df['订单日期'] = pd.to_datetime(df['订单日期'])# 提取月份,方便我们按月统计df['月份'] = df['订单日期'].dt.month# 处理缺失值(如果有的话),这里我们用平均值填充销售额的空值df['销售额'] = df['销售额'].fillna(df['销售额'].mean())# 过滤异常值,比如销售额为负的错误数据df = df[df['销售额'] > 0]print("\n清洗后数据形状:", df.shape)
运行这段代码,你就能看到数据的基本情况,确认我们的数据已经准备好了。
四、第三步:数据统计分析,搞定报表核心
接下来我们做一些日常办公最常用的统计分析,比如:
-
各区域的总销售额
-
各月份的销售趋势
-
各产品的销售额占比
-
区域 – 产品的交叉统计
这些统计用 Pandas 只需要几行代码就能搞定,比 Excel 手动做透视表快 10 倍!
# 1. 各区域销售额汇总region_sales = df.groupby('销售区域')['销售额'].sum().sort_values(ascending=False)print("各区域销售额:")print(region_sales)# 2. 月度销售趋势monthly_sales = df.groupby('月份')['销售额'].sum()print("\n月度销售额:")print(monthly_sales)# 3. 各产品销售额汇总product_sales = df.groupby('产品类别')['销售额'].sum().sort_values(ascending=False)print("\n各产品销售额:")print(product_sales)# 4. 区域-产品交叉统计(相当于Excel的数据透视表)pivot_sales = pd.pivot_table(df,values='销售额',index='销售区域',columns='产品类别',aggfunc='sum')print("\n区域-产品销售透视表:")print(pivot_sales)
五、第四步:生成可视化图表,让数据更直观
统计完数据,我们就可以生成各种图表了,这些都是汇报的时候最常用的,而且代码非常简单。
5.1 各区域销售额柱状图
柱状图最适合用来对比不同区域的销售业绩,一眼就能看出哪个区域卖得最好。
# 创建画布plt.figure(figsize=(10, 6))# 画柱状图region_sales.plot(kind='bar', color='#4F81BD')# 添加标题和标签plt.title('各区域销售额对比', fontsize=14)plt.xlabel('销售区域', fontsize=12)plt.ylabel('销售额(元)', fontsize=12)# 旋转x轴标签,避免重叠plt.xticks(rotation=0)# 添加网格线,方便看数值plt.grid(axis='y', alpha=0.3)# 保存图片plt.tight_layout()plt.savefig('区域销售额柱状图.png', dpi=300, bbox_inches='tight')plt.show()
运行后你会得到什么样的图表呢,有出来的可以贴出来看看。
5.2 月度销售趋势折线图
折线图用来展示时间趋势最合适,能清晰看到每个月的销售变化,有没有淡旺季。
plt.figure(figsize=(10, 6))monthly_sales.plot(kind='line',marker='o', color='#C0504D', linewidth=2)plt.title('月度销售趋势', fontsize=14)plt.xlabel('月份', fontsize=12)plt.ylabel('销售额(元)', fontsize=12)plt.grid(alpha=0.3)plt.tight_layout()plt.savefig('月度销售趋势图.png',dpi=300, bbox_inches='tight')plt.show()
六、第五步:把图表插入 Excel,生成完整报表
做完了图表,我们肯定要把数据和图表一起放到 Excel 里,这样发给同事或者领导,他们打开 Excel 就能同时看到数据和图表,不用分开发好几个文件。
这里我们介绍两种常用的方法:
方法 1:用 XlsxWriter 直接在 Excel 里创建可编辑的图表
这种方法生成的图表是 Excel 原生的图表,拿到手之后还可以自己编辑修改,非常方便。
# 先把我们的统计数据整理好# 这里我们用区域销售额的数据来做示例summary_data = region_sales.reset_index()with pd.ExcelWriter('销售报表.xlsx', engine='xlsxwriter')as writer:# 1. 把原始数据写入Exceldf.to_excel(writer, sheet_name='原始数据', index=False)# 2. 把统计汇总数据写入Excelsummary_data.to_excel(writer,sheet_name='统计报表', index=False)# 获取工作簿和工作表对象workbook = writer.bookworksheet = writer.sheets['统计报表']# 3. 创建柱状图chart = workbook.add_chart({'type': 'column'})# 配置图表的数据范围# 数据是从第2行开始,第1列是区域,第2列是销售额max_row = len(summary_data) + 1chart.add_series({'name': '销售额','categories': ['统计报表', 1, 0, max_row, 0],# X轴:区域名称'values': ['统计报表', 1, 1, max_row, 1],# Y轴:销售额数据'fill': {'color': '#4F81BD'},})# 设置图表标题和轴标签chart.set_title({'name': '各区域销售额统计'})chart.set_x_axis({'name': '销售区域'})chart.set_y_axis({'name': '销售额(元)'})# 把图表插入到Excel的指定位置,这里是D2单元格worksheet.insert_chart('D2', chart)# 我们还可以把之前的折线图也加进去# 先写入月度数据monthly_data = monthly_sales.reset_index()monthly_data.to_excel(writer,sheet_name='统计报表', startrow=10, index=False)# 创建折线图line_chart = workbook.add_chart({'type': 'line'})line_max_row = len(monthly_data) + 11line_chart.add_series({'name': '月度销售额','categories': ['统计报表', 11, 0, line_max_row, 0],'values': ['统计报表', 11, 1, line_max_row, 1],'line': {'color': '#C0504D', 'width': 2},'marker': {'type': 'circle'},})line_chart.set_title({'name': '月度销售趋势'})line_chart.set_x_axis({'name': '月份'})line_chart.set_y_axis({'name': '销售额(元)'})# 插入折线图到D12的位置worksheet.insert_chart('D12', line_chart)print("完整报表已生成:销售报表.xlsx")
方法 2:把 Matplotlib 生成的图片插入到 Excel
如果你已经用 Matplotlib 生成了精美的图片,也可以直接把图片插入到 Excel 里,这种方法更灵活,适合复杂的自定义图表。
from openpyxl import load_workbookfrom openpyxl.drawing.image import Image# 先把数据写入Excelwith pd.ExcelWriter('带图片的报表.xlsx',engine='openpyxl') as writer:df.to_excel(writer, sheet_name='数据', index=False)# 然后加载这个Excel,插入图片wb = load_workbook('带图片的报表.xlsx')ws = wb['数据']# 插入柱状图,定位到F2单元格img1 = Image('区域销售额柱状图.png')# 可以调整图片大小img1.width = 480img1.height = 300ws.add_image(img1, 'F2')# 插入折线图,定位到F20单元格img2 = Image('月度销售趋势图.png')img2.width = 480img2.height = 300ws.add_image(img2, 'F20')# 保存文件wb.save('带图片的报表.xlsx')print("带图片的报表已生成:带图片的报表.xlsx")
最终生成的 Excel 报表效果大概是这样的:

七、初学者常见问题解决
1. 图表里的中文显示成了小方框?
这是最常见的中文乱码问题,只要在代码最开头加上这两行就可以解决:
plt.rcParams['font.sans-serif'] = ['SimHei']plt.rcParams['axes.unicode_minus'] = False
2. 运行的时候提示找不到文件?
检查一下你的 Excel 文件是不是和代码放在同一个文件夹里,或者写代码的时候用完整的文件路径,比如C:/Users/xxx/Desktop/销售数据.xlsx。
3. 文件太大,Pandas 处理不了?
如果你的 Excel 文件有几十万行,可以用分批读取的方式:
chunk_size = 10000chunks = []for chunk in pd.read_excel('大文件.xlsx',chunksize=chunk_size):# 处理每个小批次chunks.append(chunk.groupby('销售区域')['销售额'].sum())# 合并结果final_result = pd.concat(chunks).groupby(level=0).sum()
4. 生成的 Excel 文件打不开?
确保你在运行代码的时候,原来的 Excel 文件是关闭的,不然会出现文件占用的问题。
八、总结
通过这一套流程,我们只用了几十行代码,就完成了:
-
自动读取 Excel 数据
-
自动清洗脏数据
-
多维度统计分析
-
生成多种可视化图表
-
自动导出完整的 Excel 报表
以后你再遇到类似的报表工作,只需要把你的原始数据文件名改一下,运行一下代码,5 分钟就能搞定,再也不用熬夜做报表了!
而且这个脚本是可以重复使用的,下个月你拿到新的销售数据,直接运行同样的代码,新的报表就自动出来了,一劳永逸。
试试效果怎么样?评论区聊聊~
🎉 同学们,看到这里,你学会了吗!
方老师说: 🚀 现在屏幕前的你已经比90%的同龄人领先一步了!
接下来可以:
介绍一下pandas输出excel中复杂公式实现如何生成(下期教程教!)
⚠️ 遇到问题?评论区甩截图,方老师尽量在24小时内回复!
如果这篇文章对你有帮助,记得点个「推荐」,转发给还在用Excel加班的同事!
夜雨聆风
