我目前正在开发一个包含以下项目的项目:
我的问题是,我没有在电子邮件正文中发送gridview内容,而是希望将其作为附件发送,但我花了大约3个小时就此而无法弄清楚如何做到这一点。如果我有例如6个查询按钮,我如何使“发送电子邮件”按钮发送6个不同的电子邮件(序列应该是,按查询按钮,然后按发送电子邮件按钮)与查询的文本已经过了?
一些帮助将不胜感激
这是相关的代码片段
gridview代码
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="true"></asp:GridView>
查询按钮
protected void ButtonQ1_Click(object sender, EventArgs e)
{
DataTable dt = new DataTable();
SqlConnection connection = new SqlConnection(GetConnectionString());
connection.Open();
SqlCommand sqlCmd = new SqlCommand("SELECT distinct ITMREF_0 as COD_ART, CPNITMREF_0 as NOME_ART, CPNOPE_0 as TRANS_ART FROM [ERPDQ].[dbo].[DQBOMD] where CPNOPE_0 < 5 or CPNOPE_0 > 20", connection);
SqlDataAdapter sqlDa = new SqlDataAdapter(sqlCmd);
sqlDa.Fill(dt);
if (dt.Rows.Count > 0)
{
GridView1.DataSource = dt;
GridView1.DataBind();
}
connection.Close();
}
导出到Excel按钮
protected void Buttonexcel_Click(object sender, EventArgs e)
{
try
{
Response.Clear();
Response.Buffer = true;
Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
Response.Charset = "";
Response.AddHeader("content-disposition", "attachment;filename=dados.xls");
StringWriter sWriter = new StringWriter();
HtmlTextWriter hWriter = new HtmlTextWriter(sWriter);
GridView1.RenderControl(hWriter);
Response.Output.Write(sWriter.ToString());
Response.Flush();
Response.End();
}
catch (Exception ex)
{
Label1.Text = ex.ToString();
}
}
发送电子邮件按钮
protected void Buttonmail_Click(object sender, EventArgs e)
{
using (StringWriter sw = new StringWriter())
{
using (HtmlTextWriter hw = new HtmlTextWriter(sw))
{
GridView1.RenderControl(hw);
StringReader sr = new StringReader(sw.ToString());
MailMessage mm = new MailMessage("sender@gmail.com", "receiver@gmail.com");
mm.Subject = "GridView Email";
mm.Body = "GridView:<hr />" + sw.ToString(); ;
mm.IsBodyHtml = true;
SmtpClient smtp = new SmtpClient();
smtp.Host = "smtp.gmail.com";
smtp.EnableSsl = true;
System.Net.NetworkCredential NetworkCred = new System.Net.NetworkCredential();
NetworkCred.UserName = "sender@gmail.com";
NetworkCred.Password = "***";
smtp.UseDefaultCredentials = true;
smtp.Credentials = NetworkCred;
smtp.Port = 587;
smtp.Send(mm);
}
}
}
答案 0 :(得分:0)
创建后,您需要在服务器上本地保存excel文件,然后您就可以将该文件附加到电子邮件中。
关于根据点击的内容发送电子邮件,您需要将电子邮件代码与一些输入参数(to,from,body,file)分离到自己的方法中,并具有不同的按钮用适当的值调用该方法。
因此,假设您创建了一个生成名为“export1”的Excel文件的按钮。在按钮单击中创建该文件后,您将调用SendEmail方法并将export1文件路径作为文件传递给它。在电子邮件方法中,您可以将该文件附加到电子邮件中。
如果不清楚或没有让您走上正确的道路,请告诉我,我会为您设置一些代码示例。
答案 1 :(得分:0)
我的建议是将HTML保存到临时文件,然后将其用作每封电子邮件中的附件。这里的代码类似于我用来生成临时文件的代码:
string fileName = System.IO.Path.GetTempPath() + Guid.NewGuid().ToString() + ".csv"
然后只需将Excel文件的路径传递给不同的函数调用。
答案 2 :(得分:0)
我是一个c#/ asp.net新手,但也许如果我解释一下事件的顺序(至少对我有意义),它会让事情变得更清楚:
在考虑了这一段时间之后,解决问题的唯一方法是拥有尽可能多的电子邮件按钮,因为我有查询按钮,这些电子邮件按钮读取gridview结果,然后将它们转换为excel文件?如果是这样,我怎么做到这一点?
编辑:我知道了,在用户按下查询按钮并显示结果后,电子邮件按钮会将这些结果作为excel附件发送到电子邮件中,但是在发送电子邮件之后app将我重定向到包含查询中的gridview数据的页面
结果显示得很好
“正常”页面
http://www7.pic-upload.de/19.11.13/dvg5wo9whuhq.png
按下电子邮件按钮后,注意两条线之间的间隙现在很大
http://www7.pic-upload.de/19.11.13/gtxmi7pshl5.png
该页面的代码是一个表(TR和TD),其中包含查询中的所有数据(代码继续使用母版页中的div类)
<div>
<table cellspacing="0" rules="all" border="1" id="ctl00_rightcontent_GridView1" style="border-collapse:collapse;">
<tr>
<th scope="col">COD_ART</th><th scope="col">NOME_ART</th><th scope="col">TRANS_ART</th>
</tr><tr>
<td>numbers</td><td>numbers</td><td>numbers</td>
</tr><tr>.........
</form>
</div>
</div>
这是电子邮件按钮代码
protected void Buttonmail_Click(object sender, EventArgs e)
{
fn_AttachGrid();
}
public void fn_AttachGrid()
{
StringWriter sWriter = new StringWriter();
HtmlTextWriter hWriter = new HtmlTextWriter(sWriter);
GridView1.RenderControl(hWriter);
Response.Output.Write(sWriter.ToString());
MailMessage mail = new MailMessage();
mail.IsBodyHtml = true;
mail.To.Add(new MailAddress("receiver@domain.pt"));
mail.Subject = "Sales Report";
System.Text.Encoding Enc = System.Text.Encoding.ASCII;
byte[] mBArray = Enc.GetBytes(sWriter.ToString());
System.IO.MemoryStream mAtt = new System.IO.MemoryStream(mBArray, false);
mail.Attachments.Add(new Attachment(mAtt, "dad.xls"));
mail.Body = "Hi PFA";
SmtpClient smtp = new SmtpClient();
mail.From = new MailAddress("sender@gmail.com", "name");
smtp.Host = "smtp.gmail.com";
smtp.UseDefaultCredentials = true;
System.Net.NetworkCredential NetworkCred = new System.Net.NetworkCredential();
NetworkCred.UserName = "sender@gmail.com";
NetworkCred.Password = "password";
smtp.Credentials = NetworkCred;
smtp.EnableSsl = true;
smtp.Port = 587;
smtp.Send(mail);
Label1.Text = "Email Sent";
}
编辑2:我想通了,“Response.Output.Write(sWriter.ToString());”我从导出到excel按钮,导致页面再次呈现表