AI 办公自动化(二):Excel 数据处理自动化 : 从数据清洗到智能报表,一条龙搞定
还在手动做数据清洗、拉透视表、画图表?AI 一次性全搞定: : 你只需要「说话」。
前言
上一期我们体验了 AI 在四大办公场景的「超能力」。从这一期开始,我们逐个模块深入实战。
第一个要攻克的是 Excel: : 毫无疑问,这是打工人每天打交道最多的工具。
想象一下这个场景:老板扔给你一个 Excel 文件,里面有几千行销售数据,有些格子是空的,有些数字明显不对,你需要「清洗数据 → 分析趋势 → 画图表 → 写报告」: : 传统做法至少要一上午。
而用 AI,整个流程可以缩短到几分钟。这一期我们就来实现这个「一条龙」自动化。
一、整体流程设计
AI + Excel 自动化的核心流程分为五步:
原始 Excel 文件
│
▼
┌──────────────┐
│ 1. 智能读取 │ ← 自动识别表头、数据类型、空值
└──────┬───────┘
│
▼
┌──────────────┐
│ 2. 数据质量分析│ ← AI 分析数据问题,生成清洗方案
└──────┬───────┘
│
▼
┌──────────────┐
│ 3. 智能清洗 │ ← 按 AI 方案自动修复数据
└──────┬───────┘
│
▼
┌──────────────┐
│ 4. AI 分析 │ ← 自然语言提问,AI 给洞察
└──────┬───────┘
│
▼
┌──────────────┐
│ 5. 自动报表 │ ← 生成带图表、条件格式的专业报表
└──────────────┘
每一步我们都会提供完整的代码实现。
二、环境准备
cd ai-office-tutorial/02-excel-automation
pip install openpyxl
第2期的代码复用第1期的 config.py 和 llm_client.py,你只需要确保 DEEPSEEK_API_KEY 环境变量已设置。
三、智能数据读取
3.1 自动识别 Excel 结构
传统方式读取 Excel 需要你先「了解」数据结构: : 哪行是表头、每列是什么类型、有没有空值。我们的 ExcelReader 会自动完成这一切。
from openpyxl import load_workbook
class ExcelReader:
"""Excel 智能读取器"""
def analyze(self, filepath, sheet_name=None):
# 加载工作簿
wb = load_workbook(filepath, read_only=True, data_only=True)
sheet = wb[sheet_name or wb.sheetnames[0]]
# 读取所有数据
all_rows = list(sheet.iter_rows(values_only=True))
# 自动检测表头
has_header = self._detect_header(all_rows)
# 分析每列的数据类型、空值、统计信息
columns = []
for col_idx, header in enumerate(headers):
col_info = self._analyze_column(header, col_idx, values)
columns.append(col_info)
return TableInfo(...)
3.2 表头自动检测
核心问题:Excel 的第一行是表头还是数据?
我们的检测逻辑很简单但有效:如果第一行全是文本,而第二行有数字: : 第一行大概率是表头。
def _detect_header(self, rows):
"""检测第一行是否为表头"""
if len(rows) < 2:
return True
first_row = rows[0]
second_row = rows[1]
# 统计第一行和第二行的数据类型
first_types = [self._infer_cell_type(c) for c in first_row]
second_types = [self._infer_cell_type(c) for c in second_row if c is not None]
# 第一行全是文本 + 第二行有数字 → 有表头
first_all_text = all(t == "str" for t in first_types)
second_has_number = any(t in ("int", "float") for t in second_types)
if first_all_text and second_has_number:
return True
# 如果第一行超过 70% 是文本,也认为是表头
text_ratio = first_types.count("str") / len(first_types)
return text_ratio > 0.7
3.3 数据类型推断
每列是什么类型?数字、日期、文本?我们根据值内容自动推断:
def _infer_cell_type(self, value):
"""推断单元格的数据类型"""
if value is None:
return "null"
if isinstance(value, int):
return "int"
if isinstance(value, float):
return "float"
if isinstance(value, str):
# 尝试判断是否为数字字符串
try:
float(value)
return "float"
except ValueError:
pass
# 尝试判断是否为日期
if '-' in value or '/' in value or '年' in value:
return "date"
return "str"
if hasattr(value, 'strftime'):
return "date"
return type(value).__name__
有了类型信息,后续就可以做针对性处理: : 数值列算统计、日期列统一格式、文本列查空值。
四、AI 数据质量分析
读完了数据,接下来让 AI 来分析数据质量。
4.1 生成数据质量摘要
首先把表格的元数据收集起来,包括每列的空值数、数据类型、统计信息:
class DataCleaner:
def analyze_quality(self, table_info):
"""AI 分析数据质量"""
quality_summary = {
"文件名": table_info.filepath,
"数据行数": table_info.row_count,
"各列详情": []
}
for col in table_info.columns:
quality_summary["各列详情"].append({
"列名": col.name,
"类型": col.dtype,
"空值数": col.null_count,
"空值率": f"{col.null_count / max(table_info.row_count, 1) * 100:.1f}%",
"统计": col.stats if col.stats else "N/A",
})
4.2 AI 分析
然后把摘要发给 AI,让它以数据分析师的身份给出质量报告:
prompt = f"""作为数据质量分析师,请分析以下数据质量报告。
数据质量报告:
{json.dumps(quality_summary, ensure_ascii=False, indent=2)}
请从以下角度分析:
1. 数据完整性:哪些列有缺失值?缺失率是否严重?
2. 数据一致性:列类型是否合理?有没有格式问题?
3. 数据准确性:有没有可疑的异常值?
4. 清洗建议:给出具体的清洗步骤(按优先级排序)"""
quality_report = llm.chat(prompt, system_prompt="你是数据质量专家")
AI 会告诉你:哪些列需要填充空值、用什么策略(均值/中位数/众数)、哪条数据看起来像异常值、清洗的先后顺序。
4.3 自动清洗
根据 AI 的分析结果,程序自动执行清洗:
def clean_data(self, data, cleaning_plan):
"""根据 AI 方案执行数据清洗"""
# 1. 删除全空行
data = [row for row in data if any(v is not None for v in row.values())]
# 2. 数值列用中位数填充空值
for header in headers:
numeric_vals = [float(v) for v in values if v is not None]
median = sorted(numeric_vals)[len(numeric_vals) // 2]
for row in data:
if row.get(header) is None:
row[header] = median
# 3. 删除重复行
# ...
return data
注意:这里用中位数而不是均值来填充空值: : 因为中位数不受极端值影响,更加稳健。这是 AI 分析时通常会给出的建议。
五、AI 数据分析
数据干净了,开始真正的「智能」部分: : 用自然语言向数据提问。
5.1 数据摘要生成
AI 无法一次「看」完几千行数据。我们需要先给它一个数据摘要: : 就像给数据分析师一份汇总统计表:
def _create_data_summary(self, data):
"""为 AI 创建数据摘要"""
summary = [f"数据集共 {len(data)} 行"]
for header in data[0].keys():
values = [row.get(header) for row in data]
non_null = [v for v in values if v is not None]
if all(isinstance(v, (int, float)) for v in non_null):
# 数值列:显示范围、均值、合计
summary.append(
f"- {header}(数值):"
f"范围 [{min(non_null)}, {max(non_null)}],"
f"均值 {sum(non_null)/len(non_null):.1f}"
)
else:
# 文本列:显示不同值和示例
unique = set(str(v) for v in non_null)
summary.append(f"- {header}({len(unique)}个不同值)")
return "\n".join(summary)
5.2 自然语言提问
有了摘要,就能用自然语言向 AI 提问了:
class AIAnalyzer:
def analyze(self, data, question):
"""AI 分析数据并回答问题"""
summary = self._create_data_summary(data)
prompt = f"""作为资深数据分析师,请分析以下数据。
数据摘要:
{summary}
用户问题:{question}
要求:用具体数值支撑分析结论,发现模式和异常。"""
return self.llm.chat(prompt, temperature=0.3)
试试这些提问:
- 「哪些产品线的销售额在持续增长?哪些在下滑?」
- 「有没有明显的季节性规律?」
- 「华东和华南的利润率差异有多大?原因可能是什么?」
- 「给出提升销售额的 3 条建议」
AI 会像一个真正的数据分析师一样,结合数据给出洞察。
六、自动报表生成
分析完了,最后一步:把结果变成一份专业的 Excel 报表。
6.1 汇总统计表
按产品线(或任意维度)自动汇总:
# 按产品线汇总
product_stats = {}
for row in data:
product = row.get("产品线")
sales = row.get("销售额(万元)", 0) or 0
if product not in product_stats:
product_stats[product] = {"sales": 0, "count": 0}
product_stats[product]["sales"] += sales
product_stats[product]["count"] += 1
6.2 专业格式
不只是数据,还有格式:
# 表头样式
header_font = Font(bold=True, color="FFFFFF")
header_fill = PatternFill(start_color="2B579A", end_color="2B579A", fill_type="solid")
# 条件格式:销售额列颜色渐变(红-黄-绿)
ws_summary.conditional_formatting.add(
"B5:B20",
ColorScaleRule(start_type="min", start_color="F8696B",
mid_type="percentile", mid_value=50, mid_color="FFEB84",
end_type="max", end_color="63BE7B")
)
6.3 自动图表
柱状图、折线图、饼图: : 一个不少:
from openpyxl.chart import BarChart, PieChart, Reference
# 柱状图:各产品线销售额对比
bar_chart = BarChart()
bar_chart.title = "各产品线总销售额对比"
bar_chart.style = 10 # 使用预定义专业样式
data_ref = Reference(ws, min_col=2, min_row=1, max_row=6)
cats_ref = Reference(ws, min_col=1, min_row=2, max_row=6)
bar_chart.add_data(data_ref, titles_from_data=True)
bar_chart.set_categories(cats_ref)
# 设置专业配色
colors = ["2B579A", "ED7D31", "A5A5A5", "FFC000", "5B9BD5"]
for i, color in enumerate(colors):
bar_chart.series[i].graphicalProperties.solidFill = color
ws.add_chart(bar_chart, "A10")
# 饼图:各产品线占比
pie_chart = PieChart()
pie_chart.title = "各产品线销售额占比"
# 添加数据标签(显示百分比和名称)
pie_chart.dataLabels.showPercent = True
pie_chart.dataLabels.showCatName = True
最终生成的 Excel 文件包含 3 个工作表:
- 销售数据:原始数据(带格式和条件格式)
- 汇总分析:按维度汇总的统计表(带颜色渐变)
- 可视化图表:柱状图 + 饼图
七、运行演示
cd 02-excel-automation
# 完整演示(生成示例数据 → 读取 → 清洗 → 分析 → 报表)
python main.py --demo
# 分析你自己的 Excel 文件
python main.py --input /path/to/your_data.xlsx --output report.xlsx
演示会生成两个文件:
- output/demo_sales_data.xlsx : 示例数据
- output/demo_excel_report.xlsx : 分析报表(含图表)
八、小结
这一期我们实现了 AI + Excel 自动化的完整流程:
- 📖 智能读取:自动识别表头、类型、空值,无需人工标注
- 🔍 AI 质量分析:自动发现数据问题,给出清洗方案
- 🧹 智能清洗:按 AI 建议自动修复缺失值和异常值
- 🤖 AI 分析:自然语言提问,AI 给出数据洞察
- 📊 自动报表:一键生成带图表、条件格式的专业报表
核心思路就是:用 AI 替代你在 Excel 中 80% 的重复操作。你只需要搞清楚「我想知道什么」,剩下的交给代码。
下一期,我们来攻克 PPT 自动生成: : 输入一个主题,AI 自动生成完整的演示文稿,从大纲到内容到排版,一步到位。
完整代码已上传到 Gitee:
https://gitee.com/genesisesNoun/ai-office-tutorial
本教程为「CV技术笔记」公众号 AI 办公自动化实战专题第 2 期。代码详细注释完备,每期独立可运行。