Python3使用win32com从Excel读取数据生成Word格式报告批量发邮件的示例详解

作者:

文章目录
  • win32com 是 Python 在 Windows 平台上一种用于访问 COM(Component Object Model) 对象的库/模块。它隶属于第三方扩展包 pywin32(也就是我们通常安装的 “pywin32” 库)的一部分。 借助 win32com,Python 脚本可以与 Windows 系统的底层组件或支持 COM 接口的应用程序通信,并操控它们 —— 比如常见的办公软件(如 Excel、Word、Outlook)、以及其他支持 COM 的软件。这样就能通过 Python 自动化许多原本依赖鼠标/键盘/手动操作的流程。 简言之,win32com 让 Python “变身”为 Windows 的自动化驱动 — 就像用 Python 写 VBA,但更灵活、功能更强大。
  • 首先确保你的环境是 Windows + Python3。 使用 pip 安装 pywin32: pip install pywin32 安装后,就包含了 win32com 模块。 在脚本中导入需要的模块/子模块,例如: import win32com.client 如果你尝试 import win32com 后报错 “No module named ‘win32com’”,通常是因为没有正确安装 pywin32,或安装在与当前 Python 解释器不一致的环境里。 安装完成并正确导入后,你就可以使用 win32com 来创建/连接 COM 对象。
  • 下面是一些最常见、最基础的用法示例。假设你已经安装好 Microsoft Office(或兼容 Office 的软件,如 WPS),并在 Windows 系统上运行。
  • 场景 / 需求 为什么推荐 win32com Excel/Word 等 Office 自动化(批量生成、报表、邮件合并等) 可以通过脚本完全自动化操作 Office,效率高、功能强 老旧 Office 格式(.doc、.xls)或需要宏/VBA 支持 支持 COM/VBA,比很多现代库兼容性更好 Windows 专用软件自动化/批处理(比如批量生成报告、仪器控制、与其他软件对接) 只要软件支持 COM,就能用 Python 控制,灵活性强 不想手写 VBA/不熟悉 VBA,但熟悉 Python Python 更易读写、更便于与其他 Python 模块整合
  • import win32com.client import pythoncom import os import sys def main(): try: excel = win32com.client.DispatchEx(“Excel.Application”) excel.Visible = False excel.DisplayAlerts = False wb = excel.Workbooks.Add() sheet = wb.Worksheets(1) sheet.Name = “Data” # 写一些示例数据 for i in range(1, 6): sheet.Cells(i, 1).Value = f”Row {i}” sheet.Cells(i, 2).Value = i * 10 # 假设你有一个 VBA 宏模块,想插入并运行 # 例如,导出数据、生成图表、格式化等 # wb.VBProject.VBComponents.Add(…) # 插入模块 # wb.Application.Run(“YourMacroName”) out_path = os.path.join(os.getcwd(), “output.xlsx”) wb.SaveAs(out_path) print(“Saved to”, out_path) except Exception as e: print(“Error:”, e) finally: try: wb.Close(False) except Exception: pass try: excel.Quit() except Exception: pass if __name__ == “__main__”: # 在一些环境下,多线程或脚本打包需要初始化 COM pythoncom.CoInitialize() main() pythoncom.CoUninitialize() 这个脚本展示了如何: 使用 DispatchEx 启动 Excel(相比 Dispatch 更独立,不会复用已有 Excel 进程) 写入数据 (可选)插入/执行 VBA 宏 捕获异常,保证出错后也能关闭/清理资源 最终保存并退出
  • 结合 Microsoft Excel、Microsoft Word 和 Microsoft Outlook 来实现:从 Excel 读取数据 → 生成 Word 报告 → 附件 + 发邮件。适合用于“自动生成报告 + 邮件发送”的办公自动化流程。
  • 实现以下功能 —— 从 Excel 读取多条记录 → 为每条记录生成特定附件 (Excel/Word) 或内容 → 通过 Microsoft Outlook 群发带附件/HTML 正文邮件 → 支持日志与异常处理。你可以直接拿来改造/运行。 import os import traceback import pandas as pd import win32com.client import pythoncom from pathlib import Path # — 配置区 — EXCEL_DATA_FILE = r”C:pathtoyourrecipients_and_data.xlsx” OUTPUT_DIR = r”C:pathtooutput” # 存放生成的附件、报告等 LOG_FILE = os.path.join(OUTPUT_DIR, “send_mail.log”) EMAIL_COLUMN = “email” # Excel 表格中收件人邮箱地址所在列名 CC_COLUMN = “cc” # 可选:抄送人列名(若无,可设为 None) SUBJECT_COLUMN = “subject” # 邮件主题列名 BODY_COLUMN = “body_html” # 邮件 HTML 正文列名(可设 body_text 替代纯文本) ATTACHMENT_COLUMN = “attachment_path” # 如果每行有自己附件路径,可放在这一列;也可以留空,然后你自己动态生成 # — 辅助函数 — def log(msg): with open(LOG_FILE, ‘a’, encoding=’utf-8′) as f: f.write(msg + “n”) print(msg) def ensure_folder(path: str): if not os.path.isdir(path): os.makedirs(path, exist_ok=True) def read_data(): df = pd.read_excel(EXCEL_DATA_FILE, dtype=str) df = df.fillna(“”) # 将 NaN 转为空字符串 return df.to_dict(orient=”records”) def create_custom_attachment(row: dict) -> str: “”” 如果你希望根据每行数据生成自定义附件(Excel、Word、PDF…等), 在这里实现生成逻辑,并返回文件路径;若已有附件路径,可直接返回 row[ATTACHMENT_COLUMN] “”” # 示例:假设已有附件路径 path = row.get(ATTACHMENT_COLUMN, “”).strip() if path and os.path.isfile(path): return path # 否则 —— 举例,生成一个简单 txt 报告 fn = os.path.join(OUTPUT_DIR, f”report_for_{row.get(‘id’, ”)}.txt”) with open(fn, ‘w’, encoding=’utf-8′) as f: f.write(“Report for: ” + row.get(EMAIL_COLUMN, “”) + “n”) # 根据实际字段写内容 for k, v in row.items(): f.write(f”{k} = {v}n”) return fn def send_mail_via_outlook(to_addr: str, subject: str, body_html: str, cc_addr: str = None, attachments: list = None, send_on_behalf: str = None): outlook = win32com.client.Dispatch(“Outlook.Application”) mail = outlook.CreateItem(0) # 0 = olMailItem mail.To = to_addr if cc_addr: mail.CC = cc_addr if send_on_behalf: mail.SentOnBehalfOfName = send_on_behalf # 使用指定发件邮箱(如有权限) mail.Subject = subject # 设置 html 正文 mail.BodyFormat = 2 # 2 = HTML mail.HTMLBody = body_html # 添加附件 if attachments: for fp in attachments: if os.path.isfile(fp): mail.Attachments.Add(fp) else: log(f”[WARN] 附件不存在: {fp}”) mail.Send() def main(): pythoncom.CoInitialize() ensure_folder(OUTPUT_DIR) data_rows = read_data() log(“开始处理,共 {} 行”.format(len(data_rows))) success = 0 fail = 0 for idx, row in enumerate(data_rows, start=1): try: to_addr = row.get(EMAIL_COLUMN, “”).strip() if not to_addr: log(f”[SKIP #{idx}] 收件人地址为空,跳过”) continue subject = row.get(SUBJECT_COLUMN, “(无主题)”) body_html = row.get(BODY_COLUMN, “”) cc_addr = row.get(CC_COLUMN, “”).strip() or None # 准备附件 att = create_custom_attachment(row) attachments = [att] if att else None send_mail_via_outlook(to_addr=to_addr, subject=subject, body_html=body_html, cc_addr=cc_addr, attachments=attachments) log(f”[OK #{idx}] 发送邮件 到: {to_addr}, 附件: {attachments}”) success += 1 except Exception as e: log(f”[ERROR #{idx}] 收件人: {row.get(EMAIL_COLUMN)} 异常: {e}n” + traceback.format_exc()) fail += 1 log(f”完成。成功: {success}, 失败: {fail}”) pythoncom.CoUninitialize() if __name__ == “__main__”: main()
  • Excel 表格中每一行代表一封邮件:包含收件人、抄送(可选)、主题、HTML 正文、附件路径/附件生成所需字段等。这样适合“批量群发 + 个性化内容”。 我把生成附件与邮件发送逻辑分离。create_custom_attachment(…) 用于生成或获取附件 — 你可以改成生成 Word/Excel 报告、PDF、图片、文本等。 邮件正文支持 HTML。如果你希望插入图片、表格、样式、公司 logo、个性化布局,都可以通过 HTML 实现。很多人通过该方式,将公司模板/ html 模板 + Excel 数据融合后发送。关于这一点,用 pandas 读取数据 + HTML 模板 + win32com 发邮件,是常见方案。 脚本中包含 日志记录 + 异常捕获 + 附件存在性检查。 如果你每天/定期运行这个脚本(比如用 Windows 任务调度器),日志能帮你追踪哪些邮件发失败,哪些发成功。 如果你需要针对不同收件人生成不同附件(例如针对每个客户生成单独报表/合同/发票),只需要把 create_custom_attachment(…) 改成你的生成逻辑 — 比如读取数据行内容,生成 Excel/Word 或 PDF,再返回其路径。
  • 脚本依赖本地 Outlook 客户端配置。如果没有正确登录或权限,可能抛出 COM 错误。很多文章指出,当 Outlook 配置为现代安全模式、或组织策略限制自动发送时,脚本可能失败。 如果批量邮件数量较多,建议有适当间隔、不要一次性发送过快 —— 避免被当作垃圾邮件或触发 Outlook 安全提示。 附件路径/生成附件逻辑要保证正确,避免因路径问题导致发送失败。 HTML 正文如果包含图片、内嵌资源等,要注意附件与 HTML 的引用关系 —— 有时候直接附件 + HTML 不一定能保证收件人看到正确格式/嵌入图片 (取决于 Outlook 客户端设置)。
  • 这个模板基本可以构成一个“通用的批量发邮件 + 附件 + 个性化内容 + 日志 + 错误处理”工具。你可以根据具体业务(比如日报、自动报表、客户通知、合同发送等)——把 Excel 作为“驱动表格”(包含收件人、内容、参数、附件路径/数据等),然后运行脚本自动完成所有工作。 以上就是Python3使用win32com从Excel读取数据生成Word格式报告批量发邮件的示例详解的详细内容,更多关于Python3 win32com Excel读取数据生成Word的资料请关注风君子博客其它相关文章! 您可能感兴趣的文章: Python win32com库的使用示例 python安装win32com.client的实现示例 Python 基于win32com客户端实现Excel操作的详细过程 Python使用win32com.client的方法示例 Python中win32com模块的使用
  • 目录
    • 什么是 win32com
    • 如何安装与导入
    • 基本使用 — 操作 Excel、Word 等 Office 应用
      • 操作 Excel 示例
      • 操作 Word 示例
    • win32com 的能力远不止基本读写 — 更多高级应用 & 注意事项
      • 更强的自动化/扩展能力
        • 注意事项与局限
    • 适合用 win32com 的场景 / 推荐理由
      • 一个稍复杂的处理Excel的完整 Demo(Excel + VBA 宏 + 错误处理 + 清理)
        • 示例:从Excel读取数据生成Word格式报告批量发邮件
          • 准备条件
            • 示例脚本:从 Excel 到 Word,再通过 Outlook 发邮件
              • 说明与注意事项
              • 进阶示例:支持 Excel 多行/多收件人+Word 报告个性化+邮件 HTML 格式+日志/异常处理 的脚本
                • 模板说明 & 你可以怎样扩展 / 改造
                  • 注意事项 / 限制 / 异常处理
                    • 总结

                      • win32com 是 Python 在 Windows 平台上一种用于访问 COM(Component Object Model) 对象的库/模块。它隶属于第三方扩展包 pywin32(也就是我们通常安装的 “pywin32” 库)的一部分。
                      • 借助 win32com,Python 脚本可以与 Windows 系统的底层组件或支持 COM 接口的应用程序通信,并操控它们 —— 比如常见的办公软件(如 Excel、Word、Outlook)、以及其他支持 COM 的软件。这样就能通过 Python 自动化许多原本依赖鼠标/键盘/手动操作的流程。

                      简言之,win32com 让 Python “变身”为 Windows 的自动化驱动 — 就像用 Python 写 VBA,但更灵活、功能更强大。

                      首先确保你的环境是 Windows + Python3。

                      使用 pip 安装 pywin32:

                      pip install pywin32
                      

                      安装后,就包含了 win32com 模块。

                      在脚本中导入需要的模块/子模块,例如:

                      import win32com.client
                      

                      如果你尝试 import win32com 后报错 “No module named ‘win32com’”,通常是因为没有正确安装 pywin32,或安装在与当前 Python 解释器不一致的环境里。

                      安装完成并正确导入后,你就可以使用 win32com 来创建/连接 COM 对象。

                      下面是一些最常见、最基础的用法示例。假设你已经安装好 Microsoft Office(或兼容 Office 的软件,如 WPS),并在 Windows 系统上运行。

                      import win32com.client
                      
                      excel = win32com.client.Dispatch("Excel.Application")
                      excel.Visible = True  # 可见 Excel 窗口(方便调试/查看效果)
                      
                      workbook = excel.Workbooks.Add()
                      sheet = workbook.Worksheets(1)
                      
                      sheet.Cells(1, 1).Value = "Hello"
                      sheet.Cells(1, 2).Value = "World"
                      sheet.Cells(2, 1).Value = "Python"
                      sheet.Cells(2, 2).Value = "win32com"
                      
                      workbook.SaveAs(r"C:pathtoyourfile.xlsx")
                      workbook.Close(False)
                      excel.Quit()
                      

                      这段代码会:

                      • 启动 Excel(COM 自动化方式)
                      • 新建一个工作簿
                      • 获取第一个工作表
                      • 向若干个单元格写入数据
                      • 保存为 .xlsx 文件
                      • 关闭 workbook 和 Excel 应用程序

                      通过这种方式,你可以让 Python 完全代替人工在 Excel 中输入、保存、关闭操作。

                      import win32com.client
                      
                      word = win32com.client.Dispatch("Word.Application")
                      word.Visible = True
                      
                      doc = word.Documents.Add()
                      rng = doc.Range(0, 0)
                      rng.Text = "这是由 python + win32com 自动生成的 Word 文档内容。n"
                      
                      doc.SaveAs(r"C:pathtoyourfile.docx")
                      doc.Close(False)
                      word.Quit()
                      

                      这会:

                      • 启动 Word
                      • 新建一个文档
                      • 在开头插入一段文本
                      • 保存为 .docx 文件
                      • 关闭文档和 Word

                      相比于 Python 其他库(如专门操作 docx 的第三方库),使用 win32com 的优势在于可以直接操控完整的 Word 功能,包括对旧版 .doc、宏、样式、复杂格式的支持(前提是目标 Word 版本支持这些功能)。

                      除了读写 Excel、Word,还可以:

                      • 操控 PowerPoint、Outlook、甚至其他支持 COM 的软件。理论上,只要目标软件注册了 COM 接口,都可以通过 win32com.client.Dispatch("YourApp.ProgID") 来连接。
                      • 对 Excel 文档进行宏(VBA)操作 —— 通过 win32com 可以操控 VBA 模块,读写/导入/导出/执行宏脚本,这对于复杂自动化任务非常有用。
                      • 利用 COM 的事件机制 —— 通过 DispatchWithEvents 结合相应的事件处理类,可以让 Python 监听并处理某些应用(如 Word/Excel)的事件(例如“新建文档”“退出程序”等)。
                      • 用于其他 Windows 应用或第三方工具(只要其提供 COM 接口):例如科学仪器、工程软件、老旧系统等,与其内部 COM 接口对接,实现脚本自动化/数据导出/批处理等功能。

                      • 仅 Windows 有效。因为 COM 是 Windows 特有的组件模型,在 Linux / macOS 下 win32com 通常无法使用。
                      • 依赖目标软件是否支持 COM 自动化 —— 如果目标程序没有对外提供 COM 接口,就无法通过 win32com 控制它。
                      • 多线程时要小心。如果在多线程环境中调用 COM 对象,需要为每个线程单独初始化 COM 库,否则可能报错例如 “尚未调用 CoInitialize”。
                      • COM 操作不当可能导致程序挂起。比如启动了某个应用后忘记 Quit(),可能会导致后台进程残留。良好的资源管理和异常处理非常重要。

                      场景 / 需求 为什么推荐 win32com
                      Excel/Word 等 Office 自动化(批量生成、报表、邮件合并等) 可以通过脚本完全自动化操作 Office,效率高、功能强
                      老旧 Office 格式(.doc、.xls)或需要宏/VBA 支持 支持 COM/VBA,比很多现代库兼容性更好
                      Windows 专用软件自动化/批处理(比如批量生成报告、仪器控制、与其他软件对接) 只要软件支持 COM,就能用 Python 控制,灵活性强
                      不想手写 VBA/不熟悉 VBA,但熟悉 Python Python 更易读写、更便于与其他 Python 模块整合

                      import win32com.client
                      import pythoncom
                      import os
                      import sys
                      
                      def main():
                          try:
                              excel = win32com.client.DispatchEx("Excel.Application")
                              excel.Visible = False
                              excel.DisplayAlerts = False
                      
                              wb = excel.Workbooks.Add()
                              sheet = wb.Worksheets(1)
                              sheet.Name = "Data"
                      
                              # 写一些示例数据
                              for i in range(1, 6):
                                  sheet.Cells(i, 1).Value = f"Row {i}"
                                  sheet.Cells(i, 2).Value = i * 10
                      
                              # 假设你有一个 VBA 宏模块,想插入并运行
                              # 例如,导出数据、生成图表、格式化等
                              # wb.VBProject.VBComponents.Add(...)  # 插入模块
                              # wb.Application.Run("YourMacroName")
                      
                              out_path = os.path.join(os.getcwd(), "output.xlsx")
                              wb.SaveAs(out_path)
                              print("Saved to", out_path)
                          except Exception as e:
                              print("Error:", e)
                          finally:
                              try:
                                  wb.Close(False)
                              except Exception:
                                  pass
                              try:
                                  excel.Quit()
                              except Exception:
                                  pass
                      
                      if __name__ == "__main__":
                          # 在一些环境下,多线程或脚本打包需要初始化 COM
                          pythoncom.CoInitialize()
                          main()
                          pythoncom.CoUninitialize()
                      

                      这个脚本展示了如何:

                      • 使用 DispatchEx 启动 Excel(相比 Dispatch 更独立,不会复用已有 Excel 进程)
                      • 写入数据
                      • (可选)插入/执行 VBA 宏
                      • 捕获异常,保证出错后也能关闭/清理资源
                      • 最终保存并退出

                      结合 Microsoft Excel、Microsoft Word 和 Microsoft Outlook 来实现:从 Excel 读取数据 → 生成 Word 报告 → 附件 + 发邮件。适合用于“自动生成报告 + 邮件发送”的办公自动化流程。

                      Windows 系统 + 本地安装 Office(Excel, Word, Outlook)

                      已安装 pywin32

                      pip install pywin32
                      ```:contentReference[oaicite:5]{index=5}  
                      

                      Excel 中有一个表格(比如 .xlsx),包含你希望写入 Word 报告并作为附件发送给某人的数据

                      import os
                      import win32com.client
                      import pythoncom  # 如果在脚本 / 多线程 /定时任务中运行,推荐初始化 COM
                      
                      def make_word_report(data_rows, output_docx_path):
                          """
                          data_rows: list of dict,每个 dict 对应一行,key 是列名
                          output_docx_path: Word 文档保存路径
                          """
                          word = win32com.client.Dispatch("Word.Application")
                          word.Visible = False
                          doc = word.Documents.Add()
                      
                          # 写入标题
                          doc.Content.InsertAfter("自动生成报告n")
                          doc.Content.InsertAfter("====================nn")
                      
                          # 写入表格/数据(简单示例)
                          for row in data_rows:
                              # 假设 row 是 dict,按顺序写
                              line = ", ".join(f"{k}: {v}" for k, v in row.items())
                              doc.Content.InsertAfter(line + "n")
                      
                          doc.SaveAs(output_docx_path)
                          doc.Close(False)
                          word.Quit()
                      
                      
                      def read_excel_data(excel_path, sheet_name=None):
                          """
                          简单读取 Excel,通过 COM 控件,也可以用 pandas/openpyxl,再包装成 dict list
                          这里假设你能用其他方式读取 Excel,示例用 pandas 更方便
                          """
                          import pandas as pd
                          df = pd.read_excel(excel_path, sheet_name=sheet_name)
                          df = df.fillna("")  # 可选:替换空值
                          records = df.to_dict(orient="records")
                          return records
                      
                      
                      def send_email_with_attachment(to_email, subject, body, attachment_paths=None):
                          outlook = win32com.client.Dispatch("Outlook.Application")
                          mail = outlook.CreateItem(0)  # 0 表示 olMailItem
                          mail.To = to_email
                          mail.Subject = subject
                          mail.Body = body
                          if attachment_paths:
                              for path in attachment_paths:
                                  if os.path.exists(path):
                                      mail.Attachments.Add(path)
                                  else:
                                      print(f"[Warning] 附件文件不存在: {path}")
                          mail.Send()
                      
                      
                      def main():
                          pythoncom.CoInitialize()
                      
                          # --- 配置区 ---
                          excel_path = r"C:pathtoyourdata.xlsx"
                          word_report_path = r"C:pathtoyourreport.docx"
                          recipient = "recipient@example.com"
                          email_subject = "自动生成报告 - " + os.path.basename(word_report_path)
                          email_body = "你好,nn请查收自动生成的报告。如有问题,请回复。nnRegards."
                      
                          # 1. 读取 Excel
                          data = read_excel_data(excel_path)
                      
                          # 2. 生成 Word 报告
                          make_word_report(data, word_report_path)
                      
                          # 3. 发送邮件(带上 Word 报告作为附件)
                          send_email_with_attachment(
                              to_email=recipient,
                              subject=email_subject,
                              body=email_body,
                              attachment_paths=[word_report_path]
                          )
                      
                          pythoncom.CoUninitialize()
                      
                      
                      if __name__ == "__main__":
                          main()
                      

                      • 我用了 pythoncom.CoInitialize() / CoUninitialize() 来确保 COM 正确初始化/释放 — 这是在脚本、服务、线程、定时任务里比较推荐的写法。
                      • Excel 数据读取部分我用了 pandas + openpyxl,这样比用 COM 操作 Excel 更简单可靠。你也可以根据需要改成 COM 方式。
                      • Word 报告非常基础:只是逐行插入文本。如果需要更复杂的格式、表格、样式、图片,你可以用 Word COM 对象模型进一步扩展。COM 操作 Word 的能力比较完整。
                      • 发邮件部分通过 Outlook COM 自动创建邮件、添加附件并发送。这样一来你就实现了“读取数据 → 生成报告 → 邮件发送”的一条完整自动化链。

                      实现以下功能 —— 从 Excel 读取多条记录 → 为每条记录生成特定附件 (Excel/Word) 或内容 → 通过 Microsoft Outlook 群发带附件/HTML 正文邮件 → 支持日志与异常处理。你可以直接拿来改造/运行。

                      import os
                      import traceback
                      import pandas as pd
                      import win32com.client
                      import pythoncom
                      from pathlib import Path
                      
                      # --- 配置区 ---
                      EXCEL_DATA_FILE = r"C:pathtoyourrecipients_and_data.xlsx"
                      OUTPUT_DIR = r"C:pathtooutput"   # 存放生成的附件、报告等
                      LOG_FILE = os.path.join(OUTPUT_DIR, "send_mail.log")
                      
                      EMAIL_COLUMN = "email"      # Excel 表格中收件人邮箱地址所在列名
                      CC_COLUMN = "cc"            # 可选:抄送人列名(若无,可设为 None)
                      SUBJECT_COLUMN = "subject"  # 邮件主题列名
                      BODY_COLUMN = "body_html"   # 邮件 HTML 正文列名(可设 body_text 替代纯文本)
                      ATTACHMENT_COLUMN = "attachment_path"  
                      # 如果每行有自己附件路径,可放在这一列;也可以留空,然后你自己动态生成
                      
                      # --- 辅助函数 ---
                      def log(msg):
                          with open(LOG_FILE, 'a', encoding='utf-8') as f:
                              f.write(msg + "n")
                          print(msg)
                      
                      def ensure_folder(path: str):
                          if not os.path.isdir(path):
                              os.makedirs(path, exist_ok=True)
                      
                      def read_data():
                          df = pd.read_excel(EXCEL_DATA_FILE, dtype=str)
                          df = df.fillna("")  # 将 NaN 转为空字符串
                          return df.to_dict(orient="records")
                      
                      def create_custom_attachment(row: dict) -> str:
                          """
                          如果你希望根据每行数据生成自定义附件(Excel、Word、PDF...等),
                          在这里实现生成逻辑,并返回文件路径;若已有附件路径,可直接返回 row[ATTACHMENT_COLUMN]
                          """
                          # 示例:假设已有附件路径
                          path = row.get(ATTACHMENT_COLUMN, "").strip()
                          if path and os.path.isfile(path):
                              return path
                          # 否则 —— 举例,生成一个简单 txt 报告
                          fn = os.path.join(OUTPUT_DIR, f"report_for_{row.get('id', '')}.txt")
                          with open(fn, 'w', encoding='utf-8') as f:
                              f.write("Report for: " + row.get(EMAIL_COLUMN, "") + "n")
                              # 根据实际字段写内容
                              for k, v in row.items():
                                  f.write(f"{k} = {v}n")
                          return fn
                      
                      def send_mail_via_outlook(to_addr: str, subject: str, body_html: str,
                                                cc_addr: str = None, attachments: list = None,
                                                send_on_behalf: str = None):
                          outlook = win32com.client.Dispatch("Outlook.Application")
                          mail = outlook.CreateItem(0)  # 0 = olMailItem
                          mail.To = to_addr
                          if cc_addr:
                              mail.CC = cc_addr
                          if send_on_behalf:
                              mail.SentOnBehalfOfName = send_on_behalf  # 使用指定发件邮箱(如有权限)
                          mail.Subject = subject
                          # 设置 html 正文
                          mail.BodyFormat = 2  # 2 = HTML
                          mail.HTMLBody = body_html
                          # 添加附件
                          if attachments:
                              for fp in attachments:
                                  if os.path.isfile(fp):
                                      mail.Attachments.Add(fp)
                                  else:
                                      log(f"[WARN] 附件不存在: {fp}")
                          mail.Send()
                      
                      def main():
                          pythoncom.CoInitialize()
                          ensure_folder(OUTPUT_DIR)
                          data_rows = read_data()
                          log("开始处理,共 {} 行".format(len(data_rows)))
                      
                          success = 0
                          fail = 0
                      
                          for idx, row in enumerate(data_rows, start=1):
                              try:
                                  to_addr = row.get(EMAIL_COLUMN, "").strip()
                                  if not to_addr:
                                      log(f"[SKIP #{idx}] 收件人地址为空,跳过")
                                      continue
                      
                                  subject = row.get(SUBJECT_COLUMN, "(无主题)")
                                  body_html = row.get(BODY_COLUMN, "")
                                  cc_addr = row.get(CC_COLUMN, "").strip() or None
                      
                                  # 准备附件
                                  att = create_custom_attachment(row)
                                  attachments = [att] if att else None
                      
                                  send_mail_via_outlook(to_addr=to_addr,
                                                        subject=subject,
                                                        body_html=body_html,
                                                        cc_addr=cc_addr,
                                                        attachments=attachments)
                      
                                  log(f"[OK #{idx}] 发送邮件 到: {to_addr}, 附件: {attachments}")
                                  success += 1
                              except Exception as e:
                                  log(f"[ERROR #{idx}] 收件人: {row.get(EMAIL_COLUMN)} 异常: {e}n" + traceback.format_exc())
                                  fail += 1
                      
                          log(f"完成。成功: {success}, 失败: {fail}")
                          pythoncom.CoUninitialize()
                      
                      if __name__ == "__main__":
                          main()
                      

                      • Excel 表格中每一行代表一封邮件:包含收件人、抄送(可选)、主题、HTML 正文、附件路径/附件生成所需字段等。这样适合“批量群发 + 个性化内容”。
                      • 我把生成附件与邮件发送逻辑分离。create_custom_attachment(...) 用于生成或获取附件 — 你可以改成生成 Word/Excel 报告、PDF、图片、文本等。
                      • 邮件正文支持 HTML。如果你希望插入图片、表格、样式、公司 logo、个性化布局,都可以通过 HTML 实现。很多人通过该方式,将公司模板/ html 模板 + Excel 数据融合后发送。关于这一点,用 pandas 读取数据 + HTML 模板 + win32com 发邮件,是常见方案。
                      • 脚本中包含 日志记录 + 异常捕获 + 附件存在性检查。 如果你每天/定期运行这个脚本(比如用 Windows 任务调度器),日志能帮你追踪哪些邮件发失败,哪些发成功。
                      • 如果你需要针对不同收件人生成不同附件(例如针对每个客户生成单独报表/合同/发票),只需要把 create_custom_attachment(...) 改成你的生成逻辑 — 比如读取数据行内容,生成 Excel/Word 或 PDF,再返回其路径。

                      • 脚本依赖本地 Outlook 客户端配置。如果没有正确登录或权限,可能抛出 COM 错误。很多文章指出,当 Outlook 配置为现代安全模式、或组织策略限制自动发送时,脚本可能失败。
                      • 如果批量邮件数量较多,建议有适当间隔、不要一次性发送过快 —— 避免被当作垃圾邮件或触发 Outlook 安全提示。
                      • 附件路径/生成附件逻辑要保证正确,避免因路径问题导致发送失败。
                      • HTML 正文如果包含图片、内嵌资源等,要注意附件与 HTML 的引用关系 —— 有时候直接附件 + HTML 不一定能保证收件人看到正确格式/嵌入图片 (取决于 Outlook 客户端设置)。

                      这个模板基本可以构成一个“通用的批量发邮件 + 附件 + 个性化内容 + 日志 + 错误处理”工具。你可以根据具体业务(比如日报、自动报表、客户通知、合同发送等)——把 Excel 作为“驱动表格”(包含收件人、内容、参数、附件路径/数据等),然后运行脚本自动完成所有工作。

                      以上就是Python3使用win32com从Excel读取数据生成Word格式报告批量发邮件的示例详解的详细内容,更多关于Python3 win32com Excel读取数据生成Word的资料请关注风君子博客其它相关文章!

                      您可能感兴趣的文章:

                      • Python win32com库的使用示例
                      • python安装win32com.client的实现示例
                      • Python 基于win32com客户端实现Excel操作的详细过程
                      • Python使用win32com.client的方法示例
                      • Python中win32com模块的使用

                      站内搜索