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

Python按DataFrame列值选择模板生成PDF异常求助

问题排查:根据客户所属公司切换Word模板失效的解决方法

问题根源

你的代码中,第一个df.iterrows()循环只是遍历所有客户行并反复覆盖word_template_path变量,最终该变量仅保留最后一行客户对应的模板路径。后续生成文档的循环统一使用这个固定路径,导致所有客户文档都用同一个模板,无法按公司切换。

修复后的完整代码

from pathlib import Path
import datetime as dt
import pandas as pd
from docxtpl import DocxTemplate
from docx2pdf import convert
import os
import smtplib
from email.mime.text import MIMEText
from email.message import EmailMessage

# 读取并处理Excel数据
df = pd.read_excel("Listado libre de deuda.xlsx")
df["FECHA"] = dt.date.today().strftime('%d/%m/%Y')
df["NOMBRE"] = df["NOMBRE"].str.lower().str.title()
formato_miles = lambda x: '{:,.0f}'.format(x)
df["DNI"] = df["DNI"].apply(formato_miles).str.replace(',', '.')

# 路径配置
base_dir = Path(__file__).parent
output_dir = base_dir / "Libres de deuda"
output_dir.mkdir(exist_ok=True)

# 按客户生成对应模板的文档并转PDF
for record in df.to_dict(orient="records"):
    # 每处理一个客户时,根据其公司选择对应模板
    empresa = record["EMPRESA"]
    if empresa == "finares":
        word_template_path = base_dir / "Libre de deuda Finares.docx"
    else:
        word_template_path = base_dir / "Libre de deuda Fideicomiso.docx"
    
    doc = DocxTemplate(word_template_path)
    doc.render(record)
    output_path = output_dir / f"{record['NOMBRE']}.docx"
    doc.save(output_path)
    convert(output_path)

# 清理生成的docx文件
for archivo in output_dir.glob("*.docx"):
    archivo.unlink()

# 批量发送邮件
email = 'random'
password = "xxxxxx"
to_email = ['random2']

msg = EmailMessage()
msg['Subject'] = 'Libres de deuda USAR ESTE'
msg['From'] = email
msg['To'] = ", ".join(to_email)
msg.attach(MIMEText('Se adjuntan los libres de deuda solicitados!\n\nSaludos!'))

# 添加所有PDF附件
for file_path in output_dir.glob("*.pdf"):
    with open(file_path, 'rb') as f:
        file_data = f.read()
        msg.add_attachment(file_data, maintype='application', subtype='octet-stream', filename=file_path.name)

with smtplib.SMTP('smtp.gmail.com', 587) as smtp:
    smtp.starttls()
    smtp.login(email, password)
    smtp.send_message(msg)

关键修改说明

  • 模板选择逻辑内移:将公司判断逻辑放到生成文档的循环内部,确保每个客户都能匹配到对应的模板。
  • 路径优化:全程使用pathlib的相对路径操作,替换硬编码的绝对路径,提升代码可移植性。
  • 清理逻辑简化:用glob直接筛选docx文件并删除,无需切换工作目录。
  • 冗余模块移除:删除重复导入的os和smtplib模块,保持代码整洁。
  • 附件筛选优化:直接筛选PDF文件添加附件,避免误加其他类型文件。

内容的提问来源于stack exchange,提问作者Gian Marco Caserta

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 20:04:56