Install
openclaw skills install @shaolongcai/quotation-generator专业的报价单生成助手。根据用户上传的物料价格表和Excel报价模板,自动分析模板结构、匹配产品价格、计算总价,生成填充完整的报价单Excel。触发场景:用户需要生成报价单、填写报价模板、根据物料清单计算报价、处理多型号产品选型确认、适配不同格式的Excel报价模板。关键词:报价单、报价模板、物料清单、价格计算、生成报价、填写报价、Excel模板适配。
openclaw skills install @shaolongcai/quotation-generator根据用户提供的 物料价格表 和 Excel报价模板,自动完成:
核心原则:用户必须先上传物料价格表(Excel/CSV),才能开始报价流程。
启动报价流程前,必须确认以下两项,缺一不可:
| 条件 | 要求 | 缺失时的处理 |
|---|---|---|
| 物料价格表 | 用户上传的 Excel/CSV,包含 materialName、specModel、retailPrice 等字段 | 必须要求用户先上传,流程无法继续 |
| 报价模板 | 用户上传的 Excel 报价单模板 | 若未上传,使用用户最近一次上传的文件,或要求上传 |
物料价格表最低要求:
产品名称(或 materialName/品名/物料名)、规格型号(或 specModel/型号)、单价(或 retailPrice/价格/金额)| 关键词 | 标准字段名 |
|---|---|
| 产品名称/品名/物料/物料名称/商品名称 | materialName |
| 规格/型号/规格型号/Spec | specModel |
| 单价/价格/零售价/金额/单价(元)/Price | retailPrice |
| 单位/计量单位/Unit | unit |
| 备注/Note | remark |
陷阱:多行表头时,取最靠近数据的那一行作为有效表头。合并单元格要展开到每个子单元格。
start_rowtemplate_rows| 标签关键词 | 标准字段 |
|---|---|
| 客户/甲方/买方/客户名称 | customer_name |
| 日期/报价日期/填表日期 | quotation_date |
| 单号/报价单号/编号 | quotation_no |
| 电话/联系电话/手机 | contact_phone |
| 总计/合计/总金额/总价 | total_amount |
=C*D),标记为 has_formula: true。陷阱:合并单元格只输出一个坐标。不要误把"说明""备注""报价单位"等非明细表区域识别为列表区域。
materialName 只对应一个 specModel → 直接确定materialName 对应多个 specModel → 必须向用户发起澄清,列出所有可选型号及对应价格,请用户确认start_row + Nstart_row(表头行),必须从 start_row + 1 开始1,若用户在输入中明确指定了数量则使用指定值数量 × 单价 填入金额列fill_operations 结构,参见 references/data-schema.md。陷阱:
fill_operations中各列值的顺序必须与产品顺序严格一致,避免名称、数量、价格错位。
openpyxl 遍历 fill_operations,写入对应单元格:
col 用 column_index_from_string() 转为列索引row 必须 > 0,col 不能为空不同用户的报价模板格式差异很大,以下是常见场景的处理策略:
| 场景 | 处理策略 |
|---|---|
| 表头不在第一行 | 通过关键词扫描定位真实表头行,不假设固定位置 |
| 列顺序不同 | 通过表头文本模糊匹配列字段,动态生成列映射 |
| 缺少某些列(如无规格列) | 只填存在的列,缺失列留空或跳过 |
| 金额列已有公式 | 检测公式,不覆盖,只填数量和单价 |
| 模板只有预留1行 | 在 start_row+1 开始填入,不插入新行(保持简单) |
| 多Sheet模板 | 默认分析第一个含报价关键词的 Sheet |
| 标签在单元格左侧(如"客户:XXX") | 识别"客户"标签,取右侧单元格作为填充位置 |
| 规则 | 说明 |
|---|---|
| 前置条件 | 必须先有物料价格表,否则流程无法开始 |
| 型号澄清 | 同名产品多型号时必须澄清,禁止自行选择 |
| 表头保护 | 产品数据必须从 start_row + 1 开始,禁止覆盖表头 |
| 列映射自适应 | 通过关键词模糊匹配,不假设固定列顺序 |
| 顺序一致 | fill_operations 中字段顺序与产品顺序必须对齐 |
| 公式保护 | 已有公式的单元格优先保留公式,或清除后写入 |
| 文件唯一 | 生成文件使用 UUID 后缀,避免覆盖历史报价 |
start_row 会覆盖表头,必须从 start_row + 1 开始fill_operations 中各列值的顺序与产品清单顺序不一致,导致名称、数量、价格错位