在邮件中附加Excel后检索空白Excel
本文关键字:Excel 检索 空白 | 更新日期: 2023-09-27 17:53:27
我使用此代码从gridview发送带有excel附件的邮件,它对于邮件部分工作得很好,但excel附件总是空白。我已经调试了代码,并确保gridview的数据源将所需的数据传递给gridview,似乎我没有将gridview渲染为excel正确。整个过程是一个foreach循环,这取决于foreach中元素的数量。
我错过了一些代码吗?
protected void MailButton_Click(object sender, EventArgs e)
{
List<FOAM> foamList = new List<FOAM>(servs.GetAreaList());
foreach (FOAM foam in foamList)
{
Session["Area"] = foam.ItemAreaCode;
Session["Principal"] = foam.PrincipalAmount;
Session["Accountability"] = foam.AccountableAmount;
Session["Count"] = foam.ItemCount;
foamdetails.ItemAreaCode = foam.ItemAreaCode;
FOAMTemplateGridview.DataSource = servs.GetFoamAsOfUnsettledforAOM(foamdetails);
FOAMTemplateGridview.DataBind();
StringWriter _writer = new StringWriter();
HttpContext.Current.Server.Execute("AreaManagersMail.aspx", _writer);
StringWriter stw = new StringWriter();
HtmlTextWriter hw = new HtmlTextWriter(stw);
FOAMTemplateGridview.RenderControl(hw);
MailMessage newMail = new MailMessage();
newMail.Priority = MailPriority.High;
newMail.To.Add("test@test.com");
newMail.Subject = "Unsettled FOAM As of " + DateTime.Today.ToString("MMMM dd, yyyy") + "-A" + foam.ItemAreaCode;
System.Text.Encoding Enc = System.Text.Encoding.ASCII;
byte[] mBArray = Enc.GetBytes(stw.ToString());
System.IO.MemoryStream mAtt = new System.IO.MemoryStream(mBArray, false);
newMail.Attachments.Add(new Attachment(mAtt, "test.xls"));
newMail.Body = _writer.ToString();
newMail.From = new MailAddress("test@test.com");
newMail.IsBodyHtml = true;
SmtpClient SmtpSender = new SmtpClient();
SmtpSender.Port = 25;
SmtpSender.Host = "MailHost";
SmtpSender.Send(newMail);
newMail.Dispose();
}
}
您正在获得空白excel,因为您从stw
中获得bytes
,这是定义的,但它从未被给定值。
stw
只是一个没有值的新对象,这就是为什么你在mBArray
中得到0 bytes array
。
然后你分配了mAtt = new System.IO.MemoryStream(mBArray, false);
。因为mBArray
是空的,所以mAtt
也是空的,你从mAtt
创建的文件是空的,这就是为什么你在电子邮件中收到空的文件。我想你需要修改这一行
byte[] mBArray = Enc.GetBytes(stw.ToString());
byte[] mBArray = Enc.GetBytes(_writer.ToString());
我们自己找到答案了,
不是直接渲染gridview,而是在TABLE中传递gridview的值,然后该表是我用于渲染的,
示例如下:
Table table = new Table();
table.Rows.AddAt(3, FOAMTemplateGridview.HeaderRow);
foreach (GridViewRow row in FOAMTemplateGridview.Rows)
{
int index = 0;
table.Rows.Add(row);
foreach (TableCell tc in row.Cells)
{
switch (index)
{
case 0: tc.HorizontalAlign = HorizontalAlign.Left;
break;
case 1: tc.HorizontalAlign = HorizontalAlign.Right;
break;
case 2: tc.HorizontalAlign = HorizontalAlign.Right;
break;
case 3: tc.HorizontalAlign = HorizontalAlign.Left;
break;
case 4: tc.HorizontalAlign = HorizontalAlign.Right;
break;
case 5: tc.HorizontalAlign = HorizontalAlign.Left;
break;
case 6: tc.HorizontalAlign = HorizontalAlign.Left;
break;
case 7: tc.HorizontalAlign = HorizontalAlign.Right;
break;
case 8: tc.HorizontalAlign = HorizontalAlign.Left;
break;
case 9: tc.HorizontalAlign = HorizontalAlign.Right;
break;
case 10: tc.HorizontalAlign = HorizontalAlign.Right;
break;
case 11: tc.HorizontalAlign = HorizontalAlign.Right;
break;
case 12: tc.HorizontalAlign = HorizontalAlign.Right;
break;
case 13: tc.HorizontalAlign = HorizontalAlign.Right;
break;
case 14: tc.HorizontalAlign = HorizontalAlign.Left;
break;
case 15: tc.HorizontalAlign = HorizontalAlign.Left;
break;
case 16: tc.HorizontalAlign = HorizontalAlign.Left;
break;
}
tc.Attributes.Add("class", "text");
tc.BorderStyle = System.Web.UI.WebControls.BorderStyle.Solid;
tc.BorderColor = Color.Black;
tc.Font.Name = "Arial";
tc.Font.Size = 10;
index++;
}
}
StringWriter stw = new StringWriter();
HtmlTextWriter hw = new HtmlTextWriter(stw);
hw.WriteLine(@"<style>.text { mso-number-format:'@; } </style>");
table.RenderControl(hw);
MailMessage newMail = new MailMessage();
newMail.Priority = MailPriority.High;
newMail.To.Add(foam.AomMail);
newMail.Subject = "Subject";
System.Text.Encoding Enc = System.Text.Encoding.ASCII;
byte[] mBArray = Enc.GetBytes(stw.ToString());
System.IO.MemoryStream mAtt = new System.IO.MemoryStream(mBArray, false);
newMail.Attachments.Add(new Attachment(mAtt, "sales.xls"));
然后你就可以在发送邮件时附加正确的文件,而不是空白的。