Python Excel高级处理之数据透视表、条件格式、图表

 更新时间:2026年07月06日 08:45:31   作者:张老师技术栈  
想告别手动做Excel报表吗?这篇教程教你用Python快速生成带数据透视表、条件格式和图表的专业报告,只需几分钟,效率提升100倍,需要的朋友可以参考下

这篇讲进阶功能——数据透视表、条件格式、图表、批量样式。这些在出报表的时候非常实用,用 Python 生成一份带图表的 Excel 报告,比手动做快 100 倍。

一、安装

pip install openpyxl  # Excel 高级功能(样式、图表、格式)

二、数据透视表

1. 用 pandas 生成透视表

import pandas as pd

# 原始数据
df = pd.read_excel("销售数据.xlsx")
print(df.head())
# 输出:
#     日期    城市   销售员  品类    销售额
# 0  2026-01  北京   张三   手机    12000
# 1  2026-01  上海   李四   手机    15000
# 2  2026-01  北京   王五   电脑    18000

# 数据透视表:行=城市,列=品类,值=销售额总和
pivot = pd.pivot_table(
    df,
    values="销售额",
    index="城市",
    columns="品类",
    aggfunc="sum",
    fill_value=0,
    margins=True,        # 显示合计
    margins_name="合计"   # 合计列名
)

print(pivot)
# 品类     电脑     手机     合计
# 城市
# 北京   45000   32000   77000
# 上海   38000   41000   79000
# 合计   83000   73000  156000

2. 多级透视表

pivot = pd.pivot_table(
    df,
    values="销售额",
    index=["城市", "销售员"],
    columns="品类",
    aggfunc="sum",
    fill_value=0,
)
# 行索引有两级:城市 → 销售员

3. 导出到 Excel

with pd.ExcelWriter("销售报表.xlsx", engine="openpyxl") as writer:
    # 原始数据
    df.to_excel(writer, sheet_name="原始数据", index=False)
    # 透视表
    pivot.to_excel(writer, sheet_name="品类分析")
    # 多级透视表
    pivot_multi = pd.pivot_table(df, values="销售额",
        index=["城市", "销售员"], aggfunc="sum")
    pivot_multi.to_excel(writer, sheet_name="员工业绩")

三、样式美化

1. 设置单元格样式

from openpyxl import load_workbook
from openpyxl.styles import Font, PatternFill, Alignment, Border, Side

wb = load_workbook("销售报表.xlsx")

for sheet_name in wb.sheetnames:
    ws = wb[sheet_name]

    # 表头样式:加粗、居中、蓝底白字
    header_font = Font(bold=True, color="FFFFFF", size=11)
    header_fill = PatternFill(start_color="4472C4", end_color="4472C4", fill_type="solid")
    header_align = Alignment(horizontal="center", vertical="center")

    for cell in ws[1]:  # 第一行是表头
        cell.font = header_font
        cell.fill = header_fill
        cell.alignment = header_align

    # 数据行:居中,自动列宽
    for row in ws.iter_rows(min_row=2, max_col=ws.max_column):
        for cell in row:
            cell.alignment = Alignment(horizontal="center", vertical="center")

    # 自动列宽
    for col in ws.columns:
        max_length = 0
        col_letter = col[0].column_letter
        for cell in col:
            if cell.value:
                max_length = max(max_length, len(str(cell.value)))
        ws.column_dimensions[col_letter].width = max_length + 4

wb.save("销售报表_美化.xlsx")
print("样式美化完成")

2. 条件格式

from openpyxl.formatting.rule import CellIsRule, DataBarRule, ColorScaleRule
from openpyxl.styles import PatternFill

wb = load_workbook("销售报表.xlsx")
ws = wb.active

# 方法1:销售额 > 15000 标红
red_fill = PatternFill(start_color="FFC7CE", end_color="FFC7CE", fill_type="solid")
ws.conditional_formatting.add(
    "D2:D100",
    CellIsRule(operator="greaterThan", formula=["15000"], fill=red_fill))

