使用python-pptx添加项目符号列表

时间:2018-03-20 12:22:37

标签: python powerpoint python-pptx

我正在使用python-pptx库进行pptx操作。我想在pptx文档中添加一个项目符号列表。

我使用以下代码段添加列表项:

p = text_frame.add_paragraph()
run = p.add_run()
p.level = 0
run.text = "First"

但它没有显示要点;请指导。

4 个答案:

答案 0 :(得分:2)

当前无法使用python-pptx访问bullet属性,但我想分享一个对我有用的解决方法。

这需要使用pptx模板,在此模板中,我们利用了可以单独自定义幻灯片版式中的级别的事实。

例如,在幻灯片布局中,您可以将级别0设置为普通文本,级别1设置为项目符号,级别2设置为数字或您想要的任何其他列表样式。然后,您可以修改字体大小,缩进(使用顶部的标尺)以及每个级别的任何其他属性,以获取所需的外观。

对于我的用例,我只是将级别1和2设置为具有与级别0相同的缩进和大小,只需将级别设置为相应的值,就可以创建项目符号列表和编号列表。

这是我的幻灯片布局在模板文件中的外观: slide layout example

这就是我在代码中设置相应列表样式的方式:

p.level = 0  # Regular text
p.level = 1  # Bullet
p.level = 2  # Numbers

理论上,即使使用缩进的子列表等,您也应该能够完全按照所需的方式进行设置。我知道的唯一限制是,在幻灯片布局中最多可以自定义8个级别。

答案 1 :(得分:0)

尝试一下:

p = text_frame.add_paragraph()
p.level = 0
p.text = "First"

或者如果text_frame已经有一个段落:

p = text_frame.paragraphs[0]
p.level = 0
p.text = "First"

答案 2 :(得分:0)

我的解决方案:

from pptx.oxml.xmlchemy import OxmlElement

def SubElement(parent, tagname, **kwargs):
        element = OxmlElement(tagname)
        element.attrib.update(kwargs)
        parent.append(element)
        return element
    
def makeParaBulletPointed(para):
    """Bullets are set to Arial,
        actual text can be a different font"""
    pPr = para._p.get_or_add_pPr()
    ## Set marL and indent attributes
    pPr.set('marL','171450')
    pPr.set('indent','171450')
    ## Add buFont
    _ = SubElement(parent=pPr,
                   tagname="a:buFont",
                   typeface="Arial",
                   panose="020B0604020202020204",
                   pitchFamily="34",
                   charset="0"
                   )
    ## Add buChar
    _ = SubElement(parent=pPr,
                   tagname='a:buChar',
                   char="•")

答案 3 :(得分:0)

这个问题在 2021 年 5 月 27 日仍然是最新的。 跟进@OD1995 的回答,我想添加更多细节以及我对问题的看法。

我使用以下代码创建了一个新包:

from pptx.oxml.xmlchemy import OxmlElement


def getBulletInfo(paragraph, run=None):
    """Returns the attributes of the given <a:pPr> OxmlElement
    as well as its runs font-size.

    *param: paragraph* pptx _paragraph object
    *param: run* [optional] specific _run object
    """
    pPr = paragraph._p.get_or_add_pPr()
    if run is None:
        run = paragraph.runs[0]
    p_info = {
        "marL": pPr.attrib['marL'],
        "indent": pPr.attrib['indent'],
        "level": paragraph.level,
        "fontName": run.font.name,
        "fontSize": run.font.size,
    }
    return p_info


def SubElement(parent, tagname, **kwargs):
    """Helper for Paragraph bullet Point
    """
    element = OxmlElement(tagname)
    element.attrib.update(kwargs)
    parent.append(element)
    return element


def pBullet(
    paragraph,  # paragraph object
    font,  # fontName of that needs to be applied to bullet
    marL='864000',
    indent='-322920',
    size='350000'  # fontSize (in )
):
    """Bullets are set to Arial,
    actual text can be a different font
    """
    pPr = paragraph._p.get_or_add_pPr()
    # Set marL and indent attributes
    # Indent is the space between the bullet and the text.
    pPr.set('marL', marL)
    pPr.set('indent', indent)
    # Add buFont
    _ = SubElement(parent=pPr,
                   tagname="a:buSzPct",
                   val="350000"
                   )
    _ = SubElement(parent=pPr,
                   tagname="a:buFont",
                   typeface=font,
                   # panose="020B0604020202020204",
                   # pitchFamily="34",
                   # charset="0"
                   )
    # Add buChar
    _ = SubElement(parent=pPr,
                   tagname='a:buChar',
                   char="•"
                   )

我这样做的原因是因为我对项目符号字符与原始大小不同并且文本粘在项目符号上感到沮丧。

getBulletInfo() 允许我从现有段落中检索信息。 我使用此信息填充元素的属性(使其与模板相同)。

无论如何,主要的附加组件是创建子元素 <a:buSzPct>(文档 herehere)。这是一个可以从 25% 到 350% (100000 = 100%) 的大小百分比。