乐于分享
好东西不私藏

还在用 Excel 画柱状图?Python 三行代码生成动态可视化大屏

还在用 Excel 画柱状图?Python 三行代码生成动态可视化大屏

你有没有过这样的经历:月底汇总销售数据,先用 Excel 做一张柱状图,调成领导喜欢的颜色,加上数据标签;再画一张折线图看趋势;最后还得配上饼图看占比。好不容易做完,领导说再加一个 KPI 卡片和业绩进度条……一套操作下来一下午就过去了。更崩溃的是下个月数据更新后,所有图表都得从头来过。

如果有一个工具,只需把数据放进 Excel,双击一下鼠标,自动生成一个带 KPI、趋势、占比、表格的交互式大屏,而且是酷炫的深色科技风,可以直接在浏览器里交互查看,还能把网页发给同事,让对方一点就开——你想不想要?

今天我就带你把这件事变成现实。我们用 Python 写一个不到 80 行的脚本(看起来多,但大部分是自动美化,你根本不需要理解),然后打包成 exe 文件,以后每次更新数据,双击 exe,大屏秒出。

一、最终效果长什么样?(拷贝代码执行去!!!)

运行这个程序后,你的默认浏览器会自动打开一个网页,上面整整齐齐地排列着:

  • 顶部一行 4 个 KPI 卡片:总销售额、总订单数、平均客单价、覆盖区域数,数字醒目。

  • 左中一张柱状图:各区域销售额对比,鼠标悬停显示具体数字。

  • 右中一张折线图:全年的销售趋势,带数据点和平滑曲线。

  • 左下环形饼图:产品类别占比,中间空洞设计,点击图例可隐藏/显示。

  • 右下数据表格:各区域销售额汇总,带颜色表头。

  • 最底部仪表盘:业绩达成率进度条,直观显示是否达标。

整个大屏采用深色主题,科技感满满,右下角有工具栏可以缩放、拖拽,甚至可以下载成 PNG 高清图片。这个网页文件你还可以直接发给领导,对方用浏览器就能看,完全不需要 Python 环境。

二、准备工作:只需安装两个库

如果你电脑上还没有 Python,不用担心,文末会教你请 IT 同事帮忙一次性打包成 exe,之后你只用双击鼠标。

如果已经装了 Python(或想先跑跑看),只需在命令行(Win+R 输入 cmd 回车)执行下面两行,安装依赖库:

pip install pandas plotly

大概一分钟就能装好,接下来我们就可以开始写代码了。

三、完整代码(复制粘贴即用)

下面的代码分两部分,合在一起保存成一个 .py 文件,例如 数据大屏.py:

自动生成示例数据(让你立刻看到效果,真实使用时可以删掉或替换为自己的文件)

数据大屏生成主程序

3.1 自动生成示例数据(省去你手动建 Excel 的麻烦)

import pandas as pdimport numpy as np# 生成 200 行模拟销售数据np.random.seed(42)dates = pd.date_range('2024-01-01', periods=100, freq='D')regions = ['华东', '华南', '华北', '西部']products = ['食品', '饮料', '电子', '服装']data = {    '日期': np.random.choice(dates, 200),    '区域': np.random.choice(regions, 200),    '产品类别': np.random.choice(products, 200),    '销售额': np.random.randint(5000, 50000, 200)}df = pd.DataFrame(data)df.to_excel('销售明细.xlsx', index=False)print("示例数据已生成:销售明细.xlsx")

3.2 主程序:读取数据并生成深色科技风大屏

