You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

连续调用PPT模板生成与填充函数后保存PPTX时出现Duplicate name警告的问题求助

连续调用PPT模板生成与填充函数后保存PPTX时出现Duplicate name警告的问题求助

我现在用Python脚本修改并填充PPTX模板,写了两个核心函数:generate_templatefill_in_doc。单独分开运行这两个函数时一切正常,但如果连续调用它们(先生成调整后的模板,再填充内容),在保存填充后的模板时就会触发下面的警告:

return self._open_to_write(zinfo, force_zip64=force_zip64)
/usr/lib/python3.10/zipfile.py:1528: UserWarning: Duplicate name: 'ppt/slides/slide8.xml'

我已经在代码里加了不少打印调试,确定问题出在替换完标签值、执行template.save()的时候。

以下是我的函数代码:

fill_in_doc函数

def fill_in_doc(template,data):

    for slide in template.slides:
        for shape in slide.shapes:
            if not shape.has_text_frame:
                continue
            for paragraph in shape.text_frame.paragraphs :
                for run in paragraph.runs:
                    for cle,valeur in data.items():
                        if f"<{cle}>" in run.text:  
                            run.text=data[cle]
    print('sauvegarde en cours')
    template.save(memodir / 'templates/offre_APS_finale.pptx')

generate_template函数

def generate_template(prs,data):
    if data['modele_economique']=='Injection' and data['modele_financement']=='EPC':
        delete_slide(prs,'TI')
        delete_slide(prs,'TI_INJECTION')
        delete_slide(prs,'TI_AUTOCONSOMMATION')
        delete_slide(prs,'AUTOCONSOMMATION')
    elif data['modele_economique']=='Injection' and data['modele_financement']=='Tier_investissement':
        delete_slide(prs,'EPC')
        delete_slide(prs,'EPC_INJECTION')
        delete_slide(prs,'TI_AUTOCONSOMMATION')
        delete_slide(prs,'AUTOCONSOMMATION')
    elif data['modele_economique']=='Autoconsommation' and data['modele_financement']=='EPC':
        delete_slide(prs,'EPC_INJECTION')
        delete_slide(prs,'TI')
        delete_slide(prs,'TI_INJECTION')
        delete_slide(prs,'TI_AUTOCONSOMMATION')
    else :
        delete_slide(prs,'TI_INJECTION')
        delete_slide(prs,'TI_AUTOCONSOMMATION')
        delete_slide(prs,'EPC_INJECTION')
        delete_slide(prs,'TI_INJECTION')
        delete_slide(prs,'EPC')

delete_slide函数

def delete_slide(prs, text_to_search):

    slides_suppr = find_slides_by_text(prs, text_to_search)
    xml_slides = prs.slides._sldIdLst 
    slides = list(xml_slides) 

    for slide_index in reversed(slides_suppr):  # problèmes de réindexation
        print(f"Suppression de la diapositive : {slide_index}")
        slide_element = slides[slide_index]
        xml_slides.remove(slide_element)  # l'élément donné

    template.save(memodir / 'static/offre_APS_test.pptx')

find_slides_by_text函数

def find_slides_by_text(prs, text_to_search):

    slides = []

    for idx, slide in enumerate(prs.slides):
        for shape in slide.shapes:
            if shape.has_text_frame:
                 if re.search(r'\b' + re.escape(text_to_search) + r'\b', shape.text, re.IGNORECASE):
                    slides.append(idx)
                    break
    return slides

有没有大佬能帮我看看这个重复文件名的问题是怎么产生的?应该怎么解决呢?

备注:内容来源于stack exchange,提问作者Louise Hinard

火山引擎 最新活动