【问题标题】:C# I want to attach a workbook to Outlook Email and preview before sendingC# 我想将工作簿附加到 Outlook 电子邮件并在发送前预览
【发布时间】:2016-10-24 19:28:46
【问题描述】:

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

这是我想要达到的结果:

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

这是我的代码:

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

【问题讨论】:

  • 我很确定工作簿变量在附件期间为空。在将其附加到 mailItem.Attachments.Add(workbook); 之前检查它是否为空,并从那里对其进行故障排除。它可能就像权限问题一样简单。甚至尝试将此脚本作为提升的特权帐户运行以缓解这种情况。
  • 我用过"workbook.SendMail("myemail@email.com");"测试工作簿中是否有内容。我已经通过电子邮件发送了文件,没有问题。问题是我想在发送之前预览电子邮件。

标签: c# excel outlook


【解决方案1】:

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

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");

【讨论】:

  • 感谢 Hambone 的回答。就像我在问题中提到的那样,我正在尝试将文件附加到电子邮件而不将文件保存到磁盘。我在其他程序中看到过它,所以我确信应该有办法实现它。
  • 啊,好吧。我错过了那部分。
  • 我编辑了原始问题以包含我发现的一些“bytearray”代码。你介意看一下吗?
  • @Pucho -- 看看这个:stackoverflow.com/a/156524/1278553。似乎可能有第三方库可以执行此操作,但我不知道通过 Interop 执行此操作的方法。
  • 谢谢!我会调查的。令人讨厌的是,互操作可以让您将 excel 文件直接发送给电子邮件收件人(myworkbook.SendMail("recipient@email.com")),但它不允许您在发送前预览它。我想知道我见过的应用程序是如何做到的。
【解决方案2】:

复活线程:

excel.Dialogs[Microsoft.Office.Interop.Excel.XlBuiltInDialog.xlDialogSendMail].Show();

【讨论】:

    猜你喜欢
    • 2020-06-10
    • 1970-01-01
    • 2016-03-04
    • 1970-01-01
    • 2016-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多