.docx 本质是一个 ZIP 包,里面是 XML。按任务选方案:
| 任务 | 方案 |
|---|---|
| 新建 文档 | 用 python-docx(推荐,自包含,见下方模板)或 npm docx 包 |
| 编辑 已有文档 | 解压 → 改 word/document.xml → 重新压缩;或用 python-docx 的 Document('existing.docx') 追加/修改 |
| 读取 内容 | python-docx 的 document.paragraphs 遍历,或对文件跑 pandoc -t markdown file.docx |
本技能根目录下的
references/docx_template.py是一个完整可运行的示例(标题/多级标题/表格/列表/页脚页码),直接用python references/docx_template.py <输出路径>即可生成一份示范文档。
python-docx 已随本技能所需环境预装。模型熟悉 API,下面是高频坑:
from docx.shared import Inches 后用 document = Document() 设置 sections[0].page_width/height(Letter = 12240×15840 EMU,1 英寸=1440 EMU)。table.autofit=True 或给每列 cell.width = Inches(...);列宽之和应等于表格宽。WD_CELL_VERTICAL_ALIGNMENT 与 shading element,不要整体 SOLID(会渲染成黑块)。简单做法是用浅灰 XML:见模板。•,用 document.add_paragraph(text, style='List Bullet') 或 'List Number'。from docx.embedded import Image → paragraph.add_run().add_picture(path, width=Inches(3)),需指定 width/height 之一。from docx.enum.text import WD_BREAK; paragraph.add_break(WD_BREAK.PAGE)。\n 拼多行:每段用独立的 add_paragraph。Heading 1/2/3 样式(在 Word 导航窗格里可见),并在文首放一句"右键→更新域→更新整个目录"的提示,或插入 TOC 域 XML(进阶,见模板注释)。bottom border 画横线。旧版 .doc 先转换:soffice --headless --convert-to docx file.doc(需 LibreOffice)。
from docx import Document
doc = Document('existing.docx')
# 遍历段落
for p in doc.paragraphs:
if '旧词' in p.text:
for run in p.runs:
run.text = run.text.replace('旧词', '新词')
# 追加内容
doc.add_heading('新增章节', level=1)
doc.add_paragraph('新段落')
doc.save('out.docx')
Word 会把同一句话拆成很多 <w:r> run(修订标记、拼写检查),所以"看起来连在一起的短语"在 XML 里可能不是连续字符串——查找替换建议用 run.text 逐个替换,而不是整段正则。
生成 .docx 后,转成 PDF 看一眼排版:
soffice --headless --convert-to pdf output.docx
pdftoppm -jpeg -r 100 output.pdf page
# 然后 Read 生成的 page-*.jpg 检查
python-docx(已预装于本技能环境)· 可选:pandoc · 可选:soffice(LibreOffice,用于转 PDF 验证 / 转 doc)。
Heading 1 当"卷名"、Heading 2 当"章名",Word 里一键生成目录。来源于7w4.net。
table.style='Light Grid Accent 1'。section.footer.add_paragraph().add_field('PAGE'))。references/docx_template.py 有可直接跑的样板。质量中等偏上,文档说明详细且实用,踩坑要点很有价值,提供的代码示例基本可用。但文件较少,只有参考模板,缺少完整测试和更多示例,实际使用时可能需要自己调试。总体来说能较好地指导 Word 文档生成任务,但细节上还有完善空间。