3

我有一个使用 pptx 模块 python-pptx 生成并放置在 PPT 文件中的表。我想在我的 PPT 文件中表格的每一行之间添加一条线。

在此处输入图像描述

我当前的代码:

prs = Presentation('existing-presentation.pptx')
slide = prs.slides.add_slide(prs.slide_layouts[0])
title = slide.shapes.title
title.text = "Slide Title"
df_to_table(slide, df)
prs.save(output)

def df_to_table(slide, df, colnames=None):

    rows, cols = df.shape
    placeholder = slide.placeholders[10]
    res = placeholder.insert_table(rows+1, cols)    
    res.table.columns[0].width = Pt(50)


    if colnames is None:
        colnames = list(df.columns)

    # Insert the column names
    for col_index, col_name in enumerate(colnames):
        # Column names can be tuples
        if not isinstance(col_name, str):
            col_name = " ".join(col_name)
        res.table.cell(0, col_index).text = col_name
        res.table.cell(0, col_index).text_frame.paragraphs[0].font.size=Pt(8)
        res.table.cell(0, col_index).text_frame.paragraphs[0].font.name='Arial'
        res.table.cell(0, col_index).text_frame.paragraphs[0].font.color.rgb=RGBColor(0, 0, 0)
        res.table.cell(0, col_index).fill.solid()
        res.table.cell(0, col_index).fill.fore_color.rgb=RGBColor(255, 255, 255)

    m = df.as_matrix()

    for row in range(rows):
        for col in range(cols):
            val = m[row, col]
            text = str(val)
            res.table.cell(row + 1, col).text = text
            res.table.cell(row + 1, col).text_frame.paragraphs[0].font.size=Pt(8)
            res.table.cell(row + 1, col).text_frame.paragraphs[0].font.name='Arial'
            res.table.cell(row + 1, col).text_frame.paragraphs[0].font.color.rgb=RGBColor(0, 0, 0)
            res.table.cell(row + 1, col).fill.solid()
            res.table.cell(row + 1, col).fill.fore_color.rgb=RGBColor(255, 255, 255) 
            res.table.rows[row+1].height = Pt(0.5)

            if col == 0: #ignore first col with names
                continue
            else:
                res.table.columns[col].width = Pt(55)
4

2 回答 2

1

pptx.shapes.table._Cell对象(例如从 table.cell(n, m) 接收)包含一个.fill属性,但不幸的是还不是一个.borders属性。我敢肯定这会在充足的时间到来,但它还没有。

与此同时,您需要深入了解_Cell 下的lxml 层。

首先,您可以打印出单元格元素的 XML,如下所示:

tc = cell._tc
print tc.xml

您可以创建一个非常小的文档,其中包含一个带有您想要的边框的表格,然后使用它来检查它。然后,您可以使用 lxml 调用添加所需的元素。如果您使用“python-pptx 变通方法”四处搜索,您会发现其他人的一些例子,他们已经做过这种事情。

于 2016-03-10T18:40:27.860 回答
0

不直接适合您的问题,但也许您的需要......

查看Table的 API ,您可以使用horz_bandingTable 对象的属性交替地对行进行着色。尝试添加您的函数(应用程序第 5 行,在if语句之前)

res.table.horz_banding=true
于 2016-03-10T12:31:47.103 回答