如何使用python PPTX在PowerPoint PPTX模板之间映射布局?

如何使用python PPTX在PowerPoint PPTX模板之间映射布局?,python,powerpoint,python-pptx,Python,Powerpoint,Python Pptx,以下是我试图学习的方法: 我工作的公司大约有120多个.pptx文件,这些文件都是几年来使用.potx PowerPoint模板手动创建的 一位图形设计师创建了一个时髦的新模板 我的老板分配给我的任务是将所有120多个甲板从过时的模板转换成新的模板 旧模板有十几个自定义布局,名称如下:标题幻灯片、简介幻灯片、通用流程、空白、比较[…]新模板更新了布局,名称相同(大致相同)。在XML数据中,我确信每个布局都有某种类型的。我希望能够使用Python从旧的演示文稿中提取我需要的内容,并使用这些数据

以下是我试图学习的方法:

  • 我工作的公司大约有120多个.pptx文件,这些文件都是几年来使用.potx PowerPoint模板手动创建的
  • 一位图形设计师创建了一个时髦的新模板
  • 我的老板分配给我的任务是将所有120多个甲板从过时的模板转换成新的模板
旧模板有十几个自定义布局,名称如下:标题幻灯片、简介幻灯片、通用流程、空白、比较[…]新模板更新了布局,名称相同(大致相同)。在XML数据中,我确信每个布局都有某种类型的
。我希望能够使用Python从旧的演示文稿中提取我需要的内容,并使用这些数据生成新的演示文稿,但要使用新的布局

我已经阅读了python pptx GitHub存储库上的所有交互,并观看了使用现有模板创建新演示文稿的过程。尽管经历了一整天的尝试和许多错误,我只是在学习上做得不够,无法控制这个项目。
很明显,我并不期望有完整的细节,但任何朝着正确方向的推动都会令人难以置信地感激

好吧,我认为要让这项工作正常进行,您将面临几个挑战,单问题/单答案也是如此,所以让我们将其缩小到第一个问题,我们可以称之为“使用python PPTX在PPTX模板之间映射布局”。也许值得考虑将问题标题改为类似的内容

当然,你可以在下一步和下一步提出更多有针对性的问题,等等

我对第一个问题的理解是:

对于源演示文稿中的每张幻灯片,请使用与源幻灯片布局相对应的新版本幻灯片布局在目标演示文稿中创建一张幻灯片

我倾向于认为这可以简化为这样一个函数:

layout_map = {
    "Title Slide": "Title",
    "Intro Slide": "Introduction",
    "Generic Process": "Process",
    ...
}

def corresponding_slide_layout(slide, new_prs):
    legacy_layout_name = slide.slide_layout.name
    new_name = layout_map.get(legacy_layout_name)
    if new_name is None:
        # --- there's a gap in the mapping ---
        return None
    return new_prs.slide_layouts.get_by_name(new_name)

new_prs = Presentation("my-new-template.pptx")
for slide in prs.slides:
    layout = corresponding_slide_layout(slide, new_prs)
    if layout is None:
        layout = new_prs.slide_layouts[5]  # --- or whatever default ---
    new_slide = new_prs.slides.add_slide(layout)
    # --- then pass to other function you write to do the shape copying ---
    copy_slide_contents(slide, new_slide)

一般要点是,您可以按名称将旧样式布局映射到新样式布局,然后使用该映射为每个目标幻灯片选择布局。这应该是非常可靠的,因为可能会添加一个默认值,其中可能没有清晰的映射,或者可能是用户编辑了原始名称或其他内容。

好吧,我希望您在实现这一点方面面临着一些挑战,单问题/单答案的位置也是如此,因此,让我们把这个问题缩小到第一个问题,我们可以称之为“使用python PPTX在PPTX模板之间映射布局”。也许值得考虑将问题标题改为类似的内容

当然,你可以在下一步和下一步提出更多有针对性的问题,等等

我对第一个问题的理解是:

对于源演示文稿中的每张幻灯片,请使用与源幻灯片布局相对应的新版本幻灯片布局在目标演示文稿中创建一张幻灯片

我倾向于认为这可以简化为这样一个函数:

layout_map = {
    "Title Slide": "Title",
    "Intro Slide": "Introduction",
    "Generic Process": "Process",
    ...
}

def corresponding_slide_layout(slide, new_prs):
    legacy_layout_name = slide.slide_layout.name
    new_name = layout_map.get(legacy_layout_name)
    if new_name is None:
        # --- there's a gap in the mapping ---
        return None
    return new_prs.slide_layouts.get_by_name(new_name)

new_prs = Presentation("my-new-template.pptx")
for slide in prs.slides:
    layout = corresponding_slide_layout(slide, new_prs)
    if layout is None:
        layout = new_prs.slide_layouts[5]  # --- or whatever default ---
    new_slide = new_prs.slides.add_slide(layout)
    # --- then pass to other function you write to do the shape copying ---
    copy_slide_contents(slide, new_slide)

一般要点是,您可以按名称将旧样式布局映射到新样式布局,然后使用该映射为每个目标幻灯片选择布局。这应该是非常可靠的,因为可能会添加一个默认值,其中没有清晰的映射,或者可能是用户编辑了原始名称或其他内容。

图形设计师不知道如何创建一个新模板来成功接受旧幻灯片。下面是我关于成功更新遗留演示文稿所需管理的5个参数的文章:您的链接是关于这个问题的一篇非常好的文章,John!我欣赏你的作品已经有一段时间了,我很高兴发现了我还没有遇到的这件作品:)平面设计师不知道如何创建一个新的模板,成功地接受传统幻灯片。下面是我关于成功更新遗留演示文稿所需管理的5个参数的文章:您的链接是关于这个问题的一篇非常好的文章,John!我欣赏你的作品已经有一段时间了,我很高兴发现了我还没有遇到的这篇文章:)我不确定改变这个问题是否是个好主意。当然,解决这个问题需要几个步骤,但基本问题“如何使用python pptx更新模板”更可能是人们需要解决的问题。谁会搜索各个步骤?如果您能够理解各个步骤,您可能不需要再看stackoverflow了……我不确定改变这个问题是否是个好主意。当然,解决这个问题需要几个步骤,但基本问题“如何使用python pptx更新模板”更可能是人们需要解决的问题。谁会搜索各个步骤?如果您能够理解各个步骤,您可能不再需要查看stackoverflow。。。