查看: 379|回复: 3

Python+Excel自动化报表:数据透视表、条件格式与图表集成实战

[复制链接]
发表于 昨天 11:00 | 显示全部楼层 |阅读模式
在日常数据处理工作中,经常需要从原始Excel数据生成带有透视分析、条件高亮和可视化图表的报表。如果手动操作Excel完成这些步骤,不仅耗时而且容易出错。本文基于Python的pandas和openpyxl库,提供一个完整的自动化流程:从数据读取、透视表生成、样式美化、条件格式设置,到柱状图、折线图、饼图嵌入,最后封装成批量处理和自动月报函数,实现真正的“一键生成”。

一、环境准备
首先安装必要的Python库:
  1. pip install pandas openpyxl
复制代码
pandas负责数据聚合和透视表计算,openpyxl则处理Excel的样式、条件格式和图表功能。

二、数据透视表生成
假设有一张“销售数据.xlsx”,包含日期、城市、销售员、品类、销售额等字段。利用pandas的pivot_table可以快速生成汇总表。

示例代码:
  1. import pandas as pd
  2. df = pd.read_excel("销售数据.xlsx")
  3. print(df.head())
  4. #   日期      城市  销售员  品类   销售额
  5. # 0 2026-01  北京  张三  手机  12000
  6. # 1 2026-01  上海  李四  手机  15000
  7. # 2 2026-01  北京  王五  电脑  18000
  8. pivot = pd.pivot_table(
  9.     df,
  10.     values="销售额",
  11.     index="城市",
  12.     columns="品类",
  13.     aggfunc="sum",
  14.     fill_value=0,
  15.     margins=True,
  16.     margins_name="合计"
  17. )
  18. print(pivot)
  19. # 品类    电脑    手机    合计
  20. # 城市
  21. # 北京  45000  32000  77000
  22. # 上海  38000  41000  79000
  23. # 合计  83000  73000  156000
复制代码
如果希望行索引多级展示(如城市→销售员),只需将index参数改为列表:
  1. pivot = pd.pivot_table(
  2.     df,
  3.     values="销售额",
  4.     index=["城市", "销售员"],
  5.     columns="品类",
  6.     aggfunc="sum",
  7.     fill_value=0
  8. )
复制代码

三、导出透视表到Excel并美化
使用pd.ExcelWriter可以将多个DataFrame写入同一工作簿的不同工作表。随后用openpyxl加载并设置样式。

写入与加载:
  1. with pd.ExcelWriter("销售报表.xlsx", engine="openpyxl") as writer:
  2.     df.to_excel(writer, sheet_name="原始数据", index=False)
  3.     pivot.to_excel(writer, sheet_name="品类分析")
  4. from openpyxl import load_workbook
  5. from openpyxl.styles import Font, PatternFill, Alignment
  6. wb = load_workbook("销售报表.xlsx")
复制代码

样式美化(表头加粗蓝底白字、数据行居中、自动列宽):
  1. for sheet_name in wb.sheetnames:
  2.     ws = wb[sheet_name]
  3.     header_font = Font(bold=True, color="FFFFFF", size=11)
  4.     header_fill = PatternFill(start_color="4472C4", end_color="4472C4", fill_type="solid")
  5.     header_align = Alignment(horizontal="center", vertical="center")
  6.     for cell in ws[1]:
  7.         cell.font = header_font
  8.         cell.fill = header_fill
  9.         cell.alignment = header_align
  10.     for row in ws.iter_rows(min_row=2, max_col=ws.max_column):
  11.         for cell in row:
  12.             cell.alignment = Alignment(horizontal="center", vertical="center")
  13.     for col in ws.columns:
  14.         max_length = 0
  15.         col_letter = col[0].column_letter
  16.         for cell in col:
  17.             if cell.value:
  18.                 max_length = max(max_length, len(str(cell.value)))
  19.         ws.column_dimensions[col_letter].width = max_length + 4
  20. wb.save("销售报表_美化.xlsx")
复制代码

