2015-06-05 5 views
5

Im Verwenden dieses Codes zum Senden einer E-Mail mit Excel-Anlage von Gridview, funktioniert es gut für die E-Mail-Teil, aber die Excel-Anlage ist immer leer Ich habe bereits den Code und sicher, dass die Datenquelle von Gridview übergibt die Daten, die es für die Gridview benötigte, scheint es, dass die Gridview zu Excel nicht richtig rendern. der ganze Prozess ist in einem für jede Schleife abhängig von der Zahl der Elemente innerhalb der foreach.Abrufen leer Excel beim Anhängen Excel in Mail

fehle ich etwas Code?

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("[email protected]"); 
     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("[email protected]"); 
     newMail.IsBodyHtml = true; 
     SmtpClient SmtpSender = new SmtpClient(); 
     SmtpSender.Port = 25; 
     SmtpSender.Host = "MailHost"; 
     SmtpSender.Send(newMail); 

     newMail.Dispose(); 
    } 


} 
+0

versuchen Sie zu debuggen und zu überprüfen, ob Sie die 'Daten im Debugger' oder nicht – BNN

+0

@nadeem ja ich habe versucht und sicher, dass ich Daten aus der Datenquelle des Gridview bekommen, aber beim Überprüfen der mBarray es Nullabmessungen abgerufen . – user2705620

+0

@ User6675636b20796f7521 Woher erhalten Sie Daten, für die in Excel geschrieben werden? – Mairaj

Antwort

1

Nun, die Antwort selbst gefunden ändern,

anstatt direkt die gridview Rendering i den Wert des Gridview in einer Tabelle übergeben dann In der Tabelle ist die, i für die Darstellung verwendet wird,

Beispiel unten:

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")); 

Dann gehen Sie, ich kann die richtige Datei beim Senden von E-Mail statt die leere anhängen.

1

Sie erhalten leeren Excel, weil Sie bytes von stw bekommen, die definiert ist, aber es wurde nie ein Wert gegeben.

stw ist nur ein neues Objekt ohne Wert, der ist, warum Sie 0 bytes array in mBArray bekommen.

Und als Sie zugewiesen mAtt = new System.IO.MemoryStream(mBArray, false);. So wie mBArray ist leer, so ist mAtt und Sie haben Datei von mAtt erstellt, die leer ist, deshalb erhalten Sie leere Datei in E-Mail. Ich denke, Sie müssen diese Zeile

byte[] mBArray = Enc.GetBytes(stw.ToString()); 

zu

byte[] mBArray = Enc.GetBytes(_writer.ToString());