如何使用 Python 将 Excel 图表粘贴到 PowerPoint 占位符中?

How to paste an Excel chart into PowerPoint placeholder using Python?

我有一个 excel 文件,在名为 Charts 的选项卡上有一系列格式化图表。我已将图表命名为 Figure1Figure2Figure3

我有一个现有的 PowerPoint 模板。该模板每张幻灯片有 2 个占位符(因此每张幻灯片可以容纳 2 个图表)。

我想在幻灯片 3 的左侧占位符中粘贴 Figure1,在幻灯片 3 的右侧占位符中粘贴 Figure2。我想在 python 中执行此操作,因为数据分析在python中完成,excel用于与同事分享存储的结果。

尝试 1:

尝试 1 使用 win32com.client。我正在关注这个例子:How to copy chart from excel and paste it as chart into powerpoint (not image) using python

但我无法获得将图表插入占位符的正确语法。当我遵循解决方案中的语法时,没有任何反应,我收到一条消息

<bound method Paste of <COMObject >>

当前代码:

xlApp = win32.Dispatch('Excel.Application')
wb = xlApp.Workbooks.Open(outputPath+'Chart Pack.xlsb')
        
pptApp = win32.Dispatch('PowerPoint.Application')
ppt = pptApp.Presentations.Open(template)
        
# attempt 1
wb.sheets('Charts').ChartObjects('Figure1').Copy
ppt.slides[2].Shapes.Paste
    
# attempt 2
wb.sheets('Charts').ChartObjects('Figure1').Copy
ppt.slides[2].placeholders[1].Paste

尝试 2:

尝试 2 使用 python-pptx。我在这里查看了文档: https://python-pptx.readthedocs.io/en/latest/user/placeholders-using.html

但该示例涉及在 PowerPoint 中从头开始创建 excel 图表(我不确定您为什么要这样做),而且我无法弄清楚从 excel.

当前代码:

from pptx import Presentation

xlApp = win32.Dispatch('Excel.Application')
wb = xlApp.Workbooks.Open(outputPath+'Chart Pack.xlsb')
    
prs = Presentation(template)
slide = prs.slides[3]
    
for shape in slide.placeholders:
    print('%d %s' % (shape.placeholder_format.idx, shape.name))

placeholder = prs.slides[3].placeholders[1]
placeholder.name
placeholder.placeholder_format.type
placeholder.insert_chart(wb.sheets('Charts').ChartObjects('Figure1').Copy)

要求:

  1. 我想将 excel 图表粘贴为 excel 对象(而不是图片),因为我的同事希望能够单击数据系列来获取基础值等

  2. 我想将图表粘贴到占位符内(而不是在它上面)。

  3. 我不想像大多数示例那样在 PowerPoint 中生成新图表。一位同事准备了一个 excel 仪表板并根据需要格式化了一些图表,从头开始做这一切会很费力。

  4. 我不想在 VBA 中这样做。我想在 python 中进行,因为它是更广泛计划的一部分。

  5. 我不想使用 plotnineseabornmatplotlib 等。根据 1,我的同事喜欢 excel他可以单击以显示潜在值的对象。这不能在这些程序中完成。

Python应该可以做到这一点。有什么想法吗?

你非常接近! CopyPaste 是方法,因此要调用它们,您需要在它们之后添加方括号,例如Copy().

要获取幻灯片 2,您需要使用 Slides class 的 Item 方法:ppt.Slides.Item(2)

import win32com.client as win32

xlApp = win32.Dispatch('Excel.Application')
wb = xlApp.Workbooks.Open(outputPath+'Chart Pack.xlsb')

pptApp = win32.Dispatch('PowerPoint.Application')
ppt = pptApp.Presentations.Open(template)

slide_num = 3
LEFT_PLACEHOLDER = 3
RIGHT_PLACEHOLDER = 2

# Figure1
window.View.GotoSlide(slide_num)
wb.sheets('Charts').ChartObjects('Figure1').Copy()
ppt.Slides.Item(slide_num).Shapes.Paste().Select()
window.Selection.Cut()
ppt.Slides.Item(slide_num).Shapes(LEFT_PLACEHOLDER).Select()
window.View.Paste()

# Figure2
window.View.GotoSlide(slide_num)
wb.sheets('Charts').ChartObjects('Figure2').Copy()
ppt.Slides.Item(slide_num).Shapes.Paste().Select()
window.Selection.Cut()
ppt.Slides.Item(slide_num).Shapes(RIGHT_PLACEHOLDER).Select()
window.View.Paste()

编辑:在尝试实施此 中的解决方案后,我能够将图表直接粘贴到占位符中。它有点 hacky,但它有效。