C# 我想将工作簿附加到 Outlook 电子邮件并在发送前预览

标签 c# excel outlook

我有一段代码可以从 datagridview 创建工作簿。单击按钮并且不将文件保存到磁盘后,我希望能够将该工作簿附加到 Outlook 中,以便我可以选择将其发送给谁。

这是我想要达到的结果:

example 1

但是,当我运行代码时,电子邮件会打开,但没有附件,只有此错误消息:

example 2

这是我的代码:

private void attachEmail()
    {
        Microsoft.Office.Interop.Excel._Application excel = new Microsoft.Office.Interop.Excel.Application();
        Microsoft.Office.Interop.Excel._Workbook workbook = excel.Workbooks.Add(Type.Missing);
        Microsoft.Office.Interop.Excel._Worksheet worksheet = null;
        Outlook.Application outlookApp = new Outlook.Application();
        Outlook.MailItem mailItem = (Outlook.MailItem)outlookApp.CreateItem(Outlook.OlItemType.olMailItem);
        try
        {
            worksheet = workbook.ActiveSheet;
            worksheet.Name = "Sheet1";
            for (int i = 0; i < mydataGridView.Columns.Count; i++)
            {
                worksheet.Cells[1, i + 1] = mydataGridView.Columns[i].HeaderText;
            }
            for (int i = 0; i < mydataGridView.Rows.Count; i++)
            {
                for (int j = 0; j < mydataGridView.Columns.Count; j++)
                {
                    worksheet.Cells[i + 2, j + 1] = mydataGridView.Rows[i].Cells[j].Value.ToString();
                }
            }
            mailItem.Subject = "Notification";
            mailItem.Importance = Outlook.OlImportance.olImportanceHigh;
            mailItem.Display(false);
            mailItem.Attachments.Add(workbook);
        }
        catch (System.Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
        finally
        {
            excel.Quit();
            workbook = null;
            excel = null;
        }
    }

使用代码更新进行编辑

我偶然发现了一些从内存中检索数据的代码。我不太确定它是如何工作的(我是编码新手),但它正在做一些不同的事情,我想接近我想要实现的目标(即将文件附加到 Outlook 而不先保存它) :

            MemoryStream stream = new MemoryStream();
            workbook.SaveAs(stream);
            Byte[] bytearray = (Byte[])Array.CreateInstance(typeof(byte), stream.Length);
            stream.Position = 0;
            stream.Read(bytearray, 0, (int)stream.Length);
            MemoryStream ms = new MemoryStream(bytearray);
            System.Net.Mail.Attachment attachment = new System.Net.Mail.Attachment(ms, "excelfile.xlsx");
            mailItem.Subject = "Notification";
            mailItem.Importance = Outlook.OlImportance.olImportanceHigh;
            mailItem.Display(false);
            mailItem.Attachments.Add(attachment);
            stream.Close();

不幸的是,我遇到了一个非常模糊的错误:

Image of error

最佳答案

我的建议是保存并关闭工作簿,并使用文件名作为附件。我对此进行了测试,它确实产生了您想要的结果:

workbook.SaveAs(@"c:\cdh\foo.xlsx");
workbook.Close();

mailItem.Subject = "Notification";
mailItem.Importance = Outlook.OlImportance.olImportanceHigh;
mailItem.Display(false);
mailItem.Attachments.Add(@"c:\cdh\foo.xlsx");

关于C# 我想将工作簿附加到 Outlook 电子邮件并在发送前预览,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40226052/

相关文章:

c# - 从 WPF 保存到 SQL Server 数据库

email - Outlook 自动发现 SMTP 身份验证

vba - Outlook VBA 更改邮件字体大小

HttpPostedFileBase 的 C# MVC 派生类为空

C# 如果值不为 null,为什么 Linq 会因 Null 而崩溃?

javascript - 如何使用 ASP.NET Core 2.1 和 React JS 创建下载功能?

excel - 创建 excel 宏以比较 en 选择数据

vba - EXCEL VBA 比较 2 列

python - xlwings 问题写入 Excel 2010 中的单元格

python - 使用 Python 脚本从 Outlook 2013 下载附件