连续调用PPT模板生成与填充函数后保存PPTX时出现Duplicate name警告的问题求助
连续调用PPT模板生成与填充函数后保存PPTX时出现Duplicate name警告的问题求助
我现在用Python脚本修改并填充PPTX模板,写了两个核心函数:generate_template和fill_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




