# 通用数据报告 PPT 生成器

输入任意 Excel/CSV 数据文件，自动生成包含原生可编辑图表的高质量数据报告 PPT。

## 核心特性

- **通用数据兼容**：不依赖固定 Schema，自动探查任意 Excel/CSV 文件的数据结构、字段语义和统计特征
- **原生可编辑图表**：使用 `python-pptx` 生成原生 Chart 对象，非静态图片，生成后可在 PowerPoint 中直接编辑数据和样式
- **智能分析推荐**：自动识别可量化指标，推荐可视化方案、页面结构和洞察文案
- **六项用户确认**：生成前强制确认报告周期、核心指标、受众场景、视觉风格、页面结构、字段映射，避免生成偏离需求的报告
- **质量自检引擎**：四类 25 项质量检查（布局/视觉/内容/数据），自动检测并迭代修复至达标
- **多主题支持**：5 套预设主题（商务经典、清新简约、科技蓝调、暖橙活力、暗夜深邃），支持自定义配色
- **专业分析标准**：内置《专业数据分析师手册》，确保每页分析包含业务判断、数据证据、对比关系和行动建议

## 安装要求

```bash
pip install python-pptx pandas numpy openpyxl
```

## 快速开始

### 1. 使用预设报告类型（日报/周报/月报）

```python
from scripts.ppt_builder import build_daily_report, build_weekly_report, build_monthly_report
from datetime import datetime

# 日报
build_daily_report('data.xlsx', datetime(2026, 4, 10), 'daily_report.pptx')

# 周报
build_weekly_report('data.xlsx', datetime(2026, 4, 10), 'weekly_report.pptx')

# 月报
build_monthly_report('data.xlsx', datetime(2026, 4, 10), 'monthly_report.pptx')
```

### 2. 使用通用构建器（推荐）

```python
from scripts.ppt_builder import build_report, quality_assured_build
from scripts.report_config import ReportConfig, MetricDef, PageDef

# 创建配置
config = ReportConfig(
    title='销售数据月度报告',
    period_type='monthly',
    source_label='销售部',
    theme='business_classic',
    quality_threshold=85,
    max_fix_iterations=5,
)

# 添加指标（根据数据探查结果配置）
config.metrics = [
    MetricDef(name='总需求台数', column='总需求台数', agg='sum', unit='台'),
    MetricDef(name='已下单台数', column='已下单', agg='sum', unit='台'),
    MetricDef(name='转化率', column='转化率', agg='mean', unit='%', fmt='.1f'),
]

# 添加页面
config.pages = [
    PageDef(page_type='kpi_overview', title='月度总览'),
    PageDef(page_type='trend', title='30日追踪趋势'),
    PageDef(page_type='distribution', title='区域分布'),
    PageDef(page_type='ranking', title='TOP10目的国'),
    PageDef(page_type='summary', title='总结与建议'),
]

# 基础构建
build_report('data.xlsx', config, 'output.pptx')

# 带质量自检的构建（推荐）
prs, issues = quality_assured_build('data.xlsx', config, 'output_qa.pptx')
```

### 3. 完整工作流

```python
from scripts.data_loader import load_generic_excel
from scripts.data_profiler import profile_dataframe
from scripts.agent_analyzer import analyze_and_recommend

# 1. 加载数据
df = load_generic_excel('data.xlsx')

# 2. 数据探查
profile = profile_dataframe(df)
print(f"检测到 {profile['num_rows']} 行数据，{profile['num_cols']} 个字段")

# 3. 智能推荐
recs = analyze_and_recommend(profile, period_type='monthly')
print(f"推荐指标: {[m['name'] for m in recs['suggested_metrics']]}")
print(f"推荐页面: {[p['page_type'] for p in recs['suggested_pages']]}")

# 4. 用户确认后构建配置并生成
# ...（见上方配置示例）
```

## 工作流程

