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

如何将修改保存的Excel工作簿赋值为变量用于Outlook邮件附件

解决方法

首先修正你代码里的语法错误(save语句缺少右括号),然后通过让prepareExcel返回生成的文件路径,就能把文件传递给Emailer作为附件。

方法一:保存到本地文件(简单直接)

修改后的代码如下:

from datetime import datetime
import openpyxl

def prepareExcel(path):
    wb_obj = openpyxl.load_workbook(path)
    # 这里执行你的Excel修改操作
    # 生成带时间戳的文件名
    filename = f'Test{datetime.now().strftime("%Y%m%d")}.xlsx'
    wb_obj.save(filename=filename)
    return filename  # 返回生成的文件路径

def Emailer(filename):
    # 假设mail已经是预先创建好的Outlook MailItem对象
    mail.Attachments.Add(filename)
    mail.Display(True)

# 调用示例
source_excel_path = "你的源Excel文件路径.xlsx"
generated_file = prepareExcel(source_excel_path)
Emailer(generated_file)

方法二:内存流直接传递(不生成本地文件)

如果不想在本地生成临时文件,可以用BytesIO把Excel保存到内存,再通过ADODB.Stream传递给Outlook:

from datetime import datetime
import openpyxl
from io import BytesIO
import win32com.client as win32

def prepareExcel(path):
    wb_obj = openpyxl.load_workbook(path)
    # 执行Excel修改操作
    output_stream = BytesIO()
    wb_obj.save(output_stream)
    output_stream.seek(0)  # 重置流的指针到开头
    return output_stream

def Emailer(excel_stream):
    outlook = win32.Dispatch('Outlook.Application')
    mail = outlook.CreateItem(0)  # 创建新邮件
    
    # 将BytesIO转换为Outlook支持的ADODB流
    adodb_stream = win32.Dispatch('ADODB.Stream')
    adodb_stream.Open()
    adodb_stream.Type = 1  # 设置为二进制流
    adodb_stream.Write(excel_stream.read())
    adodb_stream.Position = 0
    
    # 添加附件并指定显示的文件名
    attachment_filename = f'Test{datetime.now().strftime("%Y%m%d")}.xlsx'
    mail.Attachments.Add(adodb_stream, Type=1, FileName=attachment_filename)
    
    mail.Display(True)

# 调用示例
source_excel_path = "你的源Excel文件路径.xlsx"
excel_stream = prepareExcel(source_excel_path)
Emailer(excel_stream)

两种方法里,第一种更适合大多数场景,代码简单易维护;第二种适合对临时文件有要求的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 19:26:16