在邮件中附加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后检索空白Excel

您正在获得空白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"));  

然后你就可以在发送邮件时附加正确的文件,而不是空白的。