# 方法2:数据条(直观显示大小)
ws.conditional_formatting.add(
    "D2:D100",
    DataBarRule(start_type="min", end_type="max",
                color="5B9BD5", showValue=True))

# 方法3:色阶(绿→黄→红)
ws.conditional_formatting.add(
    "D2:D100",
    ColorScaleRule(
        start_type="min", start_color="63BE7B",
        mid_type="percentile", mid_value=50, mid_color="FFEB84",
        end_type="max", end_color="F8696B"
    ))

wb.save("销售报表_条件格式.xlsx")

四、图表

1. 柱状图

from openpyxl.chart import BarChart, Reference

wb = load_workbook("销售报表.xlsx")
ws = wb.active

# 创建柱状图
chart = BarChart()
chart.type = "col"          # 柱状图
chart.title = "各城市销售额"
chart.y_axis.title = "销售额"
chart.x_axis.title = "城市"
chart.style = 10

# 数据范围
data = Reference(ws, min_col=4, min_row=1, max_col=4, max_row=ws.max_row)
cats = Reference(ws, min_col=2, min_row=2, max_row=ws.max_row)  # 城市列

chart.add_data(data, titles_from_data=True)
chart.set_categories(cats)
chart.shape = 4

ws.add_chart(chart, "F2")
wb.save("销售报表_图表.xlsx")

2. 折线图(趋势)

from openpyxl.chart import LineChart

line_chart = LineChart()
line_chart.title = "月度销售趋势"
line_chart.style = 10
line_chart.y_axis.title = "销售额"
line_chart.x_axis.title = "月份"

data = Reference(ws, min_col=4, min_row=1, max_row=ws.max_row)
cats = Reference(ws, min_col=1, min_row=2, max_row=ws.max_row)

line_chart.add_data(data, titles_from_data=True)
line_chart.set_categories(cats)

ws.add_chart(line_chart, "F20")

3. 饼图(占比)

from openpyxl.chart import PieChart

pie_chart = PieChart()
pie_chart.title = "品类占比"
pie_chart.style = 10

data = Reference(ws, min_col=4, min_row=1, max_row=ws.max_row)
cats = Reference(ws, min_col=3, min_row=2, max_row=ws.max_row)

pie_chart.add_data(data, titles_from_data=True)
pie_chart.set_categories(cats)

ws.add_chart(pie_chart, "F38")

五、批量处理多个 Excel

import os
import pandas as pd

def merge_excel_files(input_dir, output_file):
    """合并整个文件夹的 Excel 文件"""
    all_data = []

    for f in os.listdir(input_dir):
        if f.endswith((".xlsx", ".xls")):
            df = pd.read_excel(os.path.join(input_dir, f))
            df["来源文件"] = f  # 标记来源
            all_data.append(df)
            print(f"已读取: {f} ({len(df)}行)")

    result = pd.concat(all_data, ignore_index=True)

    with pd.ExcelWriter(output_file, engine="openpyxl") as writer:
        result.to_excel(writer, sheet_name="汇总数据", index=False)

        # 生成报表
        pivot = pd.pivot_table(result,
            values="销售额", index="城市", aggfunc=["sum", "mean", "count"])
        pivot.to_excel(writer, sheet_name="统计报表")

    print(f"合并完成!共 {len(result)} 行 → {output_file}")

# 使用
merge_excel_files("月度报表", "年度汇总.xlsx")

六、完整案例:自动生成月报

import pandas as pd
from openpyxl import load_workbook
from openpyxl.chart import BarChart, Reference
from openpyxl.styles import Font, PatternFill, Alignment
from datetime import datetime

