乐于分享
好东西不私藏

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

【从零开始学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(202411)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(120)            price = np.random.randint(10008000)            sales = quantity * price            data.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)

运行这段代码,你就能看到数据的基本情况,确认我们的数据已经准备好了。


四、第三步:数据统计分析,搞定报表核心

接下来我们做一些日常办公最常用的统计分析,比如:

  1. 各区域的总销售额

  2. 各月份的销售趋势

  3. 各产品的销售额占比

  4. 区域 – 产品的交叉统计

这些统计用 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=(106))# 画柱状图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=(106))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. 把原始数据写入Excel    df.to_excel(writer, sheet_name='原始数据', index=False)    # 2. 把统计汇总数据写入Excel    summary_data.to_excel(writer,         sheet_name='统计报表', index=False)    # 获取工作簿和工作表对象    workbook = writer.book    worksheet = writer.sheets['统计报表']    # 3. 创建柱状图    chart = workbook.add_chart({'type''column'})    # 配置图表的数据范围    # 数据是从第2行开始,第1列是区域,第2列是销售额    max_row = len(summary_data) + 1    chart.add_series({        'name':       '销售额',        'categories': ['统计报表'10, max_row, 0],         # X轴:区域名称        'values':     ['统计报表'11, 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) + 11    line_chart.add_series({        'name':       '月度销售额',        'categories': ['统计报表'110, line_max_row, 0],        'values':     ['统计报表'111, 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 文件是关闭的,不然会出现文件占用的问题。


八、总结

通过这一套流程,我们只用了几十行代码,就完成了:

  1. 自动读取 Excel 数据

  2. 自动清洗脏数据

  3. 多维度统计分析

  4. 生成多种可视化图表

  5. 自动导出完整的 Excel 报表

以后你再遇到类似的报表工作,只需要把你的原始数据文件名改一下,运行一下代码,5 分钟就能搞定,再也不用熬夜做报表了!

而且这个脚本是可以重复使用的,下个月你拿到新的销售数据,直接运行同样的代码,新的报表就自动出来了,一劳永逸。

试试效果怎么样?评论区聊聊~

🎉 同学们,看到这里,你学会了吗!

方老师说:

🚀 现在屏幕前的你已经比90%的同龄人领先一步了!

接下来可以:

  • 介绍一下pandas输出excel中复杂公式实现如何生成(下期教程教!)

  • ⚠️ 遇到问题?评论区甩截图,方老师尽量在24小时内回复

如果这篇文章对你有帮助,记得点个「推荐」,转发给还在用Excel加班的同事!

#python #Pandas #数据分析 #浩浩学编程 #职场技能