You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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}")

关键修改点说明

  1. 修复缩进问题:确保循环内的所有代码都缩进,归属于for value in filter_values:的代码块,保证每个过滤值都能执行完整逻辑。
  2. 优化Excel读取:将Excel读取移到循环外,避免重复读取文件,大幅提升执行效率。
  3. 添加空数据判断:检查df_filtered是否为空,避免无匹配数据时iloc[0]抛出索引错误。
  4. 封装替换函数:把重复的占位符替换逻辑封装成函数,减少代码冗余,提升可维护性。
  5. 避免模板污染:每次循环重新加载Word模板,防止上一次的替换结果影响下一次生成的文档。
  6. 优化命名规则:文档名称添加LEVEL值,避免重名覆盖。

内容的提问来源于stack exchange,提问作者Festim Beqiri

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 20:04:55