def generate_monthly_report(data_file, output_file):
    """自动生成月度销售报表"""

    # 1. 读取数据
    df = pd.read_excel(data_file)
    month = datetime.now().strftime("%Y年%m月")

    # 2. 生成透视表
    with pd.ExcelWriter(output_file, engine="openpyxl") as writer:
        # 原始数据
        df.to_excel(writer, sheet_name="数据源", index=False)

        # 按城市汇总
        city_pivot = pd.pivot_table(df,
            values="销售额", index="城市", aggfunc=["sum", "count"])
        city_pivot.to_excel(writer, sheet_name="城市分析")

        # 按品类汇总
        cat_pivot = pd.pivot_table(df,
            values="销售额", index="品类", aggfunc="sum")
        cat_pivot.to_excel(writer, sheet_name="品类分析")

    # 3. 美化 + 图表
    wb = load_workbook(output_file)
    ws = wb["城市分析"]

    # 表头样式
    header_font = Font(bold=True, color="FFFFFF", size=11)
    header_fill = PatternFill("solid", fgColor="4472C4")
    for cell in ws[1]:
        cell.font = header_font
        cell.fill = header_fill
        cell.alignment = Alignment(horizontal="center")

    # 柱状图
    chart = BarChart()
    chart.title = f"{month}各城市销售额"
    data = Reference(ws, min_col=2, min_row=1, max_col=2, max_row=ws.max_row)
    cats = Reference(ws, min_col=1, min_row=2, max_row=ws.max_row)
    chart.add_data(data, titles_from_data=True)
    chart.set_categories(cats)
    chart.width = 18; chart.height = 12
    ws.add_chart(chart, "D2")

    wb.save(output_file)
    print(f"月报已生成: {output_file}")

# 使用
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")
GradientFill(stop=("FFFFFF", "4472C4"))

# 对齐
Alignment(horizontal="center", vertical="center", wrap_text=True)

# 边框
thin_border = 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

到此这篇关于Python Excel高级处理之数据透视表、条件格式、图表的文章就介绍到这了,更多相关Python Excel数据透视表、条件格式、图表处理内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 在matplotlib中改变figure的布局和大小实例

    在matplotlib中改变figure的布局和大小实例

    这篇文章主要介绍了在matplotlib中改变figure的布局和大小实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-04-04
  • 详解python里的命名规范

    详解python里的命名规范

    这篇文章主要介绍了详解python里的命名规范,命名应当尽量使用全拼写的单词,缩写的情况文章中也给大家提到,需要的朋友参考下吧
    2018-07-07
  • caffe binaryproto 与 npy相互转换的实例讲解

    caffe binaryproto 与 npy相互转换的实例讲解

    今天小编就为大家分享一篇caffe binaryproto 与 npy相互转换的实例讲解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-07-07
  • python使用梯度下降和牛顿法寻找Rosenbrock函数最小值实例

    python使用梯度下降和牛顿法寻找Rosenbrock函数最小值实例

    这篇文章主要介绍了python使用梯度下降和牛顿法寻找Rosenbrock函数最小值实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-04-04
  • 使用python将图片按标签分入不同文件夹的方法

    使用python将图片按标签分入不同文件夹的方法

    今天小编就为大家分享一篇使用python将图片按标签分入不同文件夹的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-12-12
  • Python文件处理的魔法之旅

    Python文件处理的魔法之旅

    Python文件处理在数据持久化、配置管理和日志记录方面发挥着至关重要的作用,通过学习如何读取、写入和修改文件,开发者可以更加高效地处理各种数据和配置文件,需要的朋友可以参考下
    2024-11-11
  • Pytorch中实现CPU和GPU之间的切换的两种方法

    Pytorch中实现CPU和GPU之间的切换的两种方法

    本文主要介绍了Pytorch中实现CPU和GPU之间的切换的两种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-01-01
  • Python 多维List创建的问题小结

    Python 多维List创建的问题小结

    这篇文章主要介绍了Python 多维List创建的问题小结,详细的介绍了遇到的一个小问题的解决方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-01-01
  • python写入文件自动换行问题的方法

    python写入文件自动换行问题的方法

    这篇文章主要介绍了python写入文件自动换行问题的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-07-07
  • 小学生也能看懂的python语法之循环语句精解

    小学生也能看懂的python语法之循环语句精解

    这篇文章主要介绍了详解Python中的条件,循环语句,包括while循环for循环,循环语句是学习各个编程语言的最基本的基础知识,需要的朋友可以参考下
    2021-09-09

最新评论