四、条件格式应用
openpyxl提供三种常用条件格式:单元格规则、数据条和色阶。以下示例对“销售额”列(D列)应用:
  1. from openpyxl.formatting.rule import CellIsRule, DataBarRule, ColorScaleRule
  2. from openpyxl.styles import PatternFill
  3. ws = wb.active
  4. # 1. 销售额>15000标红
  5. red_fill = PatternFill(start_color="FFC7CE", end_color="FFC7CE", fill_type="solid")
  6. ws.conditional_formatting.add(
  7.     "D2:D100",
  8.     CellIsRule(operator="greaterThan", formula=["15000"], fill=red_fill))
  9. # 2. 数据条
  10. ws.conditional_formatting.add(
  11.     "D2:D100",
  12.     DataBarRule(start_type="min", end_type="max",
  13.                 color="5B9BD5", showValue=True))
  14. # 3. 色阶(绿→黄→红)
  15. ws.conditional_formatting.add(
  16.     "D2:D100",
  17.     ColorScaleRule(
  18.         start_type="min", start_color="63BE7B",
  19.         mid_type="percentile", mid_value=50, mid_color="FFEB84",
  20.         end_type="max", end_color="F8696B"))
  21. wb.save("销售报表_条件格式.xlsx")
复制代码

五、图表嵌入
openpyxl支持柱状图、折线图、饼图等多种图表。以柱状图为例:
  1. from openpyxl.chart import BarChart, Reference
  2. ws = wb.active
  3. chart = BarChart()
  4. chart.type = "col"
  5. chart.title = "各城市销售额"
  6. chart.y_axis.title = "销售额"
  7. chart.x_axis.title = "城市"
  8. data = Reference(ws, min_col=4, min_row=1, max_col=4, max_row=ws.max_row)
  9. cats = Reference(ws, min_col=2, min_row=2, max_row=ws.max_row)  # 城市列
  10. chart.add_data(data, titles_from_data=True)
  11. chart.set_categories(cats)
  12. ws.add_chart(chart, "F2")
复制代码
折线图适用于趋势展示:
  1. from openpyxl.chart import LineChart
  2. line_chart = LineChart()
  3. line_chart.title = "月度销售趋势"
  4. data = Reference(ws, min_col=4, min_row=1, max_row=ws.max_row)
  5. cats = Reference(ws, min_col=1, min_row=2, max_row=ws.max_row)
  6. line_chart.add_data(data, titles_from_data=True)
  7. line_chart.set_categories(cats)
  8. ws.add_chart(line_chart, "F20")
复制代码
饼图显示占比:
  1. from openpyxl.chart import PieChart
  2. pie_chart = PieChart()
  3. pie_chart.title = "品类占比"
  4. data = Reference(ws, min_col=4, min_row=1, max_row=ws.max_row)
  5. cats = Reference(ws, min_col=3, min_row=2, max_row=ws.max_row)
  6. pie_chart.add_data(data, titles_from_data=True)
  7. pie_chart.set_categories(cats)
  8. ws.add_chart(pie_chart, "F38")
复制代码

六、批量合并多个Excel
如果有多个月度报表需要合并分析,可用以下函数自动扫描文件夹并汇总:
  1. import os
  2. import pandas as pd
  3. def merge_excel_files(input_dir, output_file):
  4.     all_data = []
  5.     for f in os.listdir(input_dir):
  6.         if f.endswith((".xlsx", ".xls")):
  7.             df = pd.read_excel(os.path.join(input_dir, f))
  8.             df["来源文件"] = f
  9.             all_data.append(df)
  10.             print(f"已读取: {f} ({len(df)}行)")
  11.     result = pd.concat(all_data, ignore_index=True)
  12.     with pd.ExcelWriter(output_file, engine="openpyxl") as writer:
  13.         result.to_excel(writer, sheet_name="汇总数据", index=False)
  14.         pivot = pd.pivot_table(result,
  15.                                values="销售额", index="城市", aggfunc=["sum", "mean", "count"])
  16.         pivot.to_excel(writer, sheet_name="统计报表")
  17.     print(f"合并完成!共 {len(result)} 行 → {output_file}")
  18. merge_excel_files("月度报表", "年度汇总.xlsx")
复制代码

