4

一位客户要求我增强他们的一个应用程序,以便发送一封包含 Excel 电子表格的电子邮件。他们碰巧有一本 SpreadsheetGear (2009) 的旧副本,所以我认为如果我使用它可能会节省时间。

碰巧的是,SpreadsheetGear 非常适合实际创建电子表格,但我无法将其作为电子邮件附件发送。只是想知道是否有人这样做过?理论上应该很简单,我目前的代码如下:

    /// <summary>
    /// Creates an email attachment based upon the inbound workbook
    /// </summary>
    /// <param name="workbook">The workbook</param>
    /// <returns>an email Attachment</returns>
    private static Attachment CreateAttachment(string id, IWorkbook workbook)
    {
        // Open up a memorystream and save out to it
        System.IO.MemoryStream memoryStream = new System.IO.MemoryStream();
        workbook.SaveToStream(memoryStream, SpreadsheetGear.FileFormat.OpenXMLWorkbook);

        return new Attachment(memoryStream, id + ".xls", "application/vnd.ms-excel");
    }

其中 workbook 是一个完全填充的 SpreadsheetGear 工作簿。在此之后,附件对象被推入一个System.Net.Mail.MailMessage对象使用

MailMessage.Attachments.Add(attachment);

我看到的是:

  • 电子邮件发送正常,并附有正确名称的附件
  • 但是附件是空的

在开发环境中,我在其中放置了一些调试代码

workbook.SaveAs("c:\\test.xls", SpreadsheetGear.FileFormat.OpenXMLWorkbook);

它产生了所需的电子表格,作为一个文件。但很明显,因为我最终只是以电子方式发送这个,如果可以的话,我会尽快避免写入磁盘。关于我哪里出错的任何指示?

谢谢,皮特

(最后应该补充一点,升级到最新的SpreadsheetGear不是一种选择,它要么是这种方法,要么是手动完成!环境是VS2008,.net 3.5)

4

2 回答 2

4

我尝试使用您问题中的代码。它对我有两个小的修改。

1) 由于您要保存为 OpenXMLWorkbook 格式,因此我将扩展名更改为 .xlsx 而不是 .xls。

2)我在保存 workbook.SaveToStream 方法后添加了以下代码行。

memoryStream.Seek(0, System.IO.SeekOrigin.Begin);

这会将位置设置为流的开头。当我在没有它的情况下尝试编写代码时,当我尝试打开 Excel 附件时收到错误消息。

没有这些修改,我得到了错误,但我从来没有得到一个空的附件。我正在使用最新版本的 SSG,但我不明白为什么在这种情况下这很重要。

于 2012-11-19T21:40:16.673 回答
0

步骤1

下载 ClosedXML dll 并添加对项目的引用

第2步。下载 DocumentFormat.OpenXML 并添加对项目的引用

使用 System.IO;

使用 ClosedXML.Excel;

公共无效发送邮件(){

DataTable dt = smp.GetDataTable("选择 l.EMPID 作为 [EmpID],e.Emp_Name 作为 [EmpName], l.LDate 作为 [ApplicationDate],l.StartDate 作为 [FromDate],l.EndDate 作为 [ToDate] 从 LeaveTable ");

XLWorkbook wb = new XLWorkbook();

var ws = wb.Worksheets.Add(dt, sheetName);

System.IO.MemoryStream memoryStream = new System.IO.MemoryStream(); wb.SaveAs(memoryStream);

memoryStream.Seek(0, System.IO.SeekOrigin.Begin);

System.Net.Mail.Attachment attachment = new System.Net.Mail.Attachment(memoryStream, sheetName + ".xlsx", "application/vnd.ms-excel");

SendEmail(To, To1, 主题, 正文, 附件);

}

公共静态 bool SendEmail(字符串 pTo,字符串 pTo1,字符串 pSubject,字符串 pBody,System.Net.Mail.Attachment 附件){

            MailMessage myMail = new MailMessage();

         ConfigurationSettings.AppSettings["emailid"].ToString();


            SmtpSection settings =(SmtpSection) ConfigurationManager.GetSection("system.net/mailSettings/smtp");
            var email = settings.Network.UserName;

            bool ssl = Convert.ToBoolean(ConfigurationManager.AppSettings["ssl"].ToString());

            myMail.From = new MailAddress(email);
            myMail.To.Add(pTo);
            if (pTo1 != "")
            {
                myMail.CC.Add(pTo1);
            }
            myMail.Subject = pSubject;
            myMail.Body = pBody;
            myMail.Priority = MailPriority.High;
            myMail.Attachments.Add(attachment);


            SmtpClient client = new SmtpClient();
            client.EnableSsl = ssl;


            client.DeliveryMethod = System.Net.Mail.SmtpDeliveryMethod.Network;
            client.Send(myMail);
            LogMessage.LogMsg = "Mailsent to:" + pTo + myMail.Body;
            LogMessage.CreateLogFile();

            return true;

        }
于 2015-09-03T11:41:26.750 回答