返回 Skill 列表
extension
分类: 数据与分析无需 API Key

投资估算对比表生成

生成投资估算对比表(送审稿 vs 修编稿)。自动读取Excel文件,进行名称匹配、费用闭合验证,生成带格式的对比表。适用于工程项目投资估算的可研阶段对比分析。

person作者: user_22a5aaeahubcommunity

投资估算对比表生成技能

本技能提供标准化的投资估算对比表生成流程,适用于工程项目投资估算文件(可研阶段)的送审稿与修编稿对比分析。

触发条件

当用户消息包含以下元素时,触发本技能:

  • 提供两个Excel文件(送审稿 + 修编稿)
  • 要求生成"对比表"、"投资对比"、"估算对比"等
  • 涉及"工程建设费"、"配套服务费"等投资估算术语

数据结构说明

典型投资估算表结构

Row 1: 项目总费用
Row 2: 一、工程建设费合计
Row 3: (一)Part A
  ...
  (二)Part B
  (三)Part C
  (四)Part D
  (五)Part E
  (六)Part F
Row N: 二、配套服务费用
  (一)子项1
  (二)子项2
  ...

费用闭合性验证

必须验证以下闭合关系:

  1. 工程建设费 = 各部分(一)~(六)之和
  2. 配套服务费 = 各子项(一)~(N)之和
  3. 项目总费用 = 工程建设费 + 配套服务费

核心匹配逻辑

设计原则

匹配逻辑遵循以下核心原则:

  1. 一级分组框架匹配:在一级分组内进行匹配,避免跨分组错误匹配
  2. 名称匹配为主:序号仅用于定位和排序,匹配以名称为主
  3. 名称不一致识别:名称不一致时识别为"取消+新增",而非错误匹配
  4. 按序号排序:所有条目按序号排序,取消项/新增项按序号位置插入

匹配流程

步骤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脚本生成对比表:

  1. 生成总体投资对比(Sheet1)
  2. 为每个一级分组生成明细对比(Sheet2~N)
  3. 应用格式(取消项红色、新增项绿色)
  4. 按序号排序所有条目

步骤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 | 备注 |

注意事项

常见问题

  1. 费用不闭合:检查是否遗漏了某些子项,特别是最后一个一级分组后可能还有新增项

  2. 序号重复:原始数据可能存在序号重复(如两个3.3),这属于原始数据问题,脚本会正确处理

  3. 跨分组序号相同:不同一级分组内序号可能相同(如Part A的3.1与Part B的3.1),必须确保在分组内匹配

  4. 新增项费用为0:修编稿中可能存在新增项但费用为0的情况,仍需标注为"新增"

  5. 名称包含关系误匹配:名称包含关系匹配要求至少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)

  • 初始版本
  • 支持基本的投资估算对比表生成