docx-format
22
总安装量
13
周安装量
#16638
全站排名
安装命令
npx skills add https://github.com/ninestep/docx-format-skill --skill docx-format
Agent 安装分布
gemini-cli
9
opencode
9
codex
8
cursor
8
claude-code
7
openclaw
5
Skill 文档
Word ææ¡£æ ¼å¼å¤ç
ä½¿ç¨ python-docx åºç²¾ç¡®æä½ Word ææ¡£æ ¼å¼ï¼éç¨äºæ ¼å¼åæãæ ¼å¼è§èåãæ¹éä¿®æ¹ã
æ ¸å¿è§å
被è°ç¨æ¶ç«å³æ§è¡ï¼
- 确认æä»¶è·¯å¾ï¼è¯¢é®ç¨æ· Word ææ¡£ç宿´è·¯å¾
- æç¡®éæ±ï¼ç¡®è®¤æ¯åææ ¼å¼è¿æ¯ä¿®æ¹æ ¼å¼ï¼ç®æ è§èæ¯ä»ä¹
- éæ©æ¨¡æ¿ï¼æ ¹æ®éæ±éæ©åéçä»£ç æ¨¡æ¿æèæ¬
- çæèæ¬ï¼å建ç¬ç«ç Python èæ¬æä»¶
- æ§è¡éªè¯ï¼ä½¿ç¨
uv runæ§è¡å¹¶æ£æ¥ç»æ
å¼ºå¶æ§çº¦æï¼
- â å¿
须使ç¨
uv run --with python-docx python3 script.py - â å¿
é¡»å¤ç
doc.paragraphsådoc.tablesï¼ææ¡£æ£æå¸¸å¨è¡¨æ ¼å ï¼ - â å¿
é¡»å设 ä¸è±æåä½ï¼ä½¿ç¨
qn('w:eastAsia')ï¼ - â å¿ é¡»è¯¢é® ç¨æ·æä»¶è·¯å¾åè¾åºè·¯å¾
- â ç¦æ¢ä½¿ç¨ ç´æ¥
pythonå½ä»¤ï¼ç¼ºå°ä¾èµï¼ - â ç¦æ¢éæ¼ è¡¨æ ¼å 容å¤çï¼å¸¸è§é误ï¼
使¶ä½¿ç¨
触ååºæ¯ï¼
- åæ Word ææ¡£æ ¼å¼ï¼åä½/åå·/缩è¿/è¡è·ï¼
- æ¹éä¿®æ¹ææ¡£æ ¼å¼
- ç»ä¸æçè§èï¼å¦æ¯è®ºæãæ¥åçï¼
- å¤çä¸è±ææ··æåä½
- ä¿®æ¹äº¤åå¼ç¨/åèæç®æ ·å¼
触åå ³é®è¯ï¼ä¿®æ¹ Word æ ¼å¼ãç»ä¸åä½ãè°æ´ç¼©è¿ãåæææ¡£æ ¼å¼ãåèæç®æ ¼å¼
å³çæ
ç¨æ·éæ±æ¯ä»ä¹ï¼
ââ 䏿¸
æ¥å½åæ ¼å¼ â ä½¿ç¨ scripts/analyze.py
ââ åºç¨å
¬ææ å â ä½¿ç¨ scripts/format_official.py
ââ åºç¨å¦æ¯æ å â ä½¿ç¨ scripts/format_academic.py
ââ ç»ä¸æ£ææ ¼å¼ â 使ç¨ãå¿«éæ¨¡æ¿ï¼æ¹éæ ¼å¼åã
ââ ä¿®æ¹åèæç® â 使ç¨ãå¿«éæ¨¡æ¿ï¼åèæç®å¤çã
ââ èªå®ä¹éæ± â åºäºãåºç¡æ¨¡æ¿ãç»å
å¿«éå¼å§
åºç¡æ¨¡æ¿
from docx import Document
from docx.shared import Pt
from docx.oxml.ns import qn
doc = Document('input.docx')
def set_font(run, cn='å®ä½', en='Times New Roman', size=10.5):
"""设置ä¸è±æåä½"""
run.font.name = en
run._element.rPr.rFonts.set(qn('w:eastAsia'), cn)
run.font.size = Pt(size)
def process_all_paragraphs(doc, process_func):
"""éåæææ®µè½ï¼å
æ¬è¡¨æ ¼å
ï¼"""
for para in doc.paragraphs:
process_func(para)
for table in doc.tables:
for row in table.rows:
for cell in row.cells:
for para in cell.paragraphs:
process_func(para)
# 使ç¨ç¤ºä¾
def format_para(para):
para.paragraph_format.first_line_indent = Pt(21)
for run in para.runs:
set_font(run, cn='å®ä½', en='Times New Roman', size=10.5)
process_all_paragraphs(doc, format_para)
doc.save('output.docx')
å¿«éæ¨¡æ¿ï¼æ¹éæ ¼å¼å
from docx import Document
from docx.shared import Pt
from docx.oxml.ns import qn
doc = Document('input.docx')
for para in doc.paragraphs:
if len(para.text.strip()) > 30:
para.paragraph_format.first_line_indent = Pt(21)
para.paragraph_format.line_spacing = 1.5
for run in para.runs:
run.font.name = 'Times New Roman'
run._element.rPr.rFonts.set(qn('w:eastAsia'), 'å®ä½')
run.font.size = Pt(10.5)
for table in doc.tables:
for row in table.rows:
for cell in row.cells:
for para in cell.paragraphs:
if len(para.text.strip()) > 30:
para.paragraph_format.first_line_indent = Pt(21)
for run in para.runs:
run.font.name = 'Times New Roman'
run._element.rPr.rFonts.set(qn('w:eastAsia'), 'å®ä½')
run.font.size = Pt(10.5)
doc.save('output.docx')
å¿«éæ¨¡æ¿ï¼åèæç®å¤ç
from docx import Document
from docx.shared import Pt, RGBColor
import re
doc = Document('input.docx')
ref_pattern = re.compile(r'\[\d+\]')
for para in doc.paragraphs:
if para.text.strip().startswith('[') and ']' in para.text[:5]:
para.paragraph_format.first_line_indent = Pt(-21)
para.paragraph_format.left_indent = Pt(21)
for run in para.runs:
if ref_pattern.search(run.text):
run.font.color.rgb = RGBColor(0, 0, 255)
doc.save('output.docx')
æ§è¡æ£æ¥æ¸ å
çæèæ¬åï¼
- å·²ç¡®è®¤ç¨æ·æä¾çæä»¶è·¯å¾
- å·²æç¡®ç®æ æ ¼å¼è§è
- 已鿩åéçæ¨¡æ¿æèæ¬
èæ¬ä¸å¿ é¡»å å«ï¼
- åæ¶å¤ç
doc.paragraphsådoc.tables - 使ç¨
qn('w:eastAsia')è®¾ç½®ä¸æåä½ - æ£ç¡®çè¾å ¥/è¾åºæä»¶è·¯å¾
æ§è¡åæéç¨æ·ï¼
- å¤ä»½åæä»¶æä½¿ç¨ä¸åçè¾åºæä»¶å
- 确认æä»¶æªè¢«å ¶ä»ç¨åºæå¼
æ§è¡å½ä»¤ï¼
uv run --with python-docx python3 script.py
常è§é误
| é误 | åå | è§£å³æ¹æ¡ |
|---|---|---|
| ä¿®æ¹æªçæ | éæ¼è¡¨æ ¼å 容 | æ£æ¥æ¯å¦å¤çäº doc.tables |
| 䏿åä½ä¸å¯¹ | æªç¨ qn('w:eastAsia') |
å¿ é¡»åç¬è®¾ç½®ä¸æåä½ |
| æä»¶æå¼å¤±è´¥ | è·¯å¾é误ææä»¶è¢«å ç¨ | æ£æ¥è·¯å¾ï¼å ³é Word |
| ä¾èµç¼ºå¤± | æªç¨ uv run |
使ç¨å®æ´å½ä»¤ |
ç¸å ³ææ¡£
- STANDARDS.md – é»è®¤æ ¼å¼æ åï¼å ¬æ/妿¯è®ºæï¼ååæ°éæ¥è¡¨
- EXAMPLES.md – 详ç»ç¤ºä¾ä»£ç ï¼å¤çº§æ é¢ãè¡¨æ ¼ãå¾çã页ç页èçï¼
- scripts/ – é¢ç½®å·¥å ·èæ¬ï¼åæãå ¬ææ ¼å¼åã妿¯æ ¼å¼åï¼
Markdown 转 DOCX
ç´æ¥è¯»å Markdown ææ¡£å¹¶ææ ¼å¼è¦æ±åå ¥ DOCXï¼æ é pandocã
åºç¡æ¨¡æ¿
from docx import Document
from docx.shared import Pt
from docx.oxml.ns import qn
from docx.enum.text import WD_ALIGN_PARAGRAPH
import re
doc = Document()
def add_heading(doc, text, level):
"""æ·»å æ é¢"""
para = doc.add_paragraph(text)
if level == 1:
para.alignment = WD_ALIGN_PARAGRAPH.CENTER
for run in para.runs:
run.font.name = 'Arial'
run._element.rPr.rFonts.set(qn('w:eastAsia'), 'é»ä½')
run.font.size = Pt(15)
run.font.bold = True
elif level == 2:
para.alignment = WD_ALIGN_PARAGRAPH.LEFT
for run in para.runs:
run.font.name = 'Arial'
run._element.rPr.rFonts.set(qn('w:eastAsia'), 'é»ä½')
run.font.size = Pt(14)
run.font.bold = True
elif level == 3:
para.alignment = WD_ALIGN_PARAGRAPH.LEFT
for run in para.runs:
run.font.name = 'Arial'
run._element.rPr.rFonts.set(qn('w:eastAsia'), 'é»ä½')
run.font.size = Pt(12)
run.font.bold = True
def add_paragraph(doc, text):
"""æ·»å æ£ææ®µè½"""
para = doc.add_paragraph(text)
para.alignment = WD_ALIGN_PARAGRAPH.JUSTIFY
para.paragraph_format.first_line_indent = Pt(24)
para.paragraph_format.line_spacing = 1.5
for run in para.runs:
run.font.name = 'Times New Roman'
run._element.rPr.rFonts.set(qn('w:eastAsia'), 'å®ä½')
run.font.size = Pt(12)
# 读å Markdown
with open('input.md', 'r', encoding='utf-8') as f:
for line in f:
line = line.rstrip()
if not line:
continue
# æ é¢
if line.startswith('# '):
add_heading(doc, line[2:], 1)
elif line.startswith('## '):
add_heading(doc, line[3:], 2)
elif line.startswith('### '):
add_heading(doc, line[4:], 3)
# æ£æ
else:
add_paragraph(doc, line)
doc.save('output.docx')
使ç¨é¢ç½®èæ¬ï¼
uv run --with python-docx python3 .claude/skills/docx-format/scripts/md_to_docx.py input.md output.docx
注æäºé¡¹
- åªæ¯æ .docxï¼ä¸æ¯ææ§ç .doc
- è¡¨æ ¼å 容ï¼å¦æ¯è®ºæãæ¥åçæ£æå¸¸å¨è¡¨æ ¼å ï¼å¿ é¡»å¤ç
- åä½è½¬æ¢ï¼
font.sizeè¿å EMUï¼é转æ¢ï¼Ã· 914400 à 72ï¼ - å¤ä»½åæä»¶ï¼ä¿®æ¹å建议å¤ä»½
- Markdown 转æ¢ï¼ä½¿ç¨ pandoc 转æ¢ååæ ¼å¼å