```
用户数据 (.xlsx/.csv)
    ↓
数据加载与清洗 (data_loader.py)
    ↓
自动数据探查 (data_profiler.py)
    - Schema 检测、统计特征、数据质量评分
    ↓
智能分析与推荐 (agent_analyzer.py)
    - 指标推荐、页面结构、可视化方案
    ↓
【六项用户确认】
    1. 报告周期与页数范围
    2. 核心指标集
    3. 受众与决策场景
    4. 视觉风格与配色方向
    5. 页面结构与模板方案
    6. 数据范围与字段映射
    ↓
指标计算 (metrics_calculator.py)
    ↓
PPT 构建 (ppt_builder.py)
    - 动态布局、主题配色、原生图表、深度洞察
    ↓
质量自检与修复 (quality_inspector.py)
    - 布局/视觉/内容/数据 四类检查
    - 自动迭代修复至评分 ≥ 阈值
    ↓
输出 .pptx（全部可编辑）
```

## 目录结构

```
generate-data-report-ppt/
├── assets/                           # PPT 模板文件
│   ├── report-master.pptx            # 日报模板
│   ├── weekly-master.pptx            # 周报模板
│   └── monthly-master.pptx           # 月报模板
├── references/                       # 参考规范文档
│   ├── data-schema.md                # 数据格式与字段映射规范
│   ├── report-structures.md          # 日报/周报/月报标准页面结构
│   ├── chart-specs.md                # 图表类型、配色、数据绑定规范
│   ├── visual-style-guide.md         # 布局、字体、配色视觉规范
│   ├── quality-standards.md          # PPT 生成质量强制规范
│   └── professional-data-analyst-playbook.md  # 专业数据分析洞察标准
├── scripts/                          # 核心代码
│   ├── data_loader.py                # 数据加载与智能清洗
│   ├── data_profiler.py              # 通用数据探查引擎
│   ├── report_config.py              # 报告配置数据模型
│   ├── theme_manager.py              # 多主题配色与模板管理
│   ├── agent_analyzer.py             # 智能分析与推荐
│   ├── metrics_calculator.py         # KPI 计算引擎
│   ├── chart_factory.py              # 原生可编辑图表创建
│   ├── page_layouts.py               # 动态页面布局引擎
│   ├── deep_insights.py              # 结构化深度洞察生成
│   ├── ppt_builder.py                # PPT 组装编排器
│   ├── quality_rules.py              # 质量检查规则定义
│   └── quality_inspector.py          # 质量自检与自动修复引擎
├── SKILL.md                          # 技能定义与 V2 生成契约
└── README.md                         # 本文件
```

## 报告类型

| 类型 | 页数 | 标准结构 | 分析维度 |
|------|------|---------|---------|
| **日报** | 8 页 | 封面 → 核心指标 → 近10天趋势 → 状态分布 → 负责人分布 → TOP8国家 → 异常告警 → 今日要点 | 与昨日对比、与上周同日对比 |
| **周报** | 9 页 | 封面 → 周汇总 → 7日趋势 → 环比分析 → 区域分布 → 国家排行 → 团队追踪 → 问题与建议 → 下周计划 | 周环比(WoW)、周同比(YoY)、7日移动平均 |
| **月报** | 11 页 | 封面 → 目录 → 月度总览 → 订单漏斗 → 区域分布 → TOP10国家 → 30日趋势 → 团队绩效 → 支持需求 → 下月规划 → 尾页 | 环比(MoM)、同比(YoY)、日均值、结构占比 |

> 通用构建器支持自定义页面结构和指标，不限于上述三种预设类型。

## 核心模块说明

### 数据探查（data_profiler.py）

自动分析任意数据结构：
- **Schema 检测**：列名、类型推断、缺失率、唯一值统计
- **统计特征**：数值列的 min/max/mean/std/分位数/偏度/峰度，分类列的分布与 HHI 集中度
- **语义推断**：自动识别时间列、分类列、数值列、ID 列（支持中英文列名关键词匹配）
- **数据质量评分**：完整性、数值健康度、唯一性、时间一致性、分类完整性五维度加权评分
- **衍生关系检测**：自动发现数值列间的加减关系（如 `总需求 - 已下单 = 未下单`）

