Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 使用SpreadsheetGear将电子表格作为电子邮件附件发送_.net_Email Attachments_Memorystream_System.net.mail_Spreadsheetgear - Fatal编程技术网

.net 使用SpreadsheetGear将电子表格作为电子邮件附件发送

.net 使用SpreadsheetGear将电子表格作为电子邮件附件发送,.net,email-attachments,memorystream,system.net.mail,spreadsheetgear,.net,Email Attachments,Memorystream,System.net.mail,Spreadsheetgear,一位客户要求我增强他们的一个应用程序,以便发送一封包含excel电子表格的电子邮件。他们碰巧有一份SpreadsheetGear(2009)的旧版本,所以我想如果我使用它可能会节省时间 碰巧的是,SpreadsheetGear非常适合创建电子表格,但我无法将其作为电子邮件附件发送。只是想知道是否有人做过这件事?理论上这应该很容易,我目前的代码如下: /// <summary> /// Creates an email attachment based upon the

一位客户要求我增强他们的一个应用程序,以便发送一封包含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.SaveAs("c:\\test.xls", SpreadsheetGear.FileFormat.OpenXMLWorkbook);
生成所需的电子表格,作为文件。但很明显,由于我最终只是以电子方式发送这些信息,如果可以的话,我还是尽量避免写入磁盘。我哪里出了问题,有什么指点吗

谢谢, 皮特


(最后应该补充一点,升级到最新的电子表格设备不是一个选项,要么采用这种方法,要么手动执行!环境是VS2008,.net 3.5)

我尝试使用您问题中的代码。我只做了两个小小的修改

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

2) 在保存工作簿.SaveToStream方法后,我添加了以下代码行

memoryStream.Seek(0, System.IO.SeekOrigin.Begin);
这会将位置设置为流的开头。当我尝试在没有它的情况下编写代码时,我在尝试打开Excel附件时收到一个错误

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

步骤1

下载ClosedXML dll并向项目添加引用

第二步。下载DocumentFormat.OpenXML并添加对 计划

使用System.IO

使用ClosedXML.Excel

公开作废发送邮件(){

            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;

        }
DataTable dt=smp.GetDataTable(“从LeaveTable中选择l.EMPID为[EMPID],e.Emp_名称为[EmpName],l.LDate为[ApplicationDate],l.StartDate为[FromDate],l.EndDate为[ToDate])

xl工作簿wb=新的xl工作簿()

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

System.IO.MemoryStream MemoryStream=新的System.IO.MemoryStream(); wb.SaveAs(内存流)

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

System.Net.Mail.Attachment Attachment=新的System.Net.Mail.Attachment(memoryStream,sheetName+“.xlsx”,“application/vnd.ms excel”)

发送电子邮件(收件人、收件人、主题、正文、附件)

}

公共静态bool sendmail(字符串pTo、字符串pTo1、字符串psobject、字符串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;

        }
private void GenerateFile(列表信息)
{
MemoryStream MemoryStream=新的MemoryStream();
尝试
{
var工作簿=新的XLWorkbook();
var工作表=工作簿。工作表。添加(“涓流_字段”);
工作表。单元格(1,1)。Value=“借方”;
工作表。单元格(1,2)。Value=“信用”;
工作表。单元格(1,3)。Value=“平衡”;
工作表.范围(1,1,1,3).添加名称(“标题”);
单元格(2,1).InsertData(info.AsEnumerable());
var titlesStyle=workBook.Style;
titlesStyle.Font.Bold=true;
TitleStyle.Alignment.Horizontal=xlAlignment水平值。居中;
titlesStyle.Fill.BackgroundColor=XLColor.Cyan;
workBook.NamedRanges.NamedRange(“标题”).Ranges.Style=标题样式;
工作表.Columns().AdjustToContent();
工作簿.SaveAs(memoryStream);
memoryStream.Seek(0,System.IO.SeekOrigin.Begin);
EmailToBackOffice(参考memoryStream);
}
捕获(例外)
{
投掷;
}
最后
{
memoryStream.Dispose();
memoryStream.Close();
}
}
公共作废电子邮件邮箱办公室(参考MemoryStream MemoryStream)
{    
SmtpClient=新的SmtpClient();
MailMessage msg=新的MailMessage();
msg.Body=“”;
msg.IsBodyHtml=true;
msg.Subject=“”;
msg.Priority=MailPriority.Normal;
msg.Sender=新邮件地址();
msg.From=新邮件地址();
msg.To.Add(新邮件地址());
var attachment=new System.Net.Mail.attachment(memoryStream,“trickle_field.xlsx”,“application/vnd.ms excel”);
msg.Attachments.Add(附件);
client.Host=“此处的主机名”;
client.Credentials=new System.Net.NetworkCredential(“用户名”、“密码”);
client.Send(msg);
}

是的,谢谢Daniel。我开始考虑流问题而不是电子表格问题,我尝试添加一行代码来重置流中的位置。我现在正在测试这个问题(这需要一段时间-在我停止使用SMTP服务器遇到权限问题之前,我需要将其升级到他们的UAT环境中!)我没有发现扩展,但你说的有道理。设置memoryStream.Position=0成功了。谢谢你的输入。哇,谢谢你救了我一天,我几乎完成了一整项我真的不喜欢的工作,因为这对我来说不起作用!很抱歉,但是这个答案,无论考虑得多么周全,似乎与电子表格无关如果我仍然有这个问题(我没有得到公认的答案),你的回答不会有帮助。请提供一些解释
    private void GenerateFile(List<TrickleFieldInfo> info)
            {
                MemoryStream memoryStream = new MemoryStream();
                try
                {
                    var workBook = new XLWorkbook();
                    var workSheet = workBook.Worksheets.Add("trickle_field");

                    workSheet.Cell(1, 1).Value = "Debit";
                    workSheet.Cell(1, 2).Value = "Credit";
                    workSheet.Cell(1, 3).Value = "Balance";
                    workSheet.Range(1, 1, 1, 3).AddToNamed("heading");
                    workSheet.Cell(2, 1).InsertData(info.AsEnumerable());

                    var titlesStyle = workBook.Style;
                    titlesStyle.Font.Bold = true;
                    titlesStyle.Alignment.Horizontal = XLAlignmentHorizontalValues.Center;
                    titlesStyle.Fill.BackgroundColor = XLColor.Cyan;

                    workBook.NamedRanges.NamedRange("heading").Ranges.Style = titlesStyle;

                    workSheet.Columns().AdjustToContents();
                    workBook.SaveAs(memoryStream);

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

                    EmailToBackOffice(ref memoryStream);
                }
                catch (Exception)
                {
                    throw;
                }
                finally
                {
                    memoryStream.Dispose();
                    memoryStream.Close();
                }
            }

public void EmailToBackOffice(ref MemoryStream memoryStream)
        {    
            SmtpClient client = new SmtpClient();
            MailMessage msg = new MailMessage();
            msg.Body = "";
            msg.IsBodyHtml = true;
            msg.Subject = "<Email subject here>";
            msg.Priority = MailPriority.Normal;
            msg.Sender = new MailAddress(<From address here>);
            msg.From = new MailAddress(<From address here>);
            msg.To.Add(new MailAddress(<To address here>));

            var attachment = new System.Net.Mail.Attachment(memoryStream, "trickle_field.xlsx", "application/vnd.ms-excel");
            msg.Attachments.Add(attachment);

            client.Host = "Host name here";
            client.Credentials = new System.Net.NetworkCredential("username", "password");
            client.Send(msg);
        }