python-docx 重新启动列表编号

问题描述 投票:0回答:1

我正在使用 python-docx,我能够生成数字列表。如何重新启动这些列表的号码?

我希望列表看起来像这样。

列表1

  1. 列出 1 项 1
  2. 列表 1 项目 2
  3. 列表 1 项目 3

列表2

  1. 列表 2 第 1 项
  2. 列表 2 第 2 项
  3. 列表 3 第 3 项

Python-docx 生成这样的项目

  1. 列出 1 项 1
  2. 列表 1 项目 2
  3. 列表 1 项目 3
  4. 列表 2 第 1 项
  5. 列表 2 第 2 项
  6. 列表 3 第 3 项

如果您能帮助解决此问题,我将不胜感激。

python ms-word python-docx
1个回答
0
投票

Microsoft Word 文档中的编号以及 python-docx 支持的内容

为了编号,段落链接到编号。这可以使用存储链接到编号的段落属性的样式或使用直接在段落中链接到编号的段落属性来完成。

Python-docx 提供了存储链接到编号的段落属性的样式。这些样式可以分配给段落。但每种样式都链接到“one”编号。这就是为什么具有这种样式的每个段落都会继续编号。

如何解决?

最简单的方法是使用

another

列表样式分配给第二个列表中的段落。示例: from docx import Document from docx.shared import Inches document = Document() paragraph = document.add_paragraph() paragraph.add_run('List 1').bold = True for i in range(1, 4): document.add_paragraph( f'List 1 Item {i}', style='List Number' ) paragraph = document.add_paragraph() paragraph.add_run('List 2').bold = True for i in range(1, 4): paragraph = document.add_paragraph( f'List 2 Item {i}', style='List Number 2' ) paragraph.paragraph_format.left_indent = Inches(.25) paragraph.paragraph_format.tab_stops.add_tab_stop(Inches(.25)) document.save('test.docx')

但是,当然,这仅限于 3 个,因为 python-docx 默认只提供 3 个“列表编号”样式。这些样式中的每一种也会有其他不同的格式设置,然后需要更改。

更类似于Word的解决方案是准备编号以具有新的编号,该编号指向相同的抽象编号,样式“列表编号”也指向但已设置开始覆盖。然后可以将这个新编号设置为第二个列表中第一段落的段落属性。

不幸的是 python-docx 没有提供太多的编号功能。因此,由于需要直接使用低级别的

CT_*

类,代码将会变得冗长。示例:

from docx import Document
from docx.shared import Inches

document = Document()

paragraph = document.add_paragraph()
paragraph.add_run('List 1').bold = True

for i in range(1, 4):
    document.add_paragraph(
        f'List 1 Item {i}', style='List Number'
    )
    
paragraph = document.add_paragraph()
paragraph.add_run('List 2').bold = True

#prepare the numberings to have a new numbering, which points to the same abstract numbering, 
#the style "List Number" also points to but has start override set
styles = document.styles
#get numId to which style 'List Number' links
num_id_list_number = -1
for style in styles:
    if (style.name == 'List Number'):
        num_id_list_number = style._element.pPr.numPr.numId.val
#add new numbering linking to same abstractNumId but has startOverride 
#and get new numId
num_id_list_number_new = -1
if (num_id_list_number > -1):        
    ct_numbering = document.part.numbering_part.numbering_definitions._numbering
    ct_num = ct_numbering.num_having_numId(num_id_list_number)
    abstractNumId = ct_num.abstractNumId.val
    ct_num = ct_numbering.add_num(abstractNumId)
    num_id_list_number_new = ct_num.numId
    startOverride = ct_num.add_lvlOverride(0)._add_startOverride()
    startOverride.val = 1

for i in range(1, 4):
    paragraph = document.add_paragraph(
            f'List 2 Item {i}', style='List Number'
        )
    
    #first paragraph in new list links to new numId having startOverride
    if ( i == 1 and num_id_list_number_new > -1):
        numPr = paragraph._element.pPr._add_numPr()
        numPr._add_numId().val = num_id_list_number_new

document.save('test.docx')

	
© www.soinside.com 2019 - 2024. All rights reserved.