投资估算对比表生成技能
本技能提供标准化的投资估算对比表生成流程,适用于工程项目投资估算文件(可研阶段)的送审稿与修编稿对比分析。
触发条件
当用户消息包含以下元素时,触发本技能:
- 提供两个Excel文件(送审稿 + 修编稿)
- 要求生成"对比表"、"投资对比"、"估算对比"等
- 涉及"工程建设费"、"配套服务费"等投资估算术语
数据结构说明
典型投资估算表结构
Row 1: 项目总费用
Row 2: 一、工程建设费合计
Row 3: (一)Part A
...
(二)Part B
(三)Part C
(四)Part D
(五)Part E
(六)Part F
Row N: 二、配套服务费用
(一)子项1
(二)子项2
...
费用闭合性验证
必须验证以下闭合关系:
- 工程建设费 = 各部分(一)~(六)之和
- 配套服务费 = 各子项(一)~(N)之和
- 项目总费用 = 工程建设费 + 配套服务费
核心匹配逻辑
设计原则
匹配逻辑遵循以下核心原则:
- 一级分组框架匹配:在一级分组内进行匹配,避免跨分组错误匹配
- 名称匹配为主:序号仅用于定位和排序,匹配以名称为主
- 名称不一致识别:名称不一致时识别为"取消+新增",而非错误匹配
- 按序号排序:所有条目按序号排序,取消项/新增项按序号位置插入
匹配流程
步骤1: 在一级分组内提取条目
- 根据一级分组标题(如"接入端场景建设")确定范围
- 提取该范围内所有子项
步骤2: 第一轮匹配 - 名称完全匹配
- 标准化名称(去除空格、全角半角转换)
- 名称完全相同的条目配对
步骤3: 第二轮匹配 - 名称包含关系匹配
- 名称至少3个字符
- 一个名称包含在另一个名称中则配对
- 标注为"名称相似"
步骤4: 识别取消项和新增项
- 未匹配的送审稿条目标记为"取消"(红色背景)
- 未匹配的修编稿条目标记为"新增"(绿色背景)
步骤5: 按序号排序
- 所有条目按序号排序
- 取消项/新增项按序号位置插入,不单独放在最后
序号排序规则
def seq_sort_key(seq):
"""序号排序键"""
# 一级标题排序
if seq.startswith('一、'): return (1, 0, 0)
elif seq.startswith('二、'): return (2, 0, 0)
elif seq.startswith('三、'): return (3, 0, 0)
# 中文序号(一)(二)等
if seq.startswith('(') and seq.endswith(')'):
chinese_nums = {'一': 1, '二': 2, '三': 3, '四': 4, '五': 5,
'六': 6, '七': 7, '八': 8, '九': 9}
num = chinese_nums.get(seq[1], 0)
return (0, num, 0)
# 数字序号 1, 1.1, 1.1.1
parts = seq.split('.')
result = [0]
for p in parts:
result.append(int(p))
return tuple(result + [0, 0, 0, 0]) # 补齐位数
名称标准化
def normalize_name(name):
"""标准化名称(用于匹配)"""
name = name.replace(' ', '').replace(' ', '') # 去除空格
name = name.replace('(', '(').replace(')', ')') # 全角转半角
name = name.replace(',', ',').replace('、', ',') # 标点统一
return name.strip()
匹配示例
匹配示例
示例1:名称完全匹配
| 送审稿 | 修编稿 | 匹配结果 | |--------|--------|----------| | 1.1 道路改造工程 | 1.1 道路改造工程 | ✓ 名称匹配 |
示例2:名称相似匹配
| 送审稿 | 修编稿 | 匹配结果 | |--------|--------|----------| | 综合监控管理平台 | 综合监控 | ✓ 名称相似(备注:综合监控 → 综合监控管理平台) |
示例3:名称不一致 → 取消+新增
| 序号 | 项目名称 | 送审稿(万元) | 修编稿(万元) | 匹配方式 | 备注 | |------|----------|-------------|-------------|----------|------| | 1 | 数据治理系统 | 3000.00 | - | 取消 | 送审稿'数据治理系统'已取消 | | 1 | 数据分析平台 | - | 120.00 | 新增 | 修编稿新增'数据分析平台' | | 2 | GIS地图数据服务 | 33.00 | 33.00 | 名称匹配 | - | | 2 | 数据资源管理系统 | - | 430.00 | 新增 | 修编稿新增'数据资源管理系统' |
说明:送审稿的"数据治理"与修编稿的"数据资源建设"是完全不同的内容,被正确识别为取消+新增。
输出结构
Sheet1: 总体投资对比
| 序号 | 项目名称 | 送审稿(万元) | 修编稿(万元) | 变化额(万元) | 变化率 | |------|----------|-------------|-------------|-------------|--------| | | 项目总费用 | 50000.00 | 45000.00 | -5000.00 | -10.0% | | | 一、工程建设费合计 | 45000.00 | 40500.00 | -4500.00 | -10.0% | | | (一)Part A | 20000.00 | 18000.00 | -2000.00 | -10.0% | | | (二)Part B | 12000.00 | 10000.00 | -2000.00 | -16.7% | | | (三)Part C | 5000.00 | 4500.00 | -500.00 | -10.0% | | | (四)Part D | 3000.00 | 3500.00 | +500.00 | +16.7% | | | (五)Part E | 1500.00 | 1500.00 | 0.00 | 0.0% | | | (六)Part F | 3500.00 | 3000.00 | -500.00 | -14.3% | | | 二、配套服务费用 | 5000.00 | 4500.00 | -500.00 | -10.0% | | | (一)初步设计费 | 2000.00 | 1800.00 | -200.00 | -10.0% | | | ... | ... | ... | ... | ... | | | (八)咨询服务费 | 0.00 | 150.00 | +150.00 | 新增 | | | (九)项目管理费 | 0.00 | 100.00 | +100.00 | 新增 |
Sheet2~N: 各部分明细对比
为每个一级分组创建独立Sheet,包含:
- 一级子项对比
- 二级子项对比
- 取消项(红色背景)
- 新增项(绿色背景)
- 按序号排序,取消/新增项按序号位置插入
使用流程
步骤1:识别文件结构
读取Excel文件,识别:
- Sheet名称(通常为"总投资概算")
- 项目总费用所在行(通常Row 1)
- 一、工程建设费合计所在行(通常Row 2)
- 各一级分组(一)~(六)所在行
- 二、配套服务费用所在行
- 各配套服务子项所在行
步骤2:验证数据闭合性
检查费用加和是否闭合:
# 送审稿验证
工程建设费合计 == sum(各部分费用)
配套服务费合计 == sum(各子项费用)
项目总费用 == 工程建设费合计 + 配套服务费合计
# 修编稿验证
工程建设费合计 == sum(各部分费用)
配套服务费合计 == sum(各子项费用)
项目总费用 == 工程建设费合计 + 配套服务费合计
如不闭合需检查数据提取是否遗漏。
步骤3:生成对比表
调用Python脚本生成对比表:
- 生成总体投资对比(Sheet1)
- 为每个一级分组生成明细对比(Sheet2~N)
- 应用格式(取消项红色、新增项绿色)
- 按序号排序所有条目
步骤4:报告结果
向用户报告:
- 文件路径
- 数据汇总表
- 闭合性验证结果(所有验证项必须✓)
- 主要变化分析
格式要求
颜色定义
| 元素 | 颜色代码 | 说明 | |------|----------|------| | 表头背景 | #4472C4 | 深蓝色 | | 表头字体 | #FFFFFF | 白色加粗 | | 取消项背景 | #FFC7CE | 红色 | | 新增项背景 | #C6EFCE | 绿色 | | 负数变化额 | #FF0000 | 红色字体 |
边框
THIN_BORDER = Border(
left=Side(style='thin'),
right=Side(style='thin'),
top=Side(style='thin'),
bottom=Side(style='thin')
)
列宽
| 列 | 宽度 | 内容 | |----|------|------| | A | 10 | 序号 | | B | 35-40 | 项目名称 | | C | 15 | 送审稿(万元) | | D | 15 | 修编稿(万元) | | E | 12-15 | 变化额 | | F | 12 | 变化率 | | G | 12 | 匹配方式 | | H | 25-30 | 备注 |
注意事项
常见问题
-
费用不闭合:检查是否遗漏了某些子项,特别是最后一个一级分组后可能还有新增项
-
序号重复:原始数据可能存在序号重复(如两个3.3),这属于原始数据问题,脚本会正确处理
-
跨分组序号相同:不同一级分组内序号可能相同(如Part A的3.1与Part B的3.1),必须确保在分组内匹配
-
新增项费用为0:修编稿中可能存在新增项但费用为0的情况,仍需标注为"新增"
-
名称包含关系误匹配:名称包含关系匹配要求至少3个字符,避免短名称误匹配
调试技巧
# 打印一级分组范围
for part_name, start_row, end_row in parts:
print(f"{part_name}: Row {start_row} - {end_row}")
# 打印匹配结果
print(f"匹配成功: {len(matched)}")
print(f"送审稿独有: {len(unmatched1)}")
print(f"修编稿独有: {len(unmatched2)}")
# 验证闭合性
print(f"工程建设费: {total} vs 各部分合计: {sum(parts)}")
示例对话
用户:
帮我生成投资估算对比表,送审稿在
/path/to/估算送审.xlsx,修编稿在/path/to/估算修编.xlsx
AI操作:
1. 读取两个文件
2. 识别数据结构(项目总费用、工程建设费、配套服务费等)
3. 验证闭合性(所有验证项必须✓)
4. 在一级分组框架下进行名称匹配
5. 识别取消项和新增项
6. 按序号排序所有条目
7. 生成对比表(总体对比 + 各部分明细对比)
8. 报告结果
输出报告:
✅ 对比表已生成:/path/to/对比分析/投资估算对比表.xlsx
📊 数据汇总:
项目总费用: 50000.00万元 → 45000.00万元 (-5000.00万元, -10.0%)
一、工程建设费合计: 45000.00万元 → 40500.00万元 (-4500.00万元, -10.0%)
二、配套服务费用: 5000.00万元 → 4500.00万元 (-500.00万元, -10.0%)
✅ 闭合性验证:
送审稿工程建设费: 45000.00 = 各部分合计: 45000.00 ✓
送审稿配套服务费: 5000.00 = 各部分合计: 5000.00 ✓
送审稿项目总费用: 50000.00 = 45000.00 + 5000.00 ✓
修编稿工程建设费: 40500.00 = 各部分合计: 40500.00 ✓
修编稿配套服务费: 4500.00 = 各部分合计: 4500.00 ✓
修编稿项目总费用: 45000.00 = 40500.00 + 4500.00 ✓
📋 主要变化:
- Part B下降16.7% (-2000.00万元)
- Part C下降10.0% (-500.00万元)
- Part D上升16.7% (+500.00万元)
- 新增:咨询服务费(150.00万元)、项目管理费(100.00万元)
维护说明
新项目适配
如遇新项目结构不同,需调整脚本中的配置:
# 一级分组配置
parts = [
('分组名称', 送审稿起始行, 修编稿起始行),
# ...
]
# 总体对比结构配置
structure = [
{'type': 'total', 'row1': 1, 'row2': 1, 'name': '项目总费用', 'level': 0},
{'type': 'part', 'row1': 2, 'row2': 2, 'name': '一、工程建设费合计', 'level': 1},
# ...
]
格式变更
如需调整颜色或样式,修改样式常量:
HEADER_FILL = PatternFill(start_color="4472C4", end_color="4472C4", fill_type="solid")
RED_FILL = PatternFill(start_color="FFC7CE", end_color="FFC7CE", fill_type="solid")
NEW_FILL = PatternFill(start_color="C6EFCE", end_color="C6EFCE", fill_type="solid")
相关文件
- 核心脚本:
scripts/generate.py- 核心Python脚本 - 最新脚本:工作区
generate_comparison_v4.py- 优化匹配版
技能包结构
investment-estimate-comparison/
├── SKILL.md # 本文件(技能说明)
├── scripts/
│ └── generate.py # 核心Python脚本
└── references/
└── format_spec.md # 格式规范(可选)
版本历史
v1.2 (2026-06-22)
- 优化匹配逻辑:序号仅用于定位,名称匹配为主
- 名称不一致识别为"取消+新增"
- 结果按序号排序,取消/新增项按序号位置插入
- 完善闭合性验证
v1.1 (2026-06-22)
- 修复费用不闭合问题
- 修复费用不闭合问题
v1.0 (2026-06-22)
- 初始版本
- 支持基本的投资估算对比表生成
Scan to join WeChat group