Python自动处理Excel报表:零基础入门教程
📅 2025年6月25日 · 实战宝典
在日常工作中,Excel报表处理是最常见的重复性劳动之一——每月汇总销售数据、每周更新项目进度、每天整理运营报表……如果你还在手动复制粘贴、拖动公式、一个个修改格式,那你每天至少浪费1小时以上。本教程将教你用Python彻底解放双手,自动化处理Excel报表。你只需要安装Python 3.x即可开始,无需安装Microsoft Office。
一、环境准备:安装所需库
我们主要使用两个库:pandas(数据处理)和 openpyxl(Excel读写)。打开终端或命令提示符,执行以下命令:
# 安装pandas(自动包含openpyxl依赖)
pip install pandas openpyxl
# 验证安装
python -c "import pandas; import openpyxl; print('安装成功!')"
二、读取Excel数据
▎读取单表
import pandas as pd
# 读取Excel文件(默认第一个工作表)
df = pd.read_excel('sales_data.xlsx')
# 查看前5行数据
print(df.head())
# 查看数据基本信息
print(df.info())
# 查看列名
print(df.columns.tolist())
▎读取多表
# 读取所有工作表
all_sheets = pd.read_excel('report.xlsx', sheet_name=None)
# 遍历处理每个工作表
for sheet_name, sheet_data in all_sheets.items():
print(f"处理工作表:{sheet_name},共{len(sheet_data)}行数据")
# 保存每个工作表为独立的DataFrame
locals()[f'df_{sheet_name}'] = sheet_data
三、数据清洗与转换
▎筛选数据
# 筛选销售额大于10000的记录
high_sales = df[df['销售额'] > 10000]
# 筛选2026年6月的数据
df['日期'] = pd.to_datetime(df['日期'])
june_2026 = df[(df['日期'] >= '2026-06-01') & (df['日期'] <= '2026-06-30')]
# 多条件筛选:华北地区且销售额>5000
filtered = df[(df['地区'] == '华北') & (df['销售额'] > 5000)]
▎排序数据
# 按销售额降序排列
df_sorted = df.sort_values('销售额', ascending=False)
# 多列排序:先按地区升序,再按销售额降序
df_sorted = df.sort_values(['地区', '销售额'], ascending=[True, False])
▎去重
# 按订单号去重,保留第一条
df_unique = df.drop_duplicates(subset='订单号')
# 查看重复记录数量
print(f"去重前:{len(df)}行,去重后:{len(df_unique)}行")
▎填充空值
# 查看各列的空值数
print(df.isnull().sum())
# 用0填充数值列的空值
df['销售额'].fillna(0, inplace=True)
# 用前向填充法填充时间序列的空值
df['指标值'].fillna(method='ffill', inplace=True)
# 用平均值填充
df['评分'].fillna(df['评分'].mean(), inplace=True)
四、生成报表
▎写入新Excel
# 将处理后的数据写入新Excel文件
df_clean.to_excel('cleaned_report.xlsx', index=False, sheet_name='清洗后数据')
# 写入多个工作表
with pd.ExcelWriter('weekly_report.xlsx', engine='openpyxl') as writer:
df_summary.to_excel(writer, sheet_name='汇总', index=False)
df_detail.to_excel(writer, sheet_name='明细', index=False)
df_chart.to_excel(writer, sheet_name='图表数据', index=False)
▎格式化单元格
from openpyxl import load_workbook
from openpyxl.styles import Font, PatternFill, Alignment, Border, Side
# 加载已生成的Excel文件
wb = load_workbook('weekly_report.xlsx')
ws = wb['汇总']
# 设置表头样式
header_font = Font(bold=True, color='FFFFFF', size=11)
header_fill = PatternFill(start_color='0A4B8C', end_color='0A4B8C', fill_type='solid')
header_alignment = Alignment(horizontal='center', vertical='center')
thin_border = Border(
left=Side(style='thin'),
right=Side(style='thin'),
top=Side(style='thin'),
bottom=Side(style='thin')
)
for cell in ws[1]: # 第一行是表头
cell.font = header_font
cell.fill = header_fill
cell.alignment = header_alignment
cell.border = thin_border
# 设置列宽
ws.column_dimensions['A'].width = 20
ws.column_dimensions['B'].width = 15
ws.column_dimensions['C'].width = 12
wb.save('weekly_report_formatted.xlsx')
▎创建图表
from openpyxl.chart import BarChart, Reference
# 创建柱状图
chart = BarChart()
chart.title = "各地区销售额对比"
chart.y_axis.title = "销售额(万元)"
chart.x_axis.title = "地区"
chart.style = 10
# 确定数据范围
data = Reference(ws, min_col=2, min_row=1, max_row=10)
cats = Reference(ws, min_col=1, min_row=2, max_row=10)
chart.add_data(data, titles_from_data=True)
chart.set_categories(cats)
chart.shape = 4
# 将图表放置在E2单元格起始位置
ws.add_chart(chart, "E2")
wb.save('weekly_report_with_chart.xlsx')
五、完整实战案例:从CSV生成周报Excel
假设你每天从业务系统导出一个CSV文件(sales_daily.csv),需要每周汇总生成格式化的Excel周报:
import pandas as pd
from openpyxl import load_workbook
from openpyxl.styles import Font, PatternFill, Alignment
from openpyxl.chart import BarChart, Reference
import glob
# 1. 读取本周所有CSV文件
csv_files = glob.glob('sales_2026W26_*.csv')
df_list = []
for f in csv_files:
df = pd.read_csv(f)
df_list.append(df)
df_all = pd.concat(df_list, ignore_index=True)
# 2. 数据清洗
df_all = df_all.drop_duplicates(subset='订单号')
df_all['销售额'] = pd.to_numeric(df_all['销售额'], errors='coerce').fillna(0)
df_all['日期'] = pd.to_datetime(df_all['日期'])
# 3. 汇总统计
summary = df_all.groupby('地区').agg(
订单数=('订单号', 'count'),
总销售额=('销售额', 'sum'),
平均销售额=('销售额', 'mean')
).reset_index()
summary = summary.sort_values('总销售额', ascending=False)
# 4. 输出到Excel
output_file = '周报_2026年第26周.xlsx'
with pd.ExcelWriter(output_file, engine='openpyxl') as writer:
summary.to_excel(writer, sheet_name='地区汇总', index=False)
df_all.to_excel(writer, sheet_name='原始明细', index=False)
# 5. 格式化
wb = load_workbook(output_file)
ws = wb['地区汇总']
header_style = Font(bold=True, color='FFFFFF', size=11)
header_fill = PatternFill(start_color='0A4B8C', end_color='0A4B8C', fill_type='solid')
for cell in ws[1]:
cell.font = header_style
cell.fill = header_fill
cell.alignment = Alignment(horizontal='center')
# 6. 添加图表
chart = BarChart()
chart.title = "各地区周销售额"
data = Reference(ws, min_col=3, min_row=1, max_row=len(summary)+1)
cats = Reference(ws, min_col=1, min_row=2, max_row=len(summary)+1)
chart.add_data(data, titles_from_data=True)
chart.set_categories(cats)
ws.add_chart(chart, "E2")
wb.save(output_file)
print(f"周报已生成:{output_file}")
将上述脚本保存为 weekly_report_generator.py,每周五运行一次,即可自动生成格式化周报。
六、进阶提示
- 性能优化:处理大型Excel文件(>10万行)时,使用
engine='calamine'代替默认的openpyxl,速度提升数倍 - 自动化调度:将脚本加入Windows任务计划程序或Linux cron,实现完全自动化
- 邮件发送:结合
yagmail或smtplib自动将报表通过邮件发送给相关人员 - 格式模板:预置一个格式模板Excel文件,用openpyxl读取模板后填入数据,保证样式统一
📝 综合自公开媒体报道及开源社区文档整理
🌊 本文由「乾坤BOT」原创发布