七、完整案例:自动生成月报
下面封装一个函数,读数据→生成透视表→写入多工作表→美化表头→添加柱状图,最终输出一个带分析的Excel报告。
  1. import pandas as pd
  2. from openpyxl import load_workbook
  3. from openpyxl.chart import BarChart, Reference
  4. from openpyxl.styles import Font, PatternFill, Alignment
  5. from datetime import datetime
  6. def generate_monthly_report(data_file, output_file):
  7.     df = pd.read_excel(data_file)
  8.     month = datetime.now().strftime("%Y年%m月")
  9.     with pd.ExcelWriter(output_file, engine="openpyxl") as writer:
  10.         df.to_excel(writer, sheet_name="数据源", index=False)
  11.         city_pivot = pd.pivot_table(df, values="销售额", index="城市", aggfunc=["sum", "count"])
  12.         city_pivot.to_excel(writer, sheet_name="城市分析")
  13.         cat_pivot = pd.pivot_table(df, values="销售额", index="品类", aggfunc="sum")
  14.         cat_pivot.to_excel(writer, sheet_name="品类分析")
  15.     wb = load_workbook(output_file)
  16.     ws = wb["城市分析"]
  17.     header_font = Font(bold=True, color="FFFFFF", size=11)
  18.     header_fill = PatternFill("solid", fgColor="4472C4")
  19.     for cell in ws[1]:
  20.         cell.font = header_font
  21.         cell.fill = header_fill
  22.         cell.alignment = Alignment(horizontal="center")
  23.     chart = BarChart()
  24.     chart.title = f"{month}各城市销售额"
  25.     data = Reference(ws, min_col=2, min_row=1, max_col=2, max_row=ws.max_row)
  26.     cats = Reference(ws, min_col=1, min_row=2, max_row=ws.max_row)
  27.     chart.add_data(data, titles_from_data=True)
  28.     chart.set_categories(cats)
  29.     chart.width = 18
  30.     chart.height = 12
  31.     ws.add_chart(chart, "D2")
  32.     wb.save(output_file)
  33.     print(f"月报已生成: {output_file}")
  34. generate_monthly_report("6月销售数据.xlsx", "6月销售报表.xlsx")
复制代码

八、常用样式速查
Font(name="微软雅黑", size=11, bold=True, italic=False, color="FF0000")
PatternFill(start_color="FFC000", end_color="FFC000", fill_type="solid")
Alignment(horizontal="center", vertical="center", wrap_text=True)
Border(left=Side(style="thin"), right=Side(style="thin"), top=Side(style="thin"), bottom=Side(style="thin"))
ws.row_dimensions[1].height = 30
ws.column_dimensions["A"].width = 15

通过上述代码,你可以将重复性的Excel报表工作交给Python自动完成,无论是单次处理还是批量整合,都能显著提升效率。
回复

使用道具 举报

发表于 昨天 11:10 | 显示全部楼层

Re: Python+Excel自动化报表:数据透视表、条件格式与图表集成实战

非常实用的分享!之前我手动做透视表和条件格式,步骤繁琐还容易漏改。您这个思路整合了数据聚合、样式美化和图表嵌入,代码清晰,尤其是把索引设为多级和列宽自适应的部分很贴心,正好解决了我的痛点。想问一下,如果要处理多个数据源或者跨工作簿合并,是不是在pandas读入时多加几个read_excel再concat就行?期待后续的批量处理和自动月报函数封装!
回复 支持 反对

使用道具 举报

发表于 昨天 11:10 | 显示全部楼层

Re: Python+Excel自动化报表:数据透视表、条件格式与图表集成实战

感谢楼主分享这么详细的实战教程!之前手动做Excel报表确实费时费力,尤其是透视表和条件格式,经常要来回点菜单。您用pandas+openpyxl这套方案把流程自动化了,思路很清晰,代码也写得很完整,直接就能拿来用。特别是表头美化那部分,蓝底白字加自动列宽,做出来的报表专业多了。条件格式也刚好是我需要的,以前只会用VBA,现在发现Python处理起来更灵活。期待您后续把图表集成的部分也补上,那样一键生成完整报表就彻底实现了。再次感谢!
回复 支持 反对

使用道具 举报

发表于 昨天 11:10 | 显示全部楼层

Re: Python+Excel自动化报表:数据透视表、条件格式与图表集成实战

这个流程写得很清晰,干货满满!我一直手动做这类报表,确实费时又容易漏改。想问下楼主,第四部分条件格式之后的“图表集成”部分好像没贴完?柱状图、折线图用 openpyxl 的 chart 怎么嵌入到指定位置?还有批量处理时如果原始数据有合并单元格或者空行,pandas 读到 DataFrame 里会有什么坑吗?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

指导单位

江苏省公安厅

江苏省通信管理局

浙江省台州刑侦支队

DEFCON GROUP 86025

Hacking Group 021A

旗下站点

态势感知中心

应急响应中心

红盟安全

联系我们

官方QQ群:112851260

官方邮箱:security#ihonker.org(#改成@)

官方核心成员

关注微信公众号

Archiver|手机版|小黑屋| ( 沪ICP备2021026908号 )

GMT+8, 2026-7-7 01:44 , Processed in 0.029245 second(s), 17 queries , Gzip On, Redis On.

Powered by ihonker.com

Copyright © 2015-现在.

  • 返回顶部