Python批量生成Word文档问题:循环仅处理首个数组元素求助
批量生成Word文档代码修复
你的代码无法批量生成文档的核心问题是缩进错误,循环内的代码没有正确归属于for value in filter_values:的代码块,导致仅执行了一次逻辑。此外还有重复读取Excel、无空数据判断等问题,以下是修复后的完整代码:
import pandas as pd from docx import Document from docx.shared import Pt # 提前读取Excel数据,避免循环内重复读取 df = pd.read_excel("./Test.xlsx", sheet_name="Per kontrate") # 定义占位符替换函数,减少重复代码 def replace_placeholders(element, replacements): for placeholder, value in replacements.items(): if placeholder in element.text: element.text = element.text.replace(placeholder, str(value)) # 需要过滤的LEVEL值列表 filter_values = ["P-07740", "P-15539", "P-17139"] # 遍历每个过滤值 for value in filter_values: # 过滤对应LEVEL的数据 df_filtered = df[df['LEVEL'] == value] # 检查是否有匹配数据,避免报错 if df_filtered.empty: print(f"未找到LEVEL为{value}的数据,跳过") continue # 提取数据 row = df_filtered.iloc[0] replacements = { '{{emri_mbiemri}}': f"{row['Emri']} {row['Mbiemri']}", '{{adresa}}': row['Adresa'], '{{nr_personal}}': row["ID NUMBER"], '{{vendi_qyteti}}': row['Vendi/Qyteti'], '{{kualifikim}}': row['Kualifikim'], '{{pozita}}': row["Titulli Aktual"], '{{detyrat}}': row["Detyrat e punes"], '{{pika}}': row["Nr I pikes"], '{{rruga}}': row["Rruga"], '{{fkontrata}}': row["Fillimi I\nkontrates"], '{{mkontrata}}': row["Nenshkrimi I\nkontrates"], '{{vendi}}': row['Vendi/Qyteti'] # 复用vendi_qyteti的值 } # 每次循环重新加载模板,避免污染原模板 document = Document('Kontrata.docx') # 设置文档字体 font = document.styles['Normal'].font font.name = 'Times New Roman' font.size = Pt(9) # 替换段落中的占位符 for paragraph in document.paragraphs: replace_placeholders(paragraph, replacements) # 替换表格中的占位符 for table in document.tables: for row in table.rows: for cell in row.cells: replace_placeholders(cell, replacements) # 保存文档,用姓名+LEVEL值命名避免重名 doc_name = f"{replacements['{{emri_mbiemri}}']}_{value}.docx" document.save(doc_name) print(f"已生成文档:{doc_name}")
关键修改点说明
- 修复缩进问题:确保循环内的所有代码都缩进,归属于
for value in filter_values:的代码块,保证每个过滤值都能执行完整逻辑。 - 优化Excel读取:将Excel读取移到循环外,避免重复读取文件,大幅提升执行效率。
- 添加空数据判断:检查
df_filtered是否为空,避免无匹配数据时iloc[0]抛出索引错误。 - 封装替换函数:把重复的占位符替换逻辑封装成函数,减少代码冗余,提升可维护性。
- 避免模板污染:每次循环重新加载Word模板,防止上一次的替换结果影响下一次生成的文档。
- 优化命名规则:文档名称添加LEVEL值,避免重名覆盖。
内容的提问来源于stack exchange,提问作者Festim Beqiri
相关产品推荐
相关产品推荐

