如何使用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
相关产品推荐
相关产品推荐

