Word 文档生成·免费版
原创免费技能。用开源库 python-docx 生成和编辑 .docx 文档,面向中文办公场景(报告、合同、简历、通知、周报等)。所有指令均为本技能原创,仅依赖 MIT 许可的开源库,可放心发布与商用。
红线(不可违反)
- 不编造内容:文档中的事实、数据、条款来自用户提供的信息,不臆造、不替用户做法律/业务承诺
- 不改变原意:用户提供的文本原样转述,润色只改表达不改事实
- 不引导付费:本技能为免费版,不引用任何付费端点、不出现增值推销话术
- 可运行交付:给出的生成脚本必须基于 python-docx 真实 API,能直接跑出 .docx
- 中文优先:默认中文字体(标题/正文用微软雅黑或思源黑体,正文亦可用宋体类),避免英文默认字体导致中文乱码
何时使用
- 用户要求新建 Word 文档(报告/合同/简历/通知/周报/公文)
- 用户要求编辑已有 .docx(替换文字、插入表格/图片、加页眉页脚)
- 用户要求套模板批量生成结构一致的文档
- 需要自动目录、合规表格、页眉页脚等排版要素
反触发:纯 PDF/Excel/网页/演示文稿需求 → 转对应技能,不在这里处理。
职责边界
- 本技能负责:结构规划、样式设定、内容填充、表格与图片排版、中文规范
- 本技能不负责:法律条款的合规性背书(提醒用户交由法务审核)、复杂 VBA 宏、与在线协作文档实时同步
5 分钟上手(复制即出成品)
下面这段脚本独立可跑,pip install python-docx 后直接执行,会生成一份带中文正文字体、
自动目录域、深蓝表头表格、页眉页脚页码的 report.docx,并自检。
# RUN: fixture=empty
from docx import Document
from docx.shared import Pt, RGBColor, Cm
from docx.enum.text import WD_ALIGN_PARAGRAPH
from docx.enum.table import WD_TABLE_ALIGNMENT
from docx.oxml.ns import qn
from docx.oxml import OxmlElement
CN = "微软雅黑"
def cn_font(run, size=None, bold=None, color=None):
run.font.name = CN # 只改 latin
run._element.rPr.rFonts.set(qn("w:eastAsia"), CN) # 中文必须补 eastAsia
if size: run.font.size = Pt(size)
if bold is not None: run.font.bold = bold
if color: run.font.color.rgb = RGBColor(*color)
def add_field(paragraph, instr):
"""插入 Word 域:TOC 目录 / PAGE 页码 / NUMPAGES 总页数。"""
for kind, text in (("begin", None), (None, instr), ("end", None)):
r = paragraph.add_run()
if kind:
f = OxmlElement("w:fldChar"); f.set(qn("w:fldCharType"), kind)
r._element.append(f)
else:
it = OxmlElement("w:instrText"); it.set(qn("xml:space"), "preserve")
it.text = text
r._element.append(it)
doc = Document()
sec = doc.sections[0]
sec.left_margin = sec.right_margin = Cm(2.5)
# 改 Normal 样式 = 一次性定住全文中文默认字体
st = doc.styles["Normal"]
st.font.name = CN
st.element.rPr.rFonts.set(qn("w:eastAsia"), CN)
st.font.size = Pt(11)
p = doc.add_paragraph(); p.alignment = WD_ALIGN_PARAGRAPH.CENTER
cn_font(p.add_run("2026 年 Q3 产品部工作总结"), size=22, bold=True, color=(0x1E, 0x27, 0x61))
p = doc.add_paragraph(); p.alignment = WD_ALIGN_PARAGRAPH.CENTER
cn_font(p.add_run("产品部 · 2026-09-30"), size=10, color=(0x66, 0x66, 0x66))
# 自动目录:Word 打开后全选按 F9 更新(或打印预览会自动刷新)
p = doc.add_paragraph(); cn_font(p.add_run("目录"), size=14, bold=True)
p = doc.add_paragraph(); add_field(p, r'TOC \o "1-2" \h \z \u')
doc.add_page_break()
def heading(text, level, size):
h = doc.add_heading(text, level=level)
for r in h.runs:
cn_font(r, size=size, bold=True)
heading("一、主要成果", 1, 16)
p = doc.add_paragraph()
cn_font(p.add_run("完成核心模块重构,交付周期从 21 天压缩至 9 天,线上缺陷率下降 42%。"))
p.paragraph_format.line_spacing = 1.5
p.paragraph_format.first_line_indent = Pt(22)
heading("1.1 交付提速", 2, 13)
p = doc.add_paragraph()
cn_font(p.add_run("通过并行化构建与缓存复用,单次构建耗时下降 63%。"))
p.paragraph_format.first_line_indent = Pt(22)
# 表格:表头深底白字(python-docx 没有内置表头样式,要手改 XML 底纹)
t = doc.add_table(rows=3, cols=3)
t.style = "Table Grid"
t.alignment = WD_TABLE_ALIGNMENT.CENTER
for i, h in enumerate(["指标", "上季度", "本季度"]):
c = t.rows[0].cells[i]; c.text = ""
cn_font(c.paragraphs[0].add_run(h), size=10, bold=True, color=(0xFF, 0xFF, 0xFF))
shd = OxmlElement("w:shd"); shd.set(qn("w:fill"), "1E2761")
c._tc.get_or_add_tcPr().append(shd)
for r_i, row in enumerate([["交付周期(天)", "21", "9"], ["缺陷率", "3.2%", "1.9%"]], start=1):
for c_i, v in enumerate(row):
c = t.rows[r_i].cells[c_i]; c.text = ""
cn_font(c.paragraphs[0].add_run(v), size=10)
hp = sec.header.paragraphs[0]
hp.alignment = WD_ALIGN_PARAGRAPH.RIGHT
cn_font(hp.add_run("产品部 Q3 总结 · 内部资料"), size=9, color=(0x88, 0x88, 0x88))
fp = sec.footer.paragraphs[0]
fp.alignment = WD_ALIGN_PARAGRAPH.CENTER
cn_font(fp.add_run("第 "), size=9)
add_field(fp, "PAGE")
cn_font(fp.add_run(" 页 / 共 "), size=9)
add_field(fp, "NUMPAGES")
cn_font(fp.add_run(" 页"), size=9)
doc.save("report.docx")
# ---- 自检 ----
ck = Document("report.docx")
print("段落数:", len(ck.paragraphs), "| 表格数:", len(ck.tables))
print("正文默认字体:", ck.styles["Normal"].font.name)
print("标题:", [p.text for p in ck.paragraphs if p.style.name.startswith("Heading")])
print("已生成 report.docx")
这段脚本里最容易踩的三个坑
run.font.name = "微软雅黑"只改 latin,中文还是宋体 → 必须补w:eastAsiaadd_heading()用的是 Word 内置 Heading 样式(默认蓝紫色 + Calibri),中文标题要手动刷字体- 目录/页码是域不是普通文字:直接写「第 1 页」翻页就错,必须插
PAGE/NUMPAGES域
主流程
常用参考:references/templates.md(中文字体、标题层级、TOC 与页码域、表格、页眉页脚)、references/long-doc.md(长文档分节、题注 SEQ 域、交叉引用)、references/mail-merge.md(一份模板批量出 N 份:跨 run 占位符替换、明细表自动扩行、文件名清洗)。
第 1 步:明确文档类型与要素
向用户确认(信息不足时主动追问):
- 文档用途(报告/合同/简历/通知?)
- 必须包含的章节或字段
- 篇幅与格式要求(A4/Letter、单双栏、是否需要目录/页眉页脚/封面)
质检闸 1:用途与核心要素不明确时,先列大纲让用户确认,不急于生成。
第 2 步:规划结构与样式
- 用
Document()建文档,先设默认字体(见references/templates.md的set_cjk_font片段) - 标题用
Heading 1/2/3样式(便于自动目录) - 表格用
add_table(rows, cols)+style='Table Grid' - 需要目录时,在文档开头插入「目录」标题与 TOC 域,并在目录后加分页(见 references 的
add_toc片段);正文章节必须用 Heading 样式才会被目录收录
质检闸 2:结构层级清晰、有标题样式,否则目录无法生成。
第 3 步:填充内容
- 正文用
add_paragraph(text, style='Normal') - 表格单元格写
cell.text = '...',多段落在单元格内用cell.paragraphs[0] - 图片用
add_picture(path, width=Cm(12)),注意图片路径存在 - 页眉页脚用
section.header/footer,加页码用PageNumber域
质检闸 3:用户给的数据逐条落地,不遗漏、不编造。
第 4 步:生成与自检
doc.save('output.docx')- 用 references 里的校验清单核对:字体是否中文、表格是否带边框、目录域是否插入、图片是否溢出页边距
质检闸 4:打开生成的文件确认无乱码、无错位后再交付。
第 5 步:自检清单
- [ ] 中文字体正确(无英文默认字体乱码)
- [ ] 标题层级使用内置样式(目录可生成)
- [ ] 表格有边框、列宽合理
- [ ] 图片在页边距内、未拉伸变形
- [ ] 页眉页脚/页码按要求存在
- [ ] 无付费引导/增值推销话术残留
- [ ] 文件可正常打开,无损坏
失败降级
- python-docx 未安装 → 给
pip install python-docx命令后重试 - 中文字体缺失 → 退回到系统通用字体(微软雅黑/宋体),并在交付说明里提示
- 用户提供的图片损坏/缺失 → 用占位框替代并标注,不强行插入
- 需求超出 python-docx 能力(如修订追踪复杂合并)→ 说明限制,建议用 LibreOffice 方案
依赖
python-docx(MIT,pip 安装)。无需任何专有组件。
相关技能推荐
ppt-free— AI 一键生成 PPT / 幻灯片 / 演示文稿(.pptx):工作总结、汇报、路演、课件、产品介绍。内置版式配色与图表规范,中文排版,开源excel-free— Excel 表格自动生成与处理(.xlsx):报表、台账、预算、数据清洗、图表可视化。支持公式、条件格式、多 Sheet,中文财务配色,开源cad-free— CAD 建模 / Mechanical Design:开源参数化建模与工程图 — 零件建模、标准件库、装配体、尺寸驱动、STEP/STL/Dzhongwangcad-free— 国产 CAD(中望/CAXA/浩辰)替代与迁移:命令对照、图纸兼容处理、字体与打印配置、插件与二次开发迁移、批量迁移检查清单
致谢
本技能为原创,仅使用 MIT 许可的开源库 python-docx(https://github.com/python-openxml/python-docx)。与任何厂商的专有文档技能无隶属、无复制关系。