基于 skill-creator 构建的本地 AI Skill,负责 Excel 报价单的生成。支持标准单列表格和横向 3 列布局两种模式。
确保已安装依赖:
cd price-list-generator
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
准备配置文件:
config/company.json 写入公司信息(见下方数据格式)data/local_products.csv 写入本地产品库场景:从本地库生成报价单
python main.py --action search_csv --query "mouse"
# 获得产品数据后
python main.py --action generate_excel --output ./output/quote.xlsx
场景:Claude Code 一体化调用(推荐)
Claude Code 可以直接构造 JSON 参数调用:
python main.py --json '{"action":"generate_excel","products":[...],"company_info":{...}}'
场景:使用规则包抓取 1688 并生成报价
# 调用 dg-1688 规则包
from rules.dg_1688.build_quote_from_detail import build_quote
output = build_quote("https://detail.1688.com/offer/xxx.html", fx=7.2)
print(output) # ./output/dg1688_template_quote_xxx.xlsx
生成 Excel 时传入的产品数据格式:
{
"sku": "MS-001",
"name": "Wireless Mouse 2.4G",
"image_url": "https://example.com/mouse.jpg",
"price": 25.00,
"specs": "Color: Black; DPI: 1600",
"moq": 100,
"remarks": "Lead time: 7 days",
"source": "csv"
}
字段说明:
sku: 产品唯一标识(可选)name: 产品名称(必填)image_url: 图片 URL 或本地路径(可选)price: 最终报价(必填,已包含 markup 和汇率换算)specs: 规格描述(可选)moq: 最小起订量(可选,默认 1)remarks: 备注(可选)source: 数据来源标记(可选,"csv" 或 "web")配置文件 config/company.json 格式:
{
"name": "Global Trade Co., Ltd.",
"logo_path": "./assets/logo.png",
"website": "https://www.example.com",
"contact_name": "Jane Smith",
"phone": "+86-138-0000-0000",
"whatsapp": "+86-138-0000-0000",
"email": "sales@example.com",
"address": "Room 101, Building A, Shenzhen, China"
}
本 Skill 支持通过规则包扩展对不同电商网站的抓取支持。
rules/
├── dg-1688/ # 1688.com 专用规则
│ ├── SKILL.md # 规则说明文档
│ ├── extract_sku_selection.js # 标准 SKU 提取脚本
│ ├── extract_sku_separated.js # 分离式(颜色/尺码分开)提取脚本
│ └── build_quote_from_detail.py # Python 执行入口
└── {new-rule}/ # 新增规则包目录
├── SKILL.md
└── ...
| 规则名 | 适用网站 | 特殊功能 |
|---|---|---|
| :--- | :--- | :--- |
dg-1688 | 1688.com | 横向 3 列布局、颜色×尺码笛卡尔积、产品名称加序号 |
# 方式 1:直接调用规则包
from rules.dg_1688.build_quote_from_detail import build_quote
output = build_quote(detail_url, fx=DEFAULT_FX)
# 方式 2:通过主入口动态执行(推荐,适合多客户规则解耦)
python main.py --action run_rule --rule dg-1688 --url "https://detail.1688.com/offer/xxx.html"
# 方式 3:主入口 + 扩展参数
python main.py --action run_rule \
--rule dg-1688 \
--url "https://detail.1688.com/offer/xxx.html" \
--rule-params '{"fx":7.2}'
规则加载约定:
rules/{rule-name}/build_quote_from_detail.pybuild_quote(url, **kwargs) -> output_path- 与 _ 规则名互通(例如 dg-1688 与 dg_1688)从本地 CSV 检索产品。
python main.py --action search_csv --query "mouse"
参数:
--query: 搜索关键词(SKU 精确匹配 或 Name 模糊匹配)--csv: CSV 文件路径(可选,默认 ./data/local_products.csv)返回:
{
"status": "ok",
"query": "mouse",
"results": [...],
"count": 2
}
生成 Excel 报价单。
方式 1:使用配置文件中的公司信息和全部产品
python main.py --action generate_excel --output ./output/quote.xlsx
方式 2:指定产品和公司信息(JSON 传参)
python main.py --action generate_excel \
--products '[{"sku":"MS-001","name":"Mouse","price":25,"specs":"DPI:1600","moq":100}]' \
--company '{"name":"My Co.","website":"https://example.com"}' \
--output ./output/quote.xlsx
参数:
--products: 产品列表 JSON 字符串(可选,默认使用 CSV 全部产品)--company: 公司信息 JSON 字符串(可选,默认使用配置文件)--output: 输出文件路径(可选,默认 ./output/quotation_{timestamp}.xlsx)--temp-dir: 临时图片目录(可选,默认 ./tmp/images)返回:
{
"status": "ok",
"file_path": "./output/quotation_20260326_143052.xlsx",
"warnings": []
}
适合 Claude Code 直接调用,单条命令完成所有操作:
python main.py --json '{
"action": "generate_excel",
"products": [
{
"sku": "MS-001",
"name": "Wireless Mouse 2.4G",
"image_url": "https://example.com/mouse.jpg",
"price": 25.00,
"specs": "Color: Black; DPI: 1600",
"moq": 100,
"remarks": "Lead time: 7 days"
}
],
"company_info": {
"name": "Global Trade Co., Ltd.",
"logo_path": "./assets/logo.png",
"website": "https://www.example.com",
"contact_name": "Jane Smith",
"phone": "+86-138-0000-0000",
"whatsapp": "+86-138-0000-0000",
"email": "sales@example.com"
},
"output_path": "./output/quotation.xlsx",
"temp_dir": "./tmp/images"
}'
本 Skill 不直接抓取网页,需要配合 web-access Skill 使用。
完整工作流示例:
> "抓取这个 1688 链接 https://example.com/product 生成报价单,利润加 30%"
web-access 抓取商品信息:/navigate 打开页面/scroll 滚动加载图片/eval 提取产品标题、价格、图片 URLprice * 1.30```bash
python main.py --json '{"action":"generate_excel","products":[...],"company_info":{...}}'
```
包含三个区域:
$25.00适用于产品数量多、需要紧凑展示的场景:
第1行(图片行): [图片1] [链接1] [空] [图片2] [链接2] [空] [图片3] [链接3] [空]
第2行(数据行): [名称] [CNY] [USD] [名称] [CNY] [USD] [名称] [CNY] [USD]
列宽设置:
产品名称处理:
USD 价格计算:
| 错误场景 | 处理策略 |
|---|---|
| :--- | :--- |
| 图片下载失败 | 显示 "No Image" 占位符,继续生成 |
| 公司信息缺失 | 返回错误,不生成文件 |
| 产品列表为空 | 返回错误 |
| CSV 不存在 | search_csv 返回空列表,不报错 |
| Logo 加载失败 | 跳过 Logo,其余正常生成 |
price-list-generator/
├── main.py # 主入口
├── csv_manager.py # CSV 检索
├── excel_builder.py # Excel 生成
├── image_handler.py # 图片处理
├── SKILL.md # 本文件
├── rules/ # 抓取规则包目录
│ └── dg-1688/ # 1688.com 规则
│ ├── SKILL.md
│ ├── extract_sku_selection.js
│ ├── extract_sku_separated.js
│ └── build_quote_from_detail.py
├── config/
│ └── company.json # 公司信息配置
├── assets/
│ └── logo.png # 公司 Logo
├── data/
│ └── local_products.csv # 本地产品库
├── tmp/
│ └── images/ # 临时图片下载目录
└── output/ # 默认报价单输出目录
"$"#,##0.00),确保在 Excel 中是真正的数字而非文本_sum 缩略图后缀python scripts/smoke_test.py
通过标准:
main.py --help 可执行search_csv 返回 JSON 且 status=okgenerate_excel 成功生成 output/smoke_test_quote.xlsx| 版本 | 说明 |
|---|---|
| :--- | :--- |
| 1.0 | 初版:标准单列布局、CSV 支持、Excel 生成 |
| 1.1 | 新增:横向 3 列布局、dg-1688 规则包、产品名称加序号 |
共 1 个版本