.net 使用SpreadsheetGear将电子表格作为电子邮件附件发送
一位客户要求我增强他们的一个应用程序,以便发送一封包含excel电子表格的电子邮件。他们碰巧有一份SpreadsheetGear(2009)的旧版本,所以我想如果我使用它可能会节省时间 碰巧的是,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
/// <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);
}