摘要:还在手动复制粘贴合并几十个Excel表格?还在为每天重复的日报、周报头秃?本文将带你通过一个真实的Python实战案例,利用
Pandas和Matplotlib库,实现多文件自动读取、数据清洗、合并汇总以及生成可视化报表。让代码帮你工作,按时下班!
🔍 实战背景
作为一名“打工人”,我们经常会遇到这样的场景:
每个月都要从各个部门收集销售数据(例如
sales_jan.xlsx,sales_feb.xlsx...)。需要手动将这些表格合并到一个总表中。
根据总表数据,计算每个产品的销售总额。
画出柱状图,贴到PPT里汇报。
如果只有两三个文件还好,但如果有几十个文件,或者每天都要做一次,手动处理不仅效率低,还容易出错。今天,我们就用不到50行Python代码彻底解决这个问题。
🛠️ 环境准备
在开始之前,请确保你的Python环境中安装了以下核心库。如果没有安装,请在终端(Terminal/CMD)执行以下命令:
pip install pandas matplotlib openpyxlPandas: Python数据分析的神器,处理表格数据的首选。
Matplotlib: 最经典的绘图库,用于生成可视化图表。
Openpyxl: Pandas读取/写入Excel文件即需要依赖的引擎。
💻 代码实战步骤
我们将整个流程分为三个模块:数据构造(模拟环境)、数据合并与清洗、数据可视化。
1. 模拟数据(如果你已有数据可跳过)
为了演示方便,我们先写一段脚本,在当前目录下生成3个模拟的月度销售Excel文件。
import pandas as pd import random # 创建模拟数据的函数 def create_dummy_data(): products = ['键盘', '鼠标', '显示器', '显卡', '硬盘'] months = ['1月', '2月', '3月'] for month in months: data = { '产品名称': [random.choice(products) for _ in range(20)], '销售数量': [random.randint(1, 10) for _ in range(20)], '单价': [random.randint(100, 3000) for _ in range(20)], '月份': [month] * 20 } df = pd.DataFrame(data) # 计算销售额 df['销售额'] = df['销售数量'] * df['单价'] # 保存为Excel file_name = f'销售数据_{month}.xlsx' df.to_excel(file_name, index=False) print(f"✅ 已生成模拟文件: {file_name}") if __name__ == '__main__': create_dummy_data()2. 核心逻辑:批量合并与分析
这是本文的重头戏。我们将使用glob模块查找文件,用pandas进行合并。
import pandas as pd import glob import os import matplotlib.pyplot as plt # 设置matplotlib支持中文显示(根据系统不同可能需要调整字体) plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签 plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号 def process_sales_data(): # 1. 获取所有销售数据文件 # 假设文件都以 "销售数据_" 开头 file_list = glob.glob('销售数据_*.xlsx') if not file_list: print("❌ 未找到相关Excel文件,请检查路径。") return print(f"📂 发现 {len(file_list)} 个文件,准备合并...") # 2. 循环读取并合并 all_data = [] for file in file_list: try: df = pd.read_excel(file) all_data.append(df) except Exception as e: print(f"⚠️ 读取 {file} 失败: {e}") # 使用 concat 合并所有 DataFrame merged_df = pd.concat(all_data, ignore_index=True) print(f"📊 合并完成!总数据行数: {len(merged_df)}") # 3. 数据分析:按产品汇总销售额 # group by '产品名称', sum '销售额' summary = merged_df.groupby('产品名称')['销售额'].sum().sort_values(ascending=False) print("\n--- 销售排行榜 (Top 5) ---") print(summary.head()) return summary, merged_df # 执行处理 summary_data, raw_data = process_sales_data()3. 数据可视化:一键生成报表图
有了处理好的summary_data,我们可以直接画图并保存。
def visualize_data(data): # 创建画布 plt.figure(figsize=(10, 6)) # 绘制柱状图 # data.index 是产品名称, data.values 是销售总额 bars = plt.bar(data.index, data.values, color='skyblue', edgecolor='blue') # 添加标题和标签 plt.title('第一季度各产品销售总额统计', fontsize=16) plt.xlabel('产品名称', fontsize=12) plt.ylabel('销售额 (元)', fontsize=12) # 在柱状图上方添加具体数值标签 for bar in bars: height = bar.get_height() plt.text(bar.get_x() + bar.get_width() / 2, height, f'{int(height)}', ha='center', va='bottom') plt.grid(axis='y', linestyle='--', alpha=0.7) # 保存图片 plt.savefig('销售分析报表.png') print("📈 图表已保存为 '销售分析报表.png'") # 显示图表 plt.show() # 调用绘图函数 if summary_data is not None: visualize_data(summary_data)🚀 进阶技巧:如何让代码更强?
虽然上面的代码已经能解决大问题,但在实际工作中,你还可以尝试以下优化:
异常处理:如果在读取Excel时遇到格式错误的文件,使用
try-except跳过,防止程序崩溃(代码中已包含基础演示)。自动发送邮件:结合 Python 的
smtplib库,生成报表后直接自动发送邮件给老板。定时任务:如果是每天固定的日报,可以使用 Windows 的“任务计划程序”或 Linux 的
Crontab,让脚本每天早上9点自动运行。
📝 总结
通过这个案例,我们不仅复习了 Pandas 的读取 (read_excel)、合并 (concat) 和分组聚合 (groupby) 操作,还实践了 Matplotlib 的绘图功能。
**Python 的魅力在于:一次编写,无限次复用。**哪怕你今天只节省了10分钟,一年下来也是几十个小时的自由时间!
如果你对代码有任何疑问,或者想了解如何将结果导出为精美的 HTML 报表,欢迎在评论区留言交流!👇