这是本章的最终章。
前面我们学了数据清洗、分析、可视化,现在把这些技能串起来,打造一个完整的自动化报表生成系统。
这篇文章是一个项目实战。读完全文,你会得到一个可以拿到公司直接用的自动化工具。
👇 看完本文你能学到什么?
1. 从需求分析到完整代码实现
2. 涵盖数据处理、分析、可视化的全流程
3. 最终交付一个可复用的自动化系统
💡 文末有彩蛋:全部代码开源,公众号回复「系统」获取完整项目
项目背景
假设你在一家中型电商公司做数据分析师。每周一早上,你要给老板交一份上周的销售分析报告:
• 销售额趋势图
• 各品类销售占比
• TOP10商品排行
• 各渠道表现对比
• 异常订单标记
每次手动做要花2-3小时。今天,我们把它自动化——以后点一下按钮,报告自动生成。
一、系统架构设计
整个系统分四个模块:
自动化报表系统 ├── 1. 数据加载模块 → 读取原始数据,统一格式 ├── 2. 数据清洗模块 → 处理空值、异常、重复 ├── 3. 数据分析模块 → 计算各项指标 ├── 4. 报表生成模块 → 生成格式化的Excel报告每个模块是一个独立的函数,方便维护和复用。
二、完整代码实现
模块1:数据加载
import pandas as pd import os from datetime import datetime def load_data(file_path): '''加载原始数据,返回标准化的DataFrame''' df = pd.read_excel(file_path) # 字段名标准化 df.columns = df.columns.str.strip() # 日期列标准化 date_cols = [col for col in df.columns if '日期' in col or '时间' in col or 'date' in col.lower()] for col in date_cols: df[col] = pd.to_datetime(df[col]) print(f"[加载] {os.path.basename(file_path)}: {len(df)}行, {len(df.columns)}列") return df模块2:数据清洗
def clean_sales_data(df): '''清洗销售数据''' df = df.copy() initial_rows = len(df) # 去重 df = df.drop_duplicates() # 处理空值 df['客户'] = df['客户'].fillna('未知') df['金额'] = df['金额'].fillna(0) # 异常金额处理 q1, q3 = df['金额'].quantile([0.01, 0.99]) df['金额'] = df['金额'].clip(lower=q1, upper=q3) # 标记渠道 df['渠道'] = df['渠道'].str.strip().str.upper() channel_map = {'TB': '淘宝', 'JD': '京东', 'PDD': '拼多多'} df['渠道名称'] = df['渠道'].map(channel_map).fillna(df['渠道']) removed = initial_rows - len(df) print(f"[清洗] 删除{removed}行, 剩余{len(df)}行") return df模块3:数据分析
def analyze_sales(df): '''分析销售数据,返回各项指标''' results = {} # 按日期统计 daily = df.groupby(df['日期'].dt.date)['金额'].agg(['sum', 'count']) daily.columns = ['日销售额', '订单数'] results['日统计'] = daily # 按渠道统计 channel = df.groupby('渠道名称')['金额'].agg(['sum', 'mean', 'count']) channel.columns = ['渠道总额', '客单价', '订单数'] results['渠道统计'] = channel # TOP10商品 top10 = df.groupby('商品')['金额'].sum().nlargest(10) results['TOP10商品'] = top10 # 周趋势 df['周'] = df['日期'].dt.isocalendar().week weekly = df.groupby('周')['金额'].sum() results['周趋势'] = weekly print(f"[分析] 完成4项统计分析") return results模块4:报表生成
from openpyxl import Workbook from openpyxl.styles import Font, PatternFill, Alignment, Border, Side from openpyxl.utils import get_column_letter def generate_report(results, output_path='销售报告.xlsx'): '''生成格式化的Excel报告''' wb = Workbook() # 样式定义 title_font = Font(name='微软雅黑', size=16, bold=True, color='1F4E79') header_font = Font(name='微软雅黑', size=11, bold=True, color='FFFFFF') header_fill = PatternFill(start_color='1F4E79', end_color='1F4E79', fill_type='solid') thin_border = Border( left=Side(style='thin'), right=Side(style='thin'), top=Side(style='thin'), bottom=Side(style='thin') ) # ================== Sheet1: 概览 ================== ws = wb.active ws.title = '销售概览' ws['A1'] = f'周度销售报告 ({datetime.now().strftime("%Y-%m-%d")})' ws['A1'].font = title_font ws.merge_cells('A1:F1') # ================== Sheet2: 日统计 ================== ws2 = wb.create_sheet('每日统计') results['日统计'].to_excel('日统计_temp.xlsx') # 写入并格式化 ws2.append(['日期', '日销售额', '订单数']) for cell in ws2[1]: cell.font = header_font cell.fill = header_fill cell.border = thin_border for date, row in results['日统计'].iterrows(): ws2.append([str(date), round(row['日销售额'], 2), int(row['订单数'])]) # 自动列宽 for col in ws2.columns: max_len = max(len(str(cell.value or '')) for cell in col) ws2.column_dimensions[get_column_letter(col[0].column)].width = max_len + 4 # ================== Sheet3: 渠道分析 ================== ws3 = wb.create_sheet('渠道分析') ws3.append(['渠道', '销售总额', '客单价', '订单数']) for cell in ws3[1]: cell.font = header_font cell.fill = header_fill for channel, row in results['渠道统计'].iterrows(): ws3.append([channel, round(row['渠道总额'], 2), round(row['客单价'], 2), int(row['订单数'])]) # ================== Sheet4: TOP10商品 ================== ws4 = wb.create_sheet('TOP10商品') ws4.append(['排名', '商品', '销售额']) for cell in ws4[1]: cell.font = header_font cell.fill = header_fill for i, (product, amount) in enumerate(results['TOP10商品'].items(), 1): ws4.append([i, product, round(amount, 2)]) wb.save(output_path) print(f"[报表] 已保存至: {output_path}") # ================== 主函数 ================== def main(): print("=" * 50) print("自动化销售报表生成系统") print("=" * 50) df = load_data('原始销售数据.xlsx') df = clean_sales_data(df) results = analyze_sales(df) generate_report(results) print("\n[完成] 全部任务执行完毕!") if __name__ == '__main__': main()三、效果展示
运行后,你会得到一个包含4个Sheet的Excel文件:
销售概览:报告标题和摘要信息
每日统计:每天的销售额和订单数
渠道分析:各渠道的销售总额、客单价、订单数
TOP10商品:销售额最高的10个商品排名
每个Sheet都有专业格式:蓝色标题行、自动列宽、灰色边框。
四、扩展建议
这个系统可以继续扩展:
• 加入matplotlib图表,生成可视化仪表板
• 接入数据库,直接读MySQL而不是Excel
• 用Windows任务计划程序设置每周一自动运行
• 报告生成后自动发送钉钉/邮件通知
今日小结
这个项目是本章全部知识的综合应用。回顾一下我们做了什么:
1. 数据加载:pandas读取Excel,字段标准化
2. 数据清洗:去重、处理空值、异常值裁剪、渠道映射
3. 数据分析:分组统计、TOP排名、周趋势
4. 报表生成:openpyxl多Sheet写入、格式化、自动列宽
这四个模块可以复用到任何数据分析项目中。
项目获取
完整代码打包好了,公众号回复「报表系统」获取:
• 完整Python源代码
• 示例数据文件
• 使用说明文档
• 可直接运行,改个文件路径就能用
有任何问题,评论区见!
📌 往期精选:
👉 数据验证与条件格式:让Excel自动标记异常数据
🔔 关注公众号,回复「自动化」领取:自动化学习手册
(点击公众号底部菜单 → 领取资料)
夜雨聆风