Python PPTX:从另一个演示文稿添加整张幻灯片
Python PPTX: Adding Entire Slide from Another Presentation
这个问题似乎是在 2015 年提出并要求的,但我找不到任何关于它的更新。我正在尝试通过执行以下操作将整个幻灯片(包括其文本和图像)从另一个演示文稿复制到我的工作演示文稿中:
prs = Presentation('CurrentPresentation.pptx')
prs1 = Presentation('OtherPresentation.pptx')
# Wanted_Slide = prs1.slides[0]
New_Slide = prs.slides.add_slide(prs1.slide_layout[0])
但是所有这一切只是添加一个完全空白的幻灯片(具有所需幻灯片的背景)和幻灯片布局 0,这完全有意义。我知道这不是正确的做法。我尝试了下面的方法,它确实添加了一张幻灯片,但它只是 prs 演示文稿中已有内容的重复(我想我无意中找到了一种方法来复制演示文稿中已有的幻灯片):
def Add_Slide(self):
xml_slides = prs.slides._sldIdLst
xml_slides1 = prs1.slides._sldIdLst
slides = list(xml_slides)
slides1 = list(xml_slides1)
xml_slides.append(slides1[0])
以上代码是对网上找的一个幻灯片删除方法的操作
或者有人对如何将幻灯片及其所有内容完全复制到工作演示文稿有任何建议吗?
如果没有任何进展,我深表歉意,这 post 是重复的。提前谢谢你。
库的回购中有一个 issue 有一些代码可以做到这一点,但它很粗糙,并不适用于所有情况。
from pptx.parts.chart import ChartPart
from pptx.parts.embeddedpackage import EmbeddedXlsxPart
from pptx import Presentation
import copy
def _get_blank_slide_layout(pres):
layout_items_count = [len(layout.placeholders) for layout in pres.slide_layouts]
min_items = min(layout_items_count)
blank_layout_id = layout_items_count.index(min_items)
return pres.slide_layouts[blank_layout_id]
def move_slide(pres1, pres, index):
"""Duplicate the slide with the given index in pres1 and "moves" it into pres.
Adds slide to the end of the presentation"""
source = pres1.slides[index]
blank_slide_layout = _get_blank_slide_layout(pres)
dest = pres.slides.add_slide(blank_slide_layout)
for shape in source.shapes:
newel = copy.deepcopy(shape.element)
dest.shapes._spTree.insert_element_before(newel, 'p:extLst')
for key, value in source.part.rels.items():
# Make sure we don't copy a notesSlide relation as that won't exist
if "notesSlide" not in value.reltype:
target = value._target
# if the relationship was a chart, we need to duplicate the embedded chart part and xlsx
if "chart" in value.reltype:
partname = target.package.next_partname(
ChartPart.partname_template)
xlsx_blob = target.chart_workbook.xlsx_part.blob
target = ChartPart(partname, target.content_type,
copy.deepcopy(target._element), package=target.package)
target.chart_workbook.xlsx_part = EmbeddedXlsxPart.new(
xlsx_blob, target.package)
dest.part.rels.add_relationship(value.reltype, target,value.rId)
此功能是对上述位置的 github 评论内容的更改。它对我来说效果很好,还没有用图表或任何东西测试过。它与网站上 posted 的内容略有不同,因为原始答案中提到了粗略的示例,并且在演示文稿中复制了更详尽的答案。我想我会 post 因为我花了一些时间才把它们放在一起。
此解决方案主要适用于一个例外情况。将幻灯片复制到目标演示文稿后,当我打开目标演示文稿时,我收到以下警告:
PowerPoint couldn't read some content in xxx.pptx and removed it. Please check your presentation to see if the rest of it looks ok.
演示文稿的其余部分看起来不错,保存并重新打开后警告消失。您是否知道一种方法可以使此警告不出现,或者是否有一种方法可以使用 Python(再次 saving/closing?)来解决它。
这个问题似乎是在 2015 年提出并要求的,但我找不到任何关于它的更新。我正在尝试通过执行以下操作将整个幻灯片(包括其文本和图像)从另一个演示文稿复制到我的工作演示文稿中:
prs = Presentation('CurrentPresentation.pptx')
prs1 = Presentation('OtherPresentation.pptx')
# Wanted_Slide = prs1.slides[0]
New_Slide = prs.slides.add_slide(prs1.slide_layout[0])
但是所有这一切只是添加一个完全空白的幻灯片(具有所需幻灯片的背景)和幻灯片布局 0,这完全有意义。我知道这不是正确的做法。我尝试了下面的方法,它确实添加了一张幻灯片,但它只是 prs 演示文稿中已有内容的重复(我想我无意中找到了一种方法来复制演示文稿中已有的幻灯片):
def Add_Slide(self):
xml_slides = prs.slides._sldIdLst
xml_slides1 = prs1.slides._sldIdLst
slides = list(xml_slides)
slides1 = list(xml_slides1)
xml_slides.append(slides1[0])
以上代码是对网上找的一个幻灯片删除方法的操作
或者有人对如何将幻灯片及其所有内容完全复制到工作演示文稿有任何建议吗?
如果没有任何进展,我深表歉意,这 post 是重复的。提前谢谢你。
库的回购中有一个 issue 有一些代码可以做到这一点,但它很粗糙,并不适用于所有情况。
from pptx.parts.chart import ChartPart
from pptx.parts.embeddedpackage import EmbeddedXlsxPart
from pptx import Presentation
import copy
def _get_blank_slide_layout(pres):
layout_items_count = [len(layout.placeholders) for layout in pres.slide_layouts]
min_items = min(layout_items_count)
blank_layout_id = layout_items_count.index(min_items)
return pres.slide_layouts[blank_layout_id]
def move_slide(pres1, pres, index):
"""Duplicate the slide with the given index in pres1 and "moves" it into pres.
Adds slide to the end of the presentation"""
source = pres1.slides[index]
blank_slide_layout = _get_blank_slide_layout(pres)
dest = pres.slides.add_slide(blank_slide_layout)
for shape in source.shapes:
newel = copy.deepcopy(shape.element)
dest.shapes._spTree.insert_element_before(newel, 'p:extLst')
for key, value in source.part.rels.items():
# Make sure we don't copy a notesSlide relation as that won't exist
if "notesSlide" not in value.reltype:
target = value._target
# if the relationship was a chart, we need to duplicate the embedded chart part and xlsx
if "chart" in value.reltype:
partname = target.package.next_partname(
ChartPart.partname_template)
xlsx_blob = target.chart_workbook.xlsx_part.blob
target = ChartPart(partname, target.content_type,
copy.deepcopy(target._element), package=target.package)
target.chart_workbook.xlsx_part = EmbeddedXlsxPart.new(
xlsx_blob, target.package)
dest.part.rels.add_relationship(value.reltype, target,value.rId)
此功能是对上述位置的 github 评论内容的更改。它对我来说效果很好,还没有用图表或任何东西测试过。它与网站上 posted 的内容略有不同,因为原始答案中提到了粗略的示例,并且在演示文稿中复制了更详尽的答案。我想我会 post 因为我花了一些时间才把它们放在一起。
此解决方案主要适用于一个例外情况。将幻灯片复制到目标演示文稿后,当我打开目标演示文稿时,我收到以下警告:
PowerPoint couldn't read some content in xxx.pptx and removed it. Please check your presentation to see if the rest of it looks ok.
演示文稿的其余部分看起来不错,保存并重新打开后警告消失。您是否知道一种方法可以使此警告不出现,或者是否有一种方法可以使用 Python(再次 saving/closing?)来解决它。