### 质量自检（quality_inspector.py + quality_rules.py）

| 类别 | 检查项示例 | 严重等级 |
|------|-----------|---------|
| **布局** | 元素飞出边界、图文重叠、占位符未替换、元素紧贴边缘 | Critical/Major |
| **视觉** | 字体不一致、字号异常、颜色对比度不足、图片拉伸 | Major/Minor |
| **内容** | 页面留白过多、KPI 数值为空、图表无数据、分析文本过短 | Critical/Major |
| **数据** | 图表与文本矛盾、页码错乱、数据来源缺失、刻度异常 | Major/Minor |

**评分规则**：严重问题 -20 分/页，主要问题 -10 分/页，次要问题 -3 分/页。默认阈值 85 分，最大迭代修复 5 次。

### 主题管理（theme_manager.py）

内置 5 套主题，每套包含主色、辅色、强调色、背景色、文字色和系列色盘：

- `business_classic` — 商务经典（默认）
- `fresh_minimal` — 清新简约
- `tech_blue` — 科技蓝调
- `warm_orange` — 暖橙活力
- `dark_night` — 暗夜深邃

支持通过 `theme_to_rgb_colors()` 一键转换为 `pptx` 可用的 `RGBColor` 对象。

## 分析质量标准

生成分析文本时严格遵循 `references/professional-data-analyst-playbook.md`：

- 每页分析必须回答五个问题中的至少三个：发生了什么？变化多大？为什么？风险/机会是什么？下一步做什么？
- 每个洞察块必须包含：结论、证据、解释、影响、动作
- 禁止空洞表述（如"表现较好"、"需持续关注"），必须引用具体数字和可执行动作
- 从第 4 页起禁止只做数据总结，必须写出结构、趋势、集中度、转化、缺口、异常和风险

## 配置参考

### ReportConfig 主要字段

| 字段 | 类型 | 说明 |
|------|------|------|
| `title` | str | 报告标题 |
| `period_type` | PeriodType | DAILY / WEEKLY / MONTHLY / CUSTOM |
| `source_label` | str | 数据来源/部门 |
| `theme` | str | 主题名称 |
| `quality_threshold` | int | 质量评分阈值（默认 85） |
| `max_fix_iterations` | int | 最大修复迭代次数（默认 5） |
| `metrics` | List[MetricDef] | 指标定义列表 |
| `pages` | List[PageDef] | 页面定义列表 |

### 支持的页面类型

| page_type | 说明 | 布局 |
|-----------|------|------|
| `cover` | 封面页 | 固定封面布局 |
| `toc` | 目录页 | 章节目录网格 |
| `kpi_overview` | 核心指标概览 | KPI 卡片网格 |
| `trend` | 趋势分析 | 左侧图表 + 右侧洞察 |
| `distribution` | 分布分析 | 左侧图表 + 右侧洞察 |
| `ranking` | 排行分析 | 左侧条形图 + 右侧说明 |
| `summary` | 总结与建议 | 全宽洞察文本 |
| `end` | 结束页 | 固定尾页布局 |

## 注意事项

1. **用户确认是强制步骤**：通用构建器默认 `require_six_confirmations=True`，缺失确认或字段映射无效时必须停止生成
2. **数据探查服务业务意图**：当用户已确认核心指标时，探查结果应映射到实际 Excel 列，不得擅自改变业务焦点
3. **模板是风格资产而非刚性契约**：若模板占位符无法填充，应移除该占位符组件；若 KPI 网格占满空间，应改用其他布局或在后续分析页补充洞察
4. **分析质量优先于布局质量**：即使布局检查通过，仅重述总数/排名/类别名称而无对比、诊断、启示或行动的页面仍不可接受

## License

MIT
