如何将修改保存的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
相关产品推荐
相关产品推荐

