You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Python docx创建指定格式的多级编号列表?

使用Python创建Word多级编号列表

可以通过python-docx库自定义多级编号格式,生成Word原生识别的编号列表,避免拼接字符串的问题。

步骤说明

  • 先安装依赖:
pip install python-docx
  • 编写代码实现自定义多级编号:
from docx import Document
from docx.oxml.ns import qn
from docx.oxml import OxmlElement

def add_multilevel_numbering(doc):
    # 获取编号部件
    numbering_part = doc.part.numbering_part
    numbering_definitions = numbering_part.numbering_definitions

    # 创建抽象编号方案
    abstract_num = OxmlElement('w:abstractNum')
    abstract_num.set(qn('w:abstractNumId'), '1')

    # 一级编号:1.
    lvl1 = OxmlElement('w:lvl')
    lvl1.set(qn('w:ilvl'), '0')
    lvl1.set(qn('w:start'), '1')
    lvl1.set(qn('w:numFmt'), 'decimal')
    lvl1.set(qn('w:lvlText'), '%1.')
    lvl1.set(qn('w:lvlJc'), 'left')
    # 设置缩进
    pPr = OxmlElement('w:pPr')
    ind = OxmlElement('w:ind')
    ind.set(qn('w:left'), '720')
    ind.set(qn('w:hanging'), '360')
    pPr.append(ind)
    lvl1.append(pPr)
    abstract_num.append(lvl1)

    # 二级编号:1.1
    lvl2 = OxmlElement('w:lvl')
    lvl2.set(qn('w:ilvl'), '1')
    lvl2.set(qn('w:start'), '1')
    lvl2.set(qn('w:numFmt'), 'decimal')
    lvl2.set(qn('w:lvlText'), '%1.%2.')
    lvl2.set(qn('w:lvlJc'), 'left')
    pPr2 = OxmlElement('w:pPr')
    ind2 = OxmlElement('w:ind')
    ind2.set(qn('w:left'), '1440')
    ind2.set(qn('w:hanging'), '360')
    pPr2.append(ind2)
    lvl2.append(pPr2)
    abstract_num.append(lvl2)

    # 三级编号:1.1.1
    lvl3 = OxmlElement('w:lvl')
    lvl3.set(qn('w:ilvl'), '2')
    lvl3.set(qn('w:start'), '1')
    lvl3.set(qn('w:numFmt'), 'decimal')
    lvl3.set(qn('w:lvlText'), '%1.%2.%3.')
    lvl3.set(qn('w:lvlJc'), 'left')
    pPr3 = OxmlElement('w:pPr')
    ind3 = OxmlElement('w:ind')
    ind3.set(qn('w:left'), '2160')
    ind3.set(qn('w:hanging'), '360')
    pPr3.append(ind3)
    lvl3.append(pPr3)
    abstract_num.append(lvl3)

    numbering_definitions.append(abstract_num)

    # 关联抽象编号到具体编号实例
    num = OxmlElement('w:num')
    num.set(qn('w:numId'), '1')
    abstract_num_id = OxmlElement('w:abstractNumId')
    abstract_num_id.set(qn('w:val'), '1')
    num.append(abstract_num_id)
    numbering_definitions.append(num)

# 创建文档对象
doc = Document()

# 添加自定义多级编号规则
add_multilevel_numbering(doc)

# 生成对应级别的列表段落
# 一级
p1 = doc.add_paragraph('Text1', style='List Paragraph')
p1._p.get_or_add_pPr().get_or_add_numPr().get_or_add_numId().val = '1'
p1._p.get_or_add_pPr().get_or_add_numPr().get_or_add_ilvl().val = '0'

# 二级
p2 = doc.add_paragraph('Text2', style='List Paragraph')
p2._p.get_or_add_pPr().get_or_add_numPr().get_or_add_numId().val = '1'
p2._p.get_or_add_pPr().get_or_add_numPr().get_or_add_ilvl().val = '1'

p3 = doc.add_paragraph('Text3', style='List Paragraph')
p3._p.get_or_add_pPr().get_or_add_numPr().get_or_add_numId().val = '1'
p3._p.get_or_add_pPr().get_or_add_numPr().get_or_add_ilvl().val = '1'

# 一级
p4 = doc.add_paragraph('Text4', style='List Paragraph')
p4._p.get_or_add_pPr().get_or_add_numPr().get_or_add_numId().val = '1'
p4._p.get_or_add_pPr().get_or_add_numPr().get_or_add_ilvl().val = '0'

# 二级
p5 = doc.add_paragraph('Text5', style='List Paragraph')
p5._p.get_or_add_pPr().get_or_add_numPr().get_or_add_numId().val = '1'
p5._p.get_or_add_pPr().get_or_add_numPr().get_or_add_ilvl().val = '1'

# 三级
p6 = doc.add_paragraph('Text6', style='List Paragraph')
p6._p.get_or_add_pPr().get_or_add_numPr().get_or_add_numId().val = '1'
p6._p.get_or_add_pPr().get_or_add_numPr().get_or_add_ilvl().val = '2'

p7 = doc.add_paragraph('Text7', style='List Paragraph')
p7._p.get_or_add_pPr().get_or_add_numPr().get_or_add_numId().val = '1'
p7._p.get_or_add_pPr().get_or_add_numPr().get_or_add_ilvl().val = '2'

# 保存文档
doc.save('multilevel_list.docx')

关键说明

  • 代码通过操作python-docx的底层XML元素,自定义了三级编号的格式和缩进,生成的是Word原生的编号列表,支持自动更新、格式调整等原生功能。
  • 每个段落通过指定numId(绑定编号方案)和ilvl(编号级别)来应用对应格式,避免了拼接字符串导致Word无法识别的问题。
  • 缩进参数以缇为单位,1英寸=1440缇,可以根据需求调整left和hanging的值。

内容的提问来源于stack exchange,提问作者Bareefoot CyberScotch

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 04:35:57