import pandas as pdimport plotly.graph_objects as gofrom plotly.subplots import make_subplotsimport webbrowser# ---------- 读取数据 ----------df = pd.read_excel("销售明细.xlsx", sheet_name="Sheet1")# 计算核心指标总销售额 = df['销售额'].sum()总订单数 = len(df)平均客单价 = 总销售额 / 总订单数区域数 = df['区域'].nunique()# 汇总数据区域汇总 = df.groupby('区域', as_index=False)['销售额'].sum()月度趋势 = df.groupby('日期', as_index=False)['销售额'].sum()产品占比 = df.groupby('产品类别', as_index=False)['销售额'].sum()# ---------- 构建大屏布局 ----------fig = make_subplots(    rows=4, cols=4,    row_heights=[0.15, 0.4, 0.3, 0.15],    column_widths=[0.25, 0.25, 0.25, 0.25],    specs=[        # 第一行:4个KPI卡片        [{"type": "indicator"}, {"type": "indicator"}, {"type": "indicator"}, {"type": "indicator"}],        # 第二行:柱状图(占两格) + 折线图(占两格)        [{"type": "bar", "colspan": 2}, None, {"type": "scatter", "colspan": 2}, None],        # 第三行:饼图(占两格) + 表格(占两格)        [{"type": "pie", "colspan": 2}, None, {"type": "table", "colspan": 2}, None],        # 第四行:仪表盘进度条(占一整行)        [{"type": "indicator", "colspan": 4}, None, None, None]    ],    subplot_titles=("总销售额", "总订单数", "平均客单价", "覆盖区域",                    "各区域销售额", "月度趋势", "产品占比", "销售明细",                    "业绩达成率"))# ---------- 填充图表内容 ----------# 1. 顶部 KPI 卡片fig.add_trace(go.Indicator(mode="number", value=总销售额,                           number={'prefix':'¥', 'valueformat':',.0f'},                           title="总销售额"), row=1, col=1)fig.add_trace(go.Indicator(mode="number", value=总订单数,                           title="总订单数"), row=1, col=2)fig.add_trace(go.Indicator(mode="number", value=平均客单价,                           number={'prefix':'¥', 'valueformat':'.0f'},                           title="平均客单价"), row=1, col=3)fig.add_trace(go.Indicator(mode="number", value=区域数,                           title="覆盖区域"), row=1, col=4)# 2. 柱状图(各区域销售额)fig.add_trace(go.Bar(x=区域汇总['区域'], y=区域汇总['销售额'],                     marker_color='#636EFA'), row=2, col=1)# 3. 折线图(月度趋势)fig.add_trace(go.Scatter(x=月度趋势['日期'], y=月度趋势['销售额'],                         mode='lines+markers', line_color='#EF553B'), row=2, col=3)# 4. 饼图(产品占比)fig.add_trace(go.Pie(labels=产品占比['产品类别'], values=产品占比['销售额'],                     hole=0.4), row=3, col=1)# 5. 数据表格fig.add_trace(go.Table(    header=dict(values=['区域', '销售额'], fill_color='royalblue',                font=dict(color='white')),    cells=dict(values=[区域汇总['区域'], 区域汇总['销售额']],               fill_color='lavender')), row=3, col=3)# 6. 底部仪表盘(业绩达成率)目标销售额 = 总销售额 * 1.2  # 假设目标是实际销售额的1.2倍,你可以修改完成率 = 总销售额 / 目标销售额 * 100fig.add_trace(go.Indicator(    mode="gauge+number+delta",    value=完成率,    delta={'reference': 100},    gauge={'axis': {'range': [0, 100]}, 'bar': {'color': "darkblue"}},    title={'text': "业绩达成率 (%)"}), row=4, col=1)# ---------- 美化:深色科技风 ----------fig.update_layout(    template="plotly_dark",    title_text="销售数据可视化大屏 · 2024年度",    title_font_size=22,    height=900,    showlegend=False)# ---------- 保存并自动打开 ----------output_file = "销售大屏.html"fig.write_html(output_file)webbrowser.open(output_file)print(f"大屏已生成:{output_file}")

把上面两部分代码粘贴到一个新建的 .py 文件里,放在你想要存放结果的文件夹,然后双击运行(或者命令行 python 数据大屏.py)。

第一次运行时,它会在当前文件夹生成一个 销售明细.xlsx(示例数据),然后自动打开浏览器展示你专属的可视化大屏。以后只需要更新你的 Excel 文件,再次运行就能得到最新的大屏。

四、如何把它变成你自己的工具?

你只需要修改三处地方,就能把这个通用模板变成适用于你实际业务的专属工具:

  • 替换数据源:如果你的 Excel 文件名不是 销售明细.xlsx,就把代码里的 df = pd.read_excel("销售明细.xlsx") 改成你自己的文件名,比如 df = pd.read_excel("我的销售表.xlsx")。

  • 修改列名:把代码中的 "区域"、"销售额"、"产品类别"、"日期" 换成你表格里对应的列标题。比如你的表格列名叫“地区”“金额”“品类”“下单时间”,就在代码里相应替换。

  • 调整业务目标:底部仪表盘的“目标销售额”目前是实际销售额的 1.2 倍,你可以改成固定数值,比如 目标销售额 = 5000000,直接设定一个具体目标。

修改完成后保存,再次运行,生成的就是你自己的数据大屏了。

五、打包成 exe,发给没有 Python 的同事也能用

打包可以让这个工具变成完全独立、双击即可运行的程序,哪怕对方电脑上没装任何编程环境。

第一步:安装打包工具

在命令行执行:

pip install pyinstaller

第二步:打包

在存放 数据大屏.py 的文件夹地址栏输入 cmd 回车,输入以下命令:

pyinstaller -F -w 数据大屏.py

参数解释:

-F:打包成一个单独的 exe 文件。

-w:隐藏黑窗口(这样双击运行后静默生成大屏,然后自动打开浏览器)。

等待一两分钟后,在自动生成的 dist 文件夹里找到 数据大屏.exe,把它复制到你的 Excel 文件同一个文件夹下,双击就能自动生成大屏并打开浏览器展示。这个 exe 可以无限复制,发给任何同事都能用。

六、常见问题与解决

Q:生成的网页发给别人,对方打开看不到内容?

A:检查一下发送的是 销售大屏.html 这个文件,它内部已经包含了所有数据和图表,不需要任何额外文件,用浏览器打开即可交互查看。

Q:我的 Excel 有多个 Sheet,想指定读取哪个?

A:在 pd.read_excel() 里加上 sheet_name='你的Sheet名',例如:

df = pd.read_excel("销售数据.xlsx", sheet_name="2024汇总")

Q:不想要深色主题,想换回白色?

A:把代码中的 template="plotly_dark" 删除,或者改为 template="plotly_white"。

Q:我想增加更多图表(比如地图、散点图),怎么办?

A:改布局、加 trace 就好。如果你有定制需求,可以在本文下方留言或后台联系我们。

写在最后

今天的工具,让你告别了 Excel 里一遍遍手工调图的噩梦,不用学编程,不用花钱买软件,一个 exe 就能把枯燥的报表变成领导喜欢、同事羡慕的交互式数据大屏。下一次数据更新时,你只需要双击一下鼠标。

 每一次互动,皆是鼓励, 每一份支持,共促成长。

商务合作:RYXtest

相关学习资料