使用 Python 将 Excel 中的图表导入到 PowerPoint

11
我有一个使用优秀的"xlsxwriter"模块创建的Excel工作簿。在这个工作簿中,约有200个嵌入的图表。现在我正在尝试将所有这些图表导出到几个PowerPoint演示文稿中。理想情况下,我希望保留原始格式和嵌入的数据,而不链接到外部Excel工作簿。
我确定可以使用VBA来完成此操作。但是,我想知道是否有办法使用Python完成此操作。是否有办法将xlsxwriter图表对象放入PowerPoint中?
我已经查看了python-pptx,但找不到有关从Excel工作簿获取图表或数据系列的任何信息。
感谢您的任何帮助!

你可以尝试使用OpenPyXl从Excel文件中读取图表,我相信它支持将其写入文件缓冲区,然后添加到PowerPoint。编辑:OpenPyXl仍不支持图表读取,因此我怀疑在Python中实现这一点是否可能。 - Alex Huszagh
try www.pptxbuilder.com - Boosted_d16
3个回答

10
在尝试了不同的方法之后,我找到了这个问题的解决方案。希望它能帮助某人节省一些时间。以下代码将复制“workbook_with_charts.xlsx”中的所有图表到“Final_PowerPoint.pptx”中。
由于某些原因,我还没有理解,如果从CMD终端运行此Python程序,则其效果更佳。如果您尝试运行此程序多次,则有时会出现故障,即使第一次运行通常都可以。
另一个问题是,在第五行中,如果使用“presentation=PowerPoint.Presentations.Add(False)”将“False”更改为Microsoft Office 2013将无法工作,即使在Microsoft Office 2010中仍然可以使用“True”和“False”。
如果有人能澄清这两个问题,那就太好了。
# 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()

我遇到了AttributeError: ppLayoutBlank错误。 - R__raki__
@nyan314sn 你好!这是一个非常不错的基础使用示例。你能告诉我在哪里找到了支持材料(帮助、指南、教程等),其中解释了如PowerPoint.Presentations.Add()Slide.Shapes.PasteSpecial()Slide.Shapes.AddTextbox()等代码及其使用吗? - Mike
1
@Mike,一旦你从Python控制Excel和/或PowerPoint文件中得到基本设置的工作,额外复杂的东西实质上来自于VBA指南,因为我们实质上是从更有效的代码结构(Python)编写VBA代码。例如, https://learn.microsoft.com/en-us/office/vba/api/PowerPoint.Presentations.Add 或 https://learn.microsoft.com/en-us/office/vba/api/excel.workbook - nyan314sn
@R__raki__ 你好,这段代码应该可以解决你的问题:from win32com.client import constants - Mike

5
我倾向于使用当前python-pptx版本的方法是读取Excel表格中的数据,并在python-pptx中重新创建图表。当然,这需要知道图表格式等信息,所以我可以理解你可能不想这样做。
过去已经直接从Excel导入图表了,在GitHub上看到了相关的拉取请求:https://github.com/scanny/python-pptx/pull/65
但是这涉及对python-pptx进行大量手术,并且现在已经过时了,因此最多只能作为什么策略可能有效的好指南。我想你必须非常想要才会选择这条路 :)

嗨Scanny,感谢您的回答。就算我怀疑python-pptx在图表方面提供的精细程度不及"xlsxwriter",我也不介意使用它重新创建图表。此外,我找不到任何关于从python-pptx读取excel工作表数据的示例。如果您有,请分享一下。 - nyan314sn
你需要使用另一个包来读取Excel数据。我在考虑使用xlsxwriter是一个选项,因为它已经被python-pptx导入了,但现在记得它不适用于读取。我想这必须是其他Excel包之一,或者可能是导出为CSV。 - scanny
嗨@scanny,Python-pptx图表功能中是否会很快加入堆叠图、水平条形图和面积图? - vagabond
@vagabond 这是一个独立的问题,最好在python-pptx GitHub问题列表上解决。简短的答案是现在大部分都在那里了。 - scanny

1
我没有足够的声望来发表评论,但如果您遇到与@R__raki__相同的问题,则可以使用由VBA参考定义的整数值。对于这种情况,它将是12。
因此替换
Slide=presentation.Slides.Add(presentation.Slides.Count+1,constants.ppLayoutBlank)

使用

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

请参见 这里 以获取更多信息。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接