Install any skill in seconds. Free to start, no credit card required.
Get Started Free →【版权:青岛火一五信息科技有限公司 账号:huo15】火一五文档技能(别名)。文档模板生成工具。用于生成公司正式文档(合同、报价单、功能说明书、发货单、PDA 单据、会议纪要等),包含公司信息、字体规范、页面设置等模板规则/PDF 文档时。**生成 Word 默认使用此技能**。触发场景:(1) 生成合同或报价单 (2) 创建 Word 文档模板 (3) 按公司规范排版文档 (4) 使用公文格式生成文档 (5) 用户说"写个文档"、"生成文档"、"创建文档"、"生成会议纪要"等
| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | 141% | 0% |
| case-02 | ✗→✓ | ▲ Improved | 135% | 0% |
| case-03 | ✗→✓ | ▲ Improved | 147% | 0% |
| case-06 | ✗→✓ | ▲ Improved | 348% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 265% | 0% |
> 新用户必读!每次生成文档前对照检查,否则文档不合格!
如果没有完成以上检查,文档不允许交付!
> 重要:不需要 pip install huo15_doc!代码模板直接写在 SKILL.md 中,复制使用即可!
python# 直接从 SKILL.md 中复制以下代码到你的Python脚本: # (函数定义参考 SKILL.md 中的 "简化函数" 部分) # LOGO 会自动从公司系统下载,无需手动配置! doc = create_formatted_doc( title="合同标题", company_name="青岛火一五信息科技有限公司" ) # 然后直接添加内容... doc.add_paragraph("合同正文内容") doc.save("CONTRACT_客户名_20250319.docx")
> 强烈建议:使用简化函数,告别手动配置! > 重要:LOGO 会自动从公司系统下载,无需手动配置!
office-document-specialist-suite 处理文档内容huo15-doc-template 处理格式规范WPS 字体兼容:
仿宋w:eastAsia严禁将 Markdown 语法直接写入 Word 文档,例如:
**加粗文本** → Word 中会显示星号| 列1 | 列2 | → Word 中会显示管道符# 一级标题 → Word 中会显示井号**这是加粗**run.bold = Truepython# 错误示例(不要这样写!) p = doc.add_paragraph("**这是加粗**") # ❌ 会显示星号 # 正确示例 p = doc.add_paragraph("这是加粗") p.runs[0].bold = True # ✅ 真正加粗
| 列1 | 列2 | 列3 |
|------|------|------|
| 内容 | 内容 | 内容 |doc.add_table() 创建表格python# 正确示例 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)
# 一级标题python# 正确示例 p = doc.add_paragraph("一级标题") p.runs[0].bold = True p.runs[0].font.name = '黑体' p.runs[0].font.size = Pt(15)
生成文档后,检查以下内容:
**、__、# 等 Markdown 符号?| 管道符?[文字](URL) 格式?- 或 * 前缀?如果有任何一项为"是",则文档不合格,需要重新生成
问题:WPS 和 Word 对字体的渲染方式不同,WPS 需要显式设置字体域才能正确识别中文字体。
解决方案:每个 run 都必须设置以下三个属性:
run.font.name = font_name - 设置字体名称run._element.rPr.rFonts.set(qn('w:eastAsia'), font_name) - 设置字体域(WPS兼容)run.font.size = Pt(font_size) - 设置字号pythonfrom docx.oxml.ns import qn def set_chinese_font(run, font_name='仿宋', font_size=12, bold=False): """ 设置中文字体,确保WPS和Word兼容 必须对每个run都调用此函数! """ # 1. 设置西文字体名称 run.font.name = font_name # 2. 设置字体域(WPS兼容关键) run._element.rPr.rFonts.set(qn('w:eastAsia'), font_name) # 3. 设置字号 run.font.size = Pt(font_size) # 4. 设置加粗 run.bold = bold return run
| 错误做法 | 后果 | |---------|------| | 只设置 run.font.name | Word显示正确,WPS显示为宋体 | | 不设置 w:eastAsia 字体域 | WPS无法识别中文字体 | | 只在第一个run设置字体 | 后续文字字体丢失 | | 使用 set_font() 但没有设置字体域 | WPS显示不正确 |
python# 正确:每个run都设置字体 p = doc.add_paragraph() run = p.add_run('这是正文') set_chinese_font(run, '仿宋', 12) # ✅ 每个run都调用 # 错误:只设置一次 p = doc.add_paragraph() run = p.add_run('这是正文') run.font.name = '仿宋' # ❌ 缺少字体域
pythonfrom docx import Document from docx.shared import Pt, Cm from docx.enum.text import WD_ALIGN_PARAGRAPH from docx.oxml.ns import qn from docx.oxml import OxmlElement import os def set_chinese_font(run, font_name='仿宋', font_size=12, bold=False): """ 设置中文字体,确保WPS和Word兼容 必须对每个run都调用此函数! """ run.font.name = font_name run._element.rPr.rFonts.set(qn('w:eastAsia'), font_name) run.font.size = Pt(font_size) run.bold = bold return run
/Users/jobzhao/.openclaw/workspace/assets/logo.png获取顺序:
默认公司信息:
/Users/jobzhao/.openclaw/workspace/assets/logo.png(从 https://tools.huo15.com/uploads/images/system/logo-colours.png 下载)公司信息配置位置:/Users/jobzhao/.openclaw/workspace/config/company_info.json
json{ "company_name": "青岛火一五信息科技有限公司", "logo_path": "/Users/jobzhao/.openclaw/workspace/assets/logo.png", "logo_url": "https://huihuoyun.huo15.com/web/image/website/1/logo", "fallback_logo_url": "https://tools.huo15.com/uploads/images/system/logo-colours.png" }
页眉代码示例(动态获取公司信息):
pythonfrom docx.shared import Pt, Cm from docx.enum.text import WD_ALIGN_PARAGRAPH from docx.oxml.ns import qn from docx.oxml import OxmlElement import os import json import urllib.request # 公司信息配置 COMPANY_CONFIG_PATH = '/Users/jobzhao/.openclaw/workspace/config/company_info.json' DEFAULT_LOGO_PATH = '/Users/jobzhao/.openclaw/workspace/assets/logo.png' # 默认公司信息(当无法获取时使用) DEFAULT_COMPANY_NAME = '青岛火一五信息科技有限公司' 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(): """ 获取公司信息,自动确保LOGO存在 返回: (company_name, logo_path) 注意:LOGO会自动下载到用户目录 ~/.huo15/assets/logo.png """ company_name = COMPANY_NAME logo_path = ensure_logo_exists() # 确保LOGO存在 return company_name, logo_path def add_header_with_logo(doc, logo_path=None, company_name=None): """添加页眉,包含 LOGO 图片 + 公司名称 + 底线""" # 获取公司信息 if logo_path is None or company_name is None: company_name, logo_path = get_company_info() section = doc.sections[0] header = section.header header.paragraphs.clear() # 设置页眉高度 section.header_distance = Cm(1.5) # 添加段落(左对齐) paragraph = header.add_paragraph() paragraph.alignment = WD_ALIGN_PARAGRAPH.LEFT # 1. 添加 LOGO 图片(如果存在) if os.path.exists(logo_path): try: # 添加图片,高度 1cm,宽度自动 run = paragraph.add_run() run.add_picture(logo_path, height=Cm(1.0)) except Exception as e: # 如果图片加载失败,继续添加文字 pass # 2. 添加公司名称(紧挨着 LOGO) run = paragraph.add_run(f' {company_name}') set_font(run, '黑体', 10) # 3. 添加页眉底线 pPr = OxmlElement('w:pPr') pBdr = OxmlElement('w:pBdr') bottom = OxmlElement('w:bottom') bottom.set(qn('w:val'), 'single') bottom.set(qn('w:sz'), '6') bottom.set(qn('w:space'), '1') bottom.set(qn('w:color'), '000000') pBdr.append(bottom) pPr.append(pBdr) paragraph._element.insert(0, pPr) return header
重要提醒(强制执行):
add_header_with_logo(doc) 函数/Users/jobzhao/.openclaw/workspace/assets/logo.pngLOGO 添加检查清单(每次生成文档前必须自检):
/Users/jobzhao/.openclaw/workspace/assets/logo.pngadd_picture() 方法添加 LOGOw:bottom 边框)常见错误及解决方案:
| 错误 | 原因 | 解决方案 | |------|------|----------| | 文档没有 LOGO | 代码中缺少 add_picture() 调用 | 必须调用 run.add_picture(logo_path, height=Cm(1.0)) | | LOGO 路径错误 | 图片路径写错或文件不存在 | 使用绝对路径,生成前检查 os.path.exists(logo_path) | | LOGO 太大/太小 | 高度设置不合理 | 使用 height=Cm(1.0) 标准高度 | | LOGO 和文字分开 | 没有在同一 paragraph 中添加 | LOGO 和公司名称必须在同一个 paragraph 中 |
完整调用示例:
pythonfrom docx import Document from docx.shared import Cm import os # 创建文档 doc = Document() # 1. 设置页面格式 for section in doc.sections: section.top_margin = Cm(3.7) section.bottom_margin = Cm(3.5) section.left_margin = Cm(2.8) section.right_margin = Cm(2.6) # 2. 添加页眉(必须包含 LOGO) logo_path = '/Users/jobzhao/.openclaw/workspace/assets/logo.png' # 检查 LOGO 是否存在 if not os.path.exists(logo_path): raise FileNotFoundError(f"LOGO 图片不存在:{logo_path}") section = doc.sections[0] header = section.header header.paragraphs.clear() section.header_distance = Cm(1.5) paragraph = header.add_paragraph() paragraph.alignment = WD_ALIGN_PARAGRAPH.LEFT # 添加 LOGO run = paragraph.add_run() run.add_picture(logo_path, height=Cm(1.0)) # 添加公司名称 run = paragraph.add_run(' 青岛火一五信息科技有限公司') set_font(run, '黑体', 10) # 添加底线 # ...(参考上方完整代码) # 3. 继续添加文档内容 # ...
w:eastAsia 字体域确保 WPS 识别第 1 页 共 3 页pythonfrom docx.shared import Pt, Cm from docx.oxml.ns import qn from docx.oxml import OxmlElement from docx.enum.text import WD_ALIGN_PARAGRAPH def add_footer_with_page_numbers(doc): """添加页脚,包含当前页和总页数,WPS 兼容""" section = doc.sections[0] # 设置页脚距离页面底部边距 section.footer_distance = Cm(1.5) # 获取或创建页脚 footer = section.footer # 添加段落(居中) paragraph = footer.paragraphs[0] if footer.paragraphs else footer.add_paragraph() paragraph.alignment = WD_ALIGN_PARAGRAPH.CENTER # 添加"第"字 run1 = paragraph.add_run("第") run1.font.name = '仿宋' run1._element.rPr.rFonts.set(qn('w:eastAsia'), '仿宋') run1.font.size = Pt(12) # 插入当前页码域(PAGE) run2 = paragraph.add_run() fldChar1 = OxmlElement('w:fldChar') fldChar1.set(qn('w:fldCharType'), 'begin') instrText1 = OxmlElement('w:instrText') instrText1.text = 'PAGE' fldChar2 = OxmlElement('w:fldChar') fldChar2.set(qn('w:fldCharType'), 'end') run2._element.append(fldChar1) run2._element.append(instrText1) run2._element.append(fldChar2) run2.font.name = '仿宋' run2._element.rPr.rFonts.set(qn('w:eastAsia'), '仿宋') run2.font.size = Pt(12) # 添加"页 共"文字 run3 = paragraph.add_run("页 共") run3.font.name = '仿宋' run3._element.rPr.rFonts.set(qn('w:eastAsia'), '仿宋') run3.font.size = Pt(12) # 插入总页数域(NUMPAGES) run4 = paragraph.add_run() fldChar3 = OxmlElement('w:fldChar') fldChar3.set(qn('w:fldCharType'), 'begin') instrText2 = OxmlElement('w:instrText') instrText2.text = 'NUMPAGES' fldChar4 = OxmlElement('w:fldChar') fldChar4.set(qn('w:fldCharType'), 'end') run4._element.append(fldChar3) run4._element.append(instrText2) run4._element.append(fldChar4) run4.font.name = '仿宋' run4._element.rPr.rFonts.set(qn('w:eastAsia'), '仿宋') run4.font.size = Pt(12) # 添加"页"字 run5 = paragraph.add_run("页") run5.font.name = '仿宋' run5._element.rPr.rFonts.set(qn('w:eastAsia'), '仿宋') run5.font.size = Pt(12)
[文档类型]_[客户名称]_[项目名称]_[日期]_[版本].docx| 元素 | 说明 | 示例 | 必填 | |------|------|------|------| | 文档类型 | 具体文档类型 | 合同、报价单、发货单、会议纪要、技术方案 | ✅ | | 客户名称 | 客户公司简称 | 阿里、腾讯、华为、海尔 | ✅ | | 项目名称 | 项目名称(可选) | ERP、MES、WMS、OA | ○ | | 日期 | 文档日期,格式 YYYYMMDD | 20250319 | ✅ | | 版本 | 版本号 v1.0(可选,默认 v1.0) | v1.0、v1.1、v2.0 | ○ |
| 文档类型 | 编码 | 说明 | |----------|------|------| | 合同 | CONTRACT | 销售合同、服务合同 | | 报价单 | QUOTE | 产品报价、项目报价 | | 发货单 | DELIVERY | 发货清单、送货单 | | 会议纪要 | MEMO | 会议记录、洽谈纪要 | | 技术方案 | PROPOSAL | 解决方案、技术方案 | | 功能说明书 | SPEC | 产品功能说明、需求规格 | | 验收报告 | ACCEPTANCE | 项目验收、交付验收 | | 发票 | INVOICE | 增值税发票、普通发票 |
# 完整格式
CONTRACT_阿里_钉钉OA_20250319_v1.0.docx
QUOTE_腾讯_云ERP_20250318.docx
DELIVERY_海尔_WMS_20250317_v1.0.docx
MEMO_华为_技术洽谈_20250316.docx
PROPOSAL_海信_MES系统_20250315_v2.0.docx
# 无项目名称
CONTRACT_京东_20250319.docx
QUOTE_字节跳动_20250318.docx
# 有版本迭代
CONTRACT_小米_智能制造_20250319_v1.1.docx
SPEC_美团_外卖系统_20250314_v1.2.docx_ 分隔各元素(不要用空格或连字符)\/:*?"<>|pythonimport datetime def generate_doc_name(doc_type, customer_name, project_name="", version="v1.0"): """ 生成符合规范的文档名称 参数: doc_type: 文档类型编码(如 CONTRACT, QUOTE) customer_name: 客户名称 project_name: 项目名称(可选) version: 版本号(可选,默认 v1.0) 返回: 文档名称字符串,如 CONTRACT_阿里_钉钉OA_20250319_v1.0.docx """ # 日期 date_str = datetime.datetime.now().strftime("%Y%m%d") # 清理客户名称(去除公司后缀) customer = customer_name.replace("有限公司", "").replace("股份有限公司", "").replace("集团", "").strip() # 清理项目名称 project = project_name.strip() if project_name else "" # 构建名称 parts = [doc_type, customer] if project: parts.append(project) parts.append(date_str) # 添加版本(如果不是默认版本) if version and version != "v1.0": parts.append(version) # 拼接并添加后缀 doc_name = "_".join(parts) + ".docx" return doc_name # 使用示例 # generate_doc_name("CONTRACT", "阿里巴巴有限公司", "钉钉OA", "v1.0") # -> CONTRACT_阿里_钉钉OA_20250319_v1.0.docx # generate_doc_name("QUOTE", "腾讯科技有限公司") # -> QUOTE_腾讯_20250319.docx
pythonfrom docx import Document from docx.shared import Pt, Cm from docx.enum.text import WD_ALIGN_PARAGRAPH from docx.oxml.ns import qn from docx.oxml import OxmlElement import os import urllib.request import json # ============== 配置区域 ============== # 使用用户目录下的 .huo15 目录,跨平台通用 USER_HOME = os.path.expanduser("~") LOGO_DIR = os.path.join(USER_HOME, ".huo15", "assets") DEFAULT_LOGO_PATH = os.path.join(LOGO_DIR, "logo.png") FALLBACK_LOGO_URL = 'https://tools.huo15.com/uploads/images/system/logo-colours.png' COMPANY_NAME = '青岛火一五信息科技有限公司' def ensure_logo_exists(logo_path=DEFAULT_LOGO_PATH): """确保 LOGO 存在,不存在则自动下载到用户目录""" if os.path.exists(logo_path) and os.path.getsize(logo_path) > 0: return logo_path # 创建目录并下载 os.makedirs(os.path.dirname(logo_path), exist_ok=True) try: urllib.request.urlretrieve(FALLBACK_LOGO_URL, logo_path) print(f"✓ LOGO 已自动下载: {logo_path}") except Exception as e: raise FileNotFoundError(f"❌ LOGO 下载失败: {e}\n请检查网络后重试") return logo_path def set_chinese_font(run, font_name='仿宋', font_size=12, bold=False): """设置中文字体(WPS/Word兼容)""" run.font.name = font_name run._element.rPr.rFonts.set(qn('w:eastAsia'), font_name) run.font.size = Pt(font_size) run.bold = bold return run def add_header_with_logo(doc, logo_path=None, company_name=None): """添加页眉:LOGO + 公司名称 + 底线 注意:LOGO会自动下载,无需手动配置 """ # 获取公司信息和LOGO路径 _company_name, _logo_path = get_company_info() logo_path = logo_path or _logo_path company_name = company_name or _company_name section = doc.sections[0] header = section.header header.paragraphs.clear() section.header_distance = Cm(1.5) # 添加 LOGO + 公司名称 paragraph = header.add_paragraph() paragraph.alignment = WD_ALIGN_PARAGRAPH.LEFT run = paragraph.add_run() run.add_picture(logo_path, height=Cm(1.0)) run = paragraph.add_run(f' {company_name}') set_chinese_font(run, '黑体', 10) # 添加底线 pPr = OxmlElement('w:pPr') pBdr = OxmlElement('w:pBdr') bottom = OxmlElement('w:bottom') bottom.set(qn('w:val'), 'single') bottom.set(qn('w:sz'), '6') bottom.set(qn('w:space'), '1') bottom.set(qn('w:color'), '000000') pBdr.append(bottom) pPr.append(pBdr) paragraph._element.insert(0, pPr) def add_footer_with_page_numbers(doc): """添加页脚:第 X 页 共 Y 页""" section = doc.sections[0] section.footer_distance = Cm(1.5) footer = section.footer paragraph = footer.paragraphs[0] if footer.paragraphs else footer.add_paragraph() paragraph.alignment = WD_ALIGN_PARAGRAPH.CENTER # 构建页码域 for text, is_field in [("第", False), ("PAGE", True), ("页 共", False), ("NUMPAGES", True), ("页", False)]: run = paragraph.add_run(text) set_chinese_font(run, '仿宋', 12) if is_field: fldChar1 = OxmlElement('w:fldChar') fldChar1.set(qn('w:fldCharType'), 'begin') instrText = OxmlElement('w:instrText') instrText.text = text fldChar2 = OxmlElement('w:fldChar') fldChar2.set(qn('w:fldCharType'), 'end') run._element.clear() run._element.append(fldChar1) run._element.append(instrText) run._element.append(fldChar2) def create_formatted_doc(title="", logo_path=None, company_name=None): """ 🚀 一条命令创建符合公司规范的 Word 文档 参数: title: 文档标题(可选) logo_path: LOGO 图片路径(可选,默认自动查找/下载) company_name: 公司名称(可选,默认"青岛火一五信息科技有限公司") 返回: doc: python-docx Document 对象 使用示例: doc = create_formatted_doc("销售合同") doc.add_paragraph("合同正文内容...") doc.save("CONTRACT_客户_20250319.docx") """ # 1. 创建文档 doc = Document() # 2. 设置页面边距(GB/T 9704-2012) for section in doc.sections: section.top_margin = Cm(3.7) section.bottom_margin = Cm(3.5) section.left_margin = Cm(2.8) section.right_margin = Cm(2.6) # 3. 添加页眉(LOGO + 公司名) add_header_with_logo(doc, logo_path, company_name) # 4. 添加页脚(页码) add_footer_with_page_numbers(doc) # 5. 设置默认字体 style = doc.styles['Normal'] style.font.name = '仿宋' style.font.size = Pt(12) style._element.rPr.rFonts.set(qn('w:eastAsia'), '仿宋') # 6. 添加标题(如果提供) if title: p = doc.add_paragraph(title) p.alignment = WD_ALIGN_PARAGRAPH.CENTER for run in p.runs: set_chinese_font(run, '黑体', 22, True) return doc
python# 步骤1:一条命令创建文档(自动包含 LOGO + 页码 + 字体) doc = create_formatted_doc( title="销售合同", company_name="青岛火一五信息科技有限公司" ) # 步骤2:添加文档内容 doc.add_paragraph("第一条:...") # 步骤3:保存文档(按命名规范) doc.save("CONTRACT_客户名_20250319.docx") # 完成!✅
> 重要:使用 create_formatted_doc() 函数会自动处理: > - ✅ 页面边距(3.7/3.5/2.8/2.6cm) > - ✅ 页眉 LOGO + 公司名称 + 底线 > - ✅ 页脚页码(第 X 页 共 Y 页) > - ✅ 默认字体(仿宋小四) > - ✅ LOGO 不存在时自动下载
问题:之前生成的文档在WPS中页码显示不正确
根因:页码域代码实现方式不正确
最终解决方案(2026-03-14验证通过):
pythonfrom docx.oxml.ns import qn from docx.oxml import OxmlElement # 关键:正确添加域代码的方式 run2 = paragraph.add_run() fldChar1 = OxmlElement('w:fldChar') fldChar1.set(qn('w:fldCharType'), 'begin') instrText1 = OxmlElement('w:instrText') instrText1.text = 'PAGE' fldChar2 = OxmlElement('w:fldChar') fldChar2.set(qn('w:fldCharType'), 'end') run2._element.append(fldChar1) # 注意:用append不是set run2._element.append(instrText1) run2._element.append(fldChar2) run2.font.name = '仿宋' run2._element.rPr.rFonts.set(qn('w:eastAsia'), '仿宋') run2.font.size = Pt(12)
关键要点:
run._element.append() 添加域元素,而不是其他方式run._element.rPr.rFonts.set(qn('w:eastAsia'), '仿宋')run.font.name = '仿宋'验证结果:WPS和Word均正确显示页码
问题:生成的文档在WPS中字体显示不正确(显示为宋体而非仿宋/黑体等)
根因:
run.font.name,没有设置 w:eastAsia 字体域实践经验(2026-03-14验证通过):
python# 正确:每个run都要设置字体域 run.font.name = '仿宋' run._element.rPr.rFonts.set(qn('w:eastAsia'), '仿宋') # 关键! run.font.size = Pt(12)
关键要点:
run.font.name + run._element.rPr.rFonts.set()pythonstyle = doc.styles['Normal'] style.font.name = "仿宋" style.font.size = Pt(12) style._element.rPr.rFonts.set(qn('w:eastAsia'), '仿宋')
qn('w:eastAsia')验证结果:WPS和Word均正确显示字体
问题:初次使用技能时,误以为需要 pip install huo15_doc 安装Python包才能使用
根因:看到SKILL.md中的 from huo15_doc import create_formatted_doc 就以为需要pip包
经验教训:
huo15-doc-template 是一个文档模板规范技能,不是pip包正确使用流程:
~/.openclaw/workspace/skills/huo15-doc-template/SKILL.md简化函数一键使用:
python# 直接从SKILL.md复制此函数,无需pip安装! doc = create_formatted_doc( title="知本元项目情况汇总", company_name="青岛火一五信息科技有限公司" ) # 添加内容... doc.save("文档名.docx")
验证结果:成功生成符合公司规范的Word文档
Other measured skills in the registry, with their headline benchmark lift.