使用 Python 从 Excel 到 PowerPoint 的图表

Charts from Excel to PowerPoint with Python

我有一个 excel 工作簿,它是使用 excellent "xlsxwriter" 模块创建的。在这个工作簿中,大约有 200 个嵌入式图表。我现在正尝试将所有这些图表导出到几个 powerpoint 演示文稿中。理想情况下,我想保留原始格式和嵌入数据而不链接到外部 excel 工作簿。

我相信有一种方法可以使用 VBA 来做到这一点。但是,我想知道是否有办法使用 Python 来做到这一点。有没有办法将 xlsxwriter 图表对象放入 powerpoints 中?

我查看了 python-pptx,但找不到任何关于从 excel 工作簿中获取图表或数据系列的信息。

感谢任何帮助!

我倾向于使用当前 python-pptx 版本的方法是读取 Excel 表中的数据并在 python-pptx 中重新创建图表。这当然需要知道图表格式是什么等等,所以我可以理解为什么你可能不想这样做。

直接从 Excel 导入图表过去已经完成,请参阅 GitHub 上的拉取请求:https://github.com/scanny/python-pptx/pull/65

但是它涉及到对 python-pptx 的大量修改,而且现在有很多版本,所以它最多可能是一个很好的指导,说明哪些策略可能有效。你需要非常想要它我想走那条路:)

在花费数小时尝试不同的事情之后,我找到了解决这个问题的方法。希望它能帮助某人节省一些 time.The 以下代码会将所有图表从 "workbook_with_charts.xlsx" 复制到 "Final_PowerPoint.pptx."

出于某种原因,我还没有明白,当从 CMD 终端 运行 运行这个 Python 程序时,它工作得更好。如果您尝试 运行 几次,它有时会崩溃,即使第一个 运行 通常没问题。

另一个问题是,在第五行中,如果您使用 "presentation=PowerPoint.Presentations.Add(False)," 设置为 False,则它不适用于 Microsoft Office 2013,即使 "True" 和 "False" 仍然有效使用 Microsoft Office 2010。

如果有人能澄清这两个问题就太好了。

# importing the necessary libraries
import win32com.client
from win32com.client import constants

PowerPoint=win32com.client.Dispatch("PowerPoint.Application")
Excel=win32com.client.Dispatch("Excel.Application")


presentation=PowerPoint.Presentations.Add(True)
workbook=Excel.Workbooks.Open(Filename="C:\.........\workbook_with_charts.xlsx",ReadOnly=1,UpdateLinks=False)

for ws in workbook.Worksheets:
    for chart in ws.ChartObjects():
    # Copying all the charts from excel
        chart.Activate()
        chart.Copy()  

        Slide=presentation.Slides.Add(presentation.Slides.Count+1,constants.ppLayoutBlank)
        Slide.Shapes.PasteSpecial(constants.ppPasteShape)

    # WE are going to make the title of slide the same chart title
    # This is optional 
    textbox=Slide.Shapes.AddTextbox(1,100,100,200,300)
    textbox.TextFrame.TextRange.Text=str(chart.Chart.ChartTitle.Text)

presentation.SaveAs("C:\...........\Final_PowerPoint.pptx")
presentation.Close()
workbook.Close()

print 'Charts Finished Copying to Powerpoint Presentation'

Excel.Quit()
PowerPoint.Quit()

我没有足够的声誉来发表评论,但如果您遇到与@R__raki__ 相同的问题,那么您可以使用 VBA 引用定义的整数值。对于这种情况,它将是 12.

所以替换

Slide=presentation.Slides.Add(presentation.Slides.Count+1,constants.ppLayoutBlank)

Slide=presentation.Slides.Add(presentation.Slides.Count+1,12)

有关更多信息,请参阅 here