本文目录导读:

- 场景一:用 Python + Matplotlib/Seaborn 导出静态图片(最通用)
- 场景二:用 Python + Pandas + Openpyxl 导出图表嵌入到 Excel 文件中
- 场景三:用 SQL + BI 工具脚本导出(如 Tableau / Power BI / Metabase)
- 场景四:用 R + ggplot2 批量导出(适合统计人员)
- 需要补充哪些信息?—— 帮你更精确匹配方案
这是一个比较宽泛的问题,要给出具体脚本,需要明确几个关键信息:数据源在哪里(数据库、Excel、CSV、API)、要导出成什么格式(图片PNG/JPG、PDF、HTML交互图、Excel图表)、用什么工具/语言(Python、SQL、BI工具内置脚本)。
下面按最常见的几种场景给出脚本示例和实现思路。
用 Python + Matplotlib/Seaborn 导出静态图片(最通用)
这是最灵活的方式,如果你有一张 Excel 或 CSV 表,想为每一行(或每一类)数据生成一张图表图片。
目标:为每个销售员生成一张月度业绩折线图。
数据源:一个 CSV 文件,包含 salesperson, month, revenue 列。
import pandas as pd
import matplotlib.pyplot as plt
import os
# 1. 读取数据
df = pd.read_csv('sales_data.csv')
# 2. 创建一个文件夹来存放导出的图片
output_dir = 'exported_charts'
os.makedirs(output_dir, exist_ok=True)
# 3. 按 'salesperson' 分组,为每个人生成图表
for salesperson, group in df.groupby('salesperson'):
# 按月份排序
group = group.sort_values('month')
# 创建图表
plt.figure(figsize=(10, 6))
plt.plot(group['month'], group['revenue'], marker='o', linestyle='-', color='b')
plt.title(f'{salesperson} Monthly Revenue')
plt.xlabel('Month')
plt.ylabel('Revenue')
plt.grid(True, linestyle='--', alpha=0.6)
plt.xticks(rotation=45)
plt.tight_layout()
# 4. 保存为图片(文件名用销售员名字)
plt.savefig(f'{output_dir}/{salesperson.replace(" ", "_")}_revenue.png', dpi=150)
plt.close() # 关闭当前图表,释放内存
print(f"Exported charts to {output_dir} directory.")
可调整项:
- 改变
plt.plot为plt.bar(柱状图)或plt.scatter(散点图)。 - 导出格式:
plt.savefig支持.png,.pdf,.svg,.jpg。
用 Python + Pandas + Openpyxl 导出图表嵌入到 Excel 文件中
如果你希望生成的图表直接作为 Excel 工作表一部分,而不是图片文件。
import pandas as pd
from openpyxl import Workbook
from openpyxl.chart import LineChart, Reference
from openpyxl.utils.dataframe import dataframe_to_rows
# 1. 准备数据(可以是多个工作表)
df = pd.DataFrame({
'Month': ['Jan', 'Feb', 'Mar', 'Apr'],
'Product_A': [100, 120, 90, 140],
'Product_B': [80, 95, 110, 85],
'Product_C': [60, 75, 70, 90]
})
# 2. 创建 Excel 工作簿
wb = Workbook()
ws = wb.active= "Data"
# 3. 将数据写入工作表
for r in dataframe_to_rows(df, index=False, header=True):
ws.append(r)
# 4. 创建图表
chart = LineChart()
chart.title = "Monthly Product Sales"
chart.x_axis.title = "Month"
chart.y_axis.title = "Sales"
# 5. 定义数据范围(注意 Excel 单元格引用从1开始)
data_ref = Reference(ws, min_col=2, min_row=1, max_col=4, max_row=5) # 数据列 B-D
categories_ref = Reference(ws, min_col=1, min_row=2, max_row=5) # 月份列 A
chart.add_data(data_ref, titles_from_data=True) # 第一行为标题
chart.set_categories(categories_ref)
# 6. 将图表放置在工作表指定位置
ws.add_chart(chart, "F2")
# 7. 保存
wb.save('product_sales_with_chart.xlsx')
批量处理:可以在循环中创建多个工作表(ws = wb.create_sheet(title=f'Sheet_{i}')),在每个工作表中生成不同的图表。
用 SQL + BI 工具脚本导出(如 Tableau / Power BI / Metabase)
如果你已经在用 BI 工具,通常它们内置了脚本或API。
-
Tableau:使用
tabcmd命令 + 批处理脚本。# Windows .bat 示例 tabcmd login -s https://yourserver -u username -p password tabcmd export "YourWorkbookName" --png --filename "C:\exports\dashboard_%date:/=%" tabcmd logout
-
Metabase(开源BI):通过其 API 导出,需要先通过API获取图表ID,再导出图片。
# 1. 获取会话令牌 curl -X POST "https://metabase.example.com/api/session" \ -H "Content-Type: application/json" \ -d '{"username": "admin@example.com", "password": "yourpass"}' \ -o session.json # 2. 从JSON中提取令牌(假设用 jq) TOKEN=$(cat session.json | jq -r '.id') # 3. 循环导出图表(假设有一个卡片列表 cards.txt) for card_id in $(cat cards.txt); do curl "https://metabase.example.com/api/card/$card_id/query/json" \ -H "X-Metabase-Session: $TOKEN" \ -o "card_${card_id}.json" done注意:Metabase 直接导出图表图片较复杂,通常先导出数据,再用 Python 画图。
用 R + ggplot2 批量导出(适合统计人员)
library(ggplot2)
library(dplyr)
# 读取数据
df <- read.csv("sales_data.csv")
# 创建输出文件夹
dir.create("exported_charts", showWarnings = FALSE)
# 按 salesperson 分组画图并保存
for (person in unique(df$salesperson)) {
person_data <- df %>% filter(salesperson == person)
p <- ggplot(person_data, aes(x = month, y = revenue, group = 1)) +
geom_line(color = "blue") +
geom_point() +
ggtitle(paste(person, "Monthly Revenue")) +
theme_minimal()
# 保存为 png
ggsave(filename = paste0("exported_charts/", gsub(" ", "_", person), "_revenue.png"),
plot = p, width = 10, height = 6, dpi = 150)
}
需要补充哪些信息?—— 帮你更精确匹配方案
如果能告诉我以下两点,可以给出更精确的脚本:
-
数据来源:
- [ ] 单个/多个 Excel 文件
- [ ] 数据库(MySQL / PostgreSQL / SQL Server)
- [ ] 在线表格(Google Sheets)
- [ ] REST API / JSON 接口
-
输出需求:
- [ ] 每个数据行/类别生成一张独立的图片(如每个客户一张)
- [ ] 同一个图表导出为不同格式(PNG、PDF、SVG)
- [ ] 生成一个 PDF 文件包含多张图表(每页一张)
- [ ] 生成交互式 HTML 图表(Plotly / Bokeh)
-
图表类型:
- [ ] 折线图 / 柱状图 / 饼图 / 散点图
- [ ] 复杂的组合图(双Y轴、热力图、瀑布图)
请补充细节,我可以帮你写一个可直接运行的完整脚本。