【问题标题】:Send spreadsheet as email attachment using SpreadsheetGear使用 SpreadsheetGear 将电子表格作为电子邮件附件发送
【发布时间】:2012-11-19 11:17:28
【问题描述】:

一位客户要求我增强他们的一个应用程序,以便发送一封包含 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)

【问题讨论】:

    标签: .net email-attachments memorystream system.net.mail spreadsheetgear


    【解决方案1】:

    我尝试使用您问题中的代码。它对我进行了两次小的修改。

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

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

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

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

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

    【讨论】:

    • 是的,谢谢丹尼尔。我开始从流问题而不是 SpreadsheetGear 问题的角度来考虑它,我尝试添加一行代码来重置流中的位置。我现在正在对其进行测试(这需要一段时间 - 在我停止遇到 SMTP 服务器的权限问题之前,我需要将它推广到他们的 UAT 环境!)没有发现扩展名,但你说了什么有道理。
    • 设置 memoryStream.Position = 0 就可以了。感谢您的意见。
    • 哇,谢谢你拯救了我的一天,我几乎做了一个我真的不喜欢的工作,因为这对我不起作用!
    【解决方案2】:

    第 1 步

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

    第二步。下载 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 ] 从离开表");

    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, Subject, Body, attachment);

    }

    public static bool SendEmail(string pTo, string pTo1, string pSubject, string 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;
    
            }
    

    【讨论】:

    • 很抱歉,这个答案,无论经过深思熟虑,似乎都与 SpreadsheetGear 无关。如果我仍然有问题(因此我不接受接受的答案),那么您的回答将没有帮助。
    猜你喜欢
    • 2020-10-01
    • 2023-03-23
    • 1970-01-01
    • 2014-09-14
    • 2016-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    相关资源
    最近更新 更多