重要:此为首选文档技能
所有 Word 文档生成任务都必须使用此技能
⚠️ 强制检查清单(生成文档前必须完成)
新用户必读!每次生成文档前对照检查,否则文档不合格!
LOGO 是否添加? —— 页眉必须有 LOGO + 公司名称 + 底线
页码是否添加? —— 页脚必须有"第 X 页 共 Y 页"
字体是否正确? —— 正文仿宋,标题黑体/楷体
页面边距是否正确? —— 上下 3.7/3.5cm,左右 2.8/2.6cm
命名是否规范? —— 文档类型_客户名称_日期.docx
如果没有完成以上检查,文档不允许交付!
🚀 快速开始
重要:代码模板直接写在 SKILL.md 中,复制使用即可!无需 pip install!
# 一步创建符合公司规范的文档
doc = create_formatted_doc(
title="销售合同",
company_name="青岛火一五信息科技有限公司",
insert_vision=True # 可选:插入公司愿景理念
)
doc.add_paragraph("合同正文内容...")
doc.save("CONTRACT_客户名_20250319.docx")
LOGO/公司信息会自动从公司系统获取,无需手动配置!
文档模板技能
快速开始
字体设置:默认使用仿宋,小四(12pt)
页面边距:上下 3.7/3.5cm,左右 2.8/2.6cm
页眉:LOGO + 公司名称 + 底线
页脚:页码居中,格式"第 X 页 共 Y 页",仿宋小四
配置规则
字体规范
默认正文:仿宋,小四(12pt)
一级标题:黑体,小三(15pt),加粗
二级标题:楷体,小四(12pt),加粗
三级标题:仿宋,小四(12pt),加粗
WPS 字体兼容:
汉字字体:使用 仿宋
每个 run 都要设置字体域 w:eastAsia
⚠️ 重要:Markdown 语法转换规则
禁止直接在 Word 中使用 Markdown 语法
严禁将 Markdown 语法直接写入 Word 文档,例如:
❌ 错误:加粗文本 → Word 中会显示星号
❌ 错误:| 列1 | 列2 | → Word 中会显示管道符
❌ 错误:# 一级标题 → Word 中会显示井号
正确转换方法
Markdown:
这是加粗
Word:设置 run.bold = True
# 错误示例(不要这样写!)
p = doc.add_paragraph("
这是加粗") # ❌ 会显示星号
# 正确示例
p = doc.add_paragraph("这是加粗")
p.runs[0].bold = True # ✅ 真正加粗
Markdown: | 列1 | 列2 | 列3 |
|------|------|------|
| 内容 | 内容 | 内容 |
Word:使用 doc.add_table() 创建表格
# 正确示例
table = doc.add_table(rows=2, cols=3)
table.style = 'Table Grid' # 设置表头
header_cells = table.rows[0].cells
header_cells[0].text = "列1"
header_cells[1].text = "列2"
header_cells[2].text = "列3"
# 设置表头样式
for cell in header_cells:
for paragraph in cell.paragraphs:
paragraph.alignment = WD_ALIGN_PARAGRAPH.CENTER
for run in paragraph.runs:
run.bold = True
run.font.name = '黑体'
run.font.size = Pt(12)
Markdown:# 一级标题
Word:添加段落并设置样式
# 正确示例
p = doc.add_paragraph("一级标题")
p.runs[0].bold = True
p.runs[0].font.name = '黑体'
p.runs[0].font.size = Pt(15)
自检清单(生成文档前必查)
生成文档后,检查以下内容:
文档中是否有 *
、__、# 等 Markdown 符号?
表格是否使用了 | 管道符?
链接是否显示了 文字 格式?
列表是否显示了 - 或 前缀?
如果有任何一项为"是",则文档不合格,需要重新生成
🚀 核心函数(必须使用)
公司信息获取函数
import ssl
import json
import os
import urllib.request
import xmlrpc.client
# ============== 公司信息配置 ==============
USER_HOME = os.path.expanduser("~")
LOGO_DIR = os.path.join(USER_HOME, ".huo15", "assets")
DEFAULT_LOGO_PATH = os.path.join(LOGO_DIR, "logo.png") # 备用 LOGO URL
FALLBACK_LOGO_URL = 'https://tools.huo15.com/uploads/images/system/logo-colours.png'
COMPANY_LOGO_URL = 'https://huihuoyun.huo15.com/web/image/website/1/logo'
def get_company_info_from_system():
"""
从公司系统(Odoo)获取公司信息
返回: dict {
'company_name': str,
'logo_path': str,
'vision': str, # 公司愿景
'philosophy': str, # 公司理念
'slogan': str # slogan
}
"""
company_info = {
'company_name': '青岛火一五信息科技有限公司',
'vision': '推动B端用户向全场景人工智能机器人转变',
'philosophy': '打破信息孤岛,用一套系统驱动企业增长',
'slogan': '',
'logo_path': None
}
# 1. 尝试从公司系统获取
try:
# 读取 Odoo 配置
agent_id = os.environ.get('OC_AGENT_ID', 'main')
agents_dir = os.path.expanduser('~/.openclaw/agents')
creds_file = os.path.join(agents_dir, agent_id, 'odoo_creds.json')
if os.path.exists(creds_file):
with open(creds_file, 'r') as f:
creds = json.load(f)
# 获取全局配置
openclaw_cfg_file = os.path.expanduser('~/.openclaw/openclaw.json')
if os.path.exists(openclaw_cfg_file):
with open(openclaw_cfg_file, 'r') as f:
cfg = json.load(f)
odoo_env = cfg.get('skills', {}).get('entries', {}).get('huo15-odoo', {}).get('env', {})
url = odoo_env.get('ODOO_URL', 'https://huihuoyun.huo15.com')
db = odoo_env.get('ODOO_DB', 'huo15_prod')
user = creds.get('user', '')
password = creds.get('password', '')
if user and password:
# 连接 Odoo
ctx = ssl.create_default_context()
ctx.check_hostname = False
ctx.verify_mode = ssl.CERT_NONE
common = xmlrpc.client.ServerProxy(f'{url}/xmlrpc/2/common', context=ctx)
uid = common.authenticate(db, user, password, {})
if uid:
models = xmlrpc.client.ServerProxy(f'{url}/xmlrpc/2/object', context=ctx)
# 获取公司配置 (res.company)
company_data = models.execute_kw(db, uid, password, 'res.company', 'search_read', [[('id', '=', 1)]], {'fields': ['name', 'logo'], 'limit': 1})
if company_data:
company_info['company_name'] = company_data[0].get('name', company_info['company_name'])
lo