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

使用Python实现docx与Excel邮件合并时遇IndexError问题求助

Python邮件合并代码错误修复方案

错误根源

触发IndexError的核心原因是误用了Python内置函数zip:
你写成了zip[zip_code, ...],把zip当成数组/列表用方括号索引,但zip是函数,必须用函数调用语法zip(参数1, 参数2, ...)来合并多个可迭代对象。

修正后的基础代码

先修复zip的调用方式,同时修正循环内的缩进问题:

import pandas as pd
import os
import sys
from docxtpl import DocxTemplate

fname2=r"Agent Letter.docx"
df=pd.read_excel(r"Agents 2 Address Line.xlsx")

# 提取列数据(保留你的原始写法)
zip_code=df["zip"].values
agent_state=df["agent_state"].values
pw=df["pw"].values
agent_address_1=df["agent_address_1"].values
primary_owner=df["primary_owner"].values
agent_city=df["agent_city"].values
wr_id=df["wr_id"].values
agent_name=df["agent_name"].values
agent_address_2=df["agent_address_2"].values

# 修复zip的调用方式:用()而非[]
final = zip(zip_code, agent_state, pw, agent_address_1, primary_owner, agent_city, wr_id, agent_name, agent_address_2)

# 修复缩进问题,确保doc.render和doc.save在循环块内
for a,b,c,d,e,f,g,h,i in final:
    doc=DocxTemplate(fname2)
    context={"zip_code":a,"agent_state":b,"pw":c,"agent_address_1":d,"primary_owner":e,
             "agent_city":f,"wr_id":g,"agent_name":h,"agent_address_2":i}
    doc.render(context)
    # 注意:若agent_state存在重复值,会导致文件覆盖,建议用唯一字段命名
    doc.save(f'{b}.docx')

print("All Files done")

更简洁的优化写法

无需手动提取每一列,直接遍历DataFrame的行即可,代码更易维护:

import pandas as pd
from docxtpl import DocxTemplate

fname2 = r"Agent Letter.docx"
df = pd.read_excel(r"Agents 2 Address Line.xlsx")

# 直接遍历DataFrame每行数据
for _, row in df.iterrows():
    doc = DocxTemplate(fname2)
    # 直接从row中取对应列的值
    context = {
        "zip_code": row["zip"],
        "agent_state": row["agent_state"],
        "pw": row["pw"],
        "agent_address_1": row["agent_address_1"],
        "primary_owner": row["primary_owner"],
        "agent_city": row["agent_city"],
        "wr_id": row["wr_id"],
        "agent_name": row["agent_name"],
        "agent_address_2": row["agent_address_2"]
    }
    doc.render(context)
    # 用wr_id(唯一标识)+ agent_name命名,避免文件覆盖
    doc.save(f"{row['wr_id']}_{row['agent_name']}.docx")

print("All Files done")

额外提醒

  • 如果agent_state存在重复值,用它作为文件名会导致后续文件覆盖之前的,建议使用wr_id这类唯一字段结合名称命名文件。
  • 确保Word模板中的占位符(如{{zip_code}})和context中的键完全匹配,否则渲染会失效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 14:35:44