如何在python-docx中实现有序列表编号重启?
解决python-docx中编号列表重启的问题
python-docx默认会复用同一个编号规则,所以后续列表会自动延续之前的编号。要实现编号重启,有两种常用方法:
方法一:创建独立的编号样式(适合多次复用)
通过新增一个基于默认编号样式的自定义样式,修改其编号起始值,这样每次需要重启编号时直接用这个样式即可:
from docx import Document from docx.enum.style import WD_STYLE_TYPE doc = Document() # 添加列表1标题和项目 doc.add_paragraph("列表1", style="Heading 2") for i in range(3): doc.add_paragraph(f"列表1项{i+1}", style="List Number") # 添加列表2标题 doc.add_paragraph("列表2", style="Heading 2") # 创建新的重启编号样式 restart_style = doc.styles.add_style("Restarted Number List", WD_STYLE_TYPE.PARAGRAPH) restart_style.base_style = doc.styles["List Number"] # 修改新样式的编号起始为1 numbering_part = doc.part.numbering_part num_id = restart_style._element.numId.val num_def = numbering_part.numbering_definitions._get_num(num_id) num_def.add_lvlOverride(ilvl=0).add_start(1) # 使用新样式添加列表2项目 for i in range(3): doc.add_paragraph(f"列表2项{i+1}", style="Restarted Number List") doc.save("restarted_lists.docx")
方法二:直接修改段落的编号起始(适合单次使用)
如果只需要重启一次编号,可以直接给新列表的第一个段落设置编号起始值,后续段落会自动沿用这个新的编号序列:
from docx import Document from docx.oxml.ns import qn from docx.oxml import OxmlElement doc = Document() # 列表1部分 doc.add_paragraph("列表1", style="Heading 2") for i in range(3): doc.add_paragraph(f"列表1项{i+1}", style="List Number") # 列表2部分 doc.add_paragraph("列表2", style="Heading 2") # 添加第一个项目并修改编号起始 first_para = doc.add_paragraph("列表2项1", style="List Number") num_pr = first_para._element.get_or_add_pPr().get_or_add_numPr() start_elem = OxmlElement('w:start') start_elem.set(qn('w:val'), '1') num_pr.append(start_elem) # 后续项目自动延续新编号 doc.add_paragraph("列表2项2", style="List Number") doc.add_paragraph("列表2项3", style="List Number") doc.save("restarted_lists.docx")
内容的提问来源于stack exchange,提问作者CJ Conti
相关产品推荐
相关产品推荐

