将gridview作为excel附件发送

时间:2013-11-18 15:52:29

标签: c# asp.net excel email gridview

我目前正在开发一个包含以下项目的项目:

  • 仅由按钮点击事件填充的一个gridview
  • 将不同查询传递给数据库并在上述网格视图中显示这些结果的几个按钮
  • 导出gridview to excel按钮
  • 以及在电子邮件正文中发送gridview内容的发送电子邮件按钮

我的问题是,我没有在电子邮件正文中发送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);
        }
    }
}

3 个答案:

答案 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 I上显示结果 拥有(并且可能使用某个名称在本地保存文件 将该文件作为已传递的查询的结果发出信号)
  • 用户可以将gridview导出到excel(这完全可以正常工作)或发送 它作为电子邮件附件中的Excel文件

在考虑了这一段时间之后,解决问题的唯一方法是拥有尽可能多的电子邮件按钮,因为我有查询按钮,这些电子邮件按钮读取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按钮,导致页面再次呈现表