2014-11-03 92 views
0

我想用C#發送DataSet數據與電子郵件Excel文件附件,但我不想創建物理Excel文件。它可以用MemoryStream做,但我做不到。發送數據集電子郵件通過附件Excel文件xls(不創建Excel文件)C#

另一個問題我想設置Excel文件的編碼類型,因爲數據可能是俄羅斯或土耳其特殊字符。

請幫我...

這裏是我的示例代碼...

<!-- language: c# --> 
var response = HttpContext.Response; 

response.Clear(); 
response.Charset = "utf-8"; 
response.ContentEncoding = System.Text.Encoding.Default; 

GridView excelGridView = new GridView(); 
excelGridView.DataSource = InfoDataSet; 
excelGridView.DataBind(); 

excelStringWriter = new StringWriter(); 
HtmlTextWriter htw = new HtmlTextWriter(excelStringWriter); 
excelGridView.RenderControl(htw); 

byte[] ExcelData = emailEncoding.GetBytes(excelStringWriter.ToString()); 
MemoryStream ms = new MemoryStream(ExcelData); 

mailMessage.Attachments.Add(new Attachment(ms, excelFileName, "application/ms-excel")); 
<!-- language: c# --> 

回答

0

這裏是您的解決方案

private static Stream DataTableToStream(DataTable table) 
     { 
      const string semiColon = ";"; 

      var ms = new MemoryStream(); 
      var sw = new StreamWriter(ms); 

      foreach (DataColumn column in table.Columns) 
      { 
       sw.Write(column.ColumnName); 
       sw.Write(semiColon); 
      } 
      sw.Write(Environment.NewLine); 
      foreach (DataRow row in table.Rows) 
      { 
       for (int i = 0; i < table.Columns.Count; i++) 
       { 
        sw.Write(row[i].ToString().Replace(semiColon, string.Empty)); 
        sw.Write(semiColon); 
       } 
       sw.Write(Environment.NewLine); 
      } 
      return ms; 
     } 

     private static MailMessage CreateMail(string from, 
      string to, 
      string subject, 
      string body, 
      string attname, 
      Stream tableStream) 
     { 
      // using System.Net.Mail 
      var mailMsg = new MailMessage(from, to, subject, body); 

      tableStream.Position = 0; 
      mailMsg.Attachments.Add(
       new Attachment(tableStream, attname, CsvContentType)); 
      return mailMsg; 
     } 

     private const string CsvContentType = "application/ms-excel"; 

     private static void ExportToSpreadsheetInternal(Stream tableStream, string name) 
     { 

      HttpContext context = HttpContext.Current; 
      context.Response.Clear(); 
      context.Response.ContentType = CsvContentType; 
      context.Response.AppendHeader(
       "Content-Disposition" 
       , "attachment; filename=" + name + ".xls"); 

      tableStream.Position = 0; 
      tableStream.CopyTo(context.Response.OutputStream); 

      context.Response.End(); 

     } 


     public static void ExportToSpreadsheet(DataTable table, string name) 
     { 
      var stream = DataTableToStream(table); 
      var mailMsg = CreateMail("[email protected]", 
       "[email protected]", 
       "spread", 
       "the spread", 
       name, 
       stream); 
      //ExportToSpreadsheetInternal(stream, name); 
      // send the mailMsg with SmtpClient (config in your web.config) 
      var smtp = new SmtpClient(); 
      smtp.Send(mailMsg); 
     } 

調用此方法

ExportToSpreadsheet(DataTable table, string name) 
0

這裏是另一個簡單易用的excel attchment

public string SendMail(string LastId) 
    { 
     SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["con"].ConnectionString); 
     SqlCommand cmd = new SqlCommand("sp_GetMailData", con); 
     cmd.CommandType = CommandType.StoredProcedure; 
     cmd.Parameters.AddWithValue("@LastID", LastId); 
     con.Open(); 
     string result = "0"; 
     string temptext = ""; 
     SqlDataAdapter da = new SqlDataAdapter(cmd); 
     DataTable dt=new DataTable(); 
     da.Fill(dt); 
     //ExportToSpreadsheet(dt,"My sheet"); 
     GridView gv = new GridView(); 
     gv.DataSource = dt; 
     gv.DataBind(); 
     AttachandSend(gv); 
     con.Close(); 

     return result.ToString(); 
    } 
    public void AttachandSend(GridView gv) 
    { 

     StringWriter stw = new StringWriter(); 
     HtmlTextWriter hw = new HtmlTextWriter(stw); 

     gv.RenderControl(hw); 

     System.Text.Encoding Enc = System.Text.Encoding.ASCII; 
     byte[] mBArray = Enc.GetBytes(stw.ToString()); 
     System.IO.MemoryStream mAtt = new System.IO.MemoryStream(mBArray, false); 

     System.Net.Mail.MailMessage mailMessage = new System.Net.Mail.MailMessage(); 
     MailAddress address = new 
     MailAddress("xxxxxxxxxxxxx", "Admin"); 

     mailMessage.Attachments.Add(new Attachment(mAtt, "sales.xls")); 
     mailMessage.Body = "Hi PFA"; 
     mailMessage.From = address; 
     mailMessage.To.Add("xxxxxxxxxxxx"); 
     mailMessage.Subject = "xxxxxxxxxxxxxx"; 

     mailMessage.IsBodyHtml = true; 

     var smtp = new SmtpClient(); 
     smtp.Send(mailMessage); 

    } 
相關問題