C# 将gridview作为excel附件发送

C# 将gridview作为excel附件发送,c#,asp.net,excel,email,gridview,C#,Asp.net,Excel,Email,Gridview,我目前正在从事一个项目,该项目包括以下项目: 一个仅由按钮单击事件填充的gridview 几个按钮将不同的查询传递到数据库,并在上面提到的gridview上显示这些结果 “将网格视图导出到excel”按钮 以及发送电子邮件按钮,用于发送电子邮件正文中的gridview内容 我的问题是,我不想在电子邮件正文中发送gridview内容,而是想将其作为附件发送,但我在这方面花了大约3个小时,不知道怎么做。另外,如果我有6个查询按钮,我如何让“发送电子邮件”按钮发送6封不同的电子邮件(顺序应该是,按

我目前正在从事一个项目,该项目包括以下项目:

  • 一个仅由按钮单击事件填充的gridview
  • 几个按钮将不同的查询传递到数据库,并在上面提到的gridview上显示这些结果
  • “将网格视图导出到excel”按钮
  • 以及发送电子邮件按钮,用于发送电子邮件正文中的gridview内容
我的问题是,我不想在电子邮件正文中发送gridview内容,而是想将其作为附件发送,但我在这方面花了大约3个小时,不知道怎么做。另外,如果我有6个查询按钮,我如何让“发送电子邮件”按钮发送6封不同的电子邮件(顺序应该是,按查询按钮,然后按发送电子邮件按钮),并发送有关查询的文本

如果您能帮忙,我们将不胜感激

下面是相关的代码片段

gridview代码

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="true"></asp:GridView>
发送电子邮件按钮

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);
        }
    }
}
受保护的无效按钮邮件单击(对象发送者,事件参数e)
{
使用(StringWriter sw=new StringWriter())
{
使用(HtmlTextWriter hw=新的HtmlTextWriter(sw))
{
GridView1.渲染控制(hw);
StringReader sr=新的StringReader(sw.ToString());
MailMessage mm=新邮件(“sender@gmail.com", "receiver@gmail.com");
mm.Subject=“GridView电子邮件”;
mm.Body=“GridView:
”+sw.ToString(); mm.IsBodyHtml=true; SmtpClient smtp=新SmtpClient(); smtp.Host=“smtp.gmail.com”; smtp.EnableSsl=true; System.Net.NetworkCredential NetworkCred=新系统.Net.NetworkCredential(); NetworkCred.UserName=”sender@gmail.com"; NetworkCred.Password=“***”; smtp.UseDefaultCredentials=true; smtp.Credentials=NetworkCred; smtp.Port=587; smtp.Send(mm); } } }
创建excel文件后,您需要在服务器上本地保存该文件,然后才能将该文件附加到电子邮件中

至于根据所单击的内容发送电子邮件,您需要将电子邮件代码分离到具有一些输入参数(to、from、body、file)的自己的方法中,并让不同的按钮使用适当的值调用该方法

假设您创建了一个按钮,该按钮生成一个名为“export1”的excel文件。在按钮中创建该文件后,单击可以调用sendmail方法并将export1文件路径作为文件传递给它。在email方法中,您可以将该文件附加到电子邮件中


如果这不清楚或没有为您设置正确的路径,请告诉我,我将为您设置一些代码示例。

我的建议是将HTML保存到一个临时文件中,然后在每封电子邮件中将其作为附件使用。以下代码类似于我用来生成临时文件的代码:

string fileName = System.IO.Path.GetTempPath() + Guid.NewGuid().ToString() + ".csv"
然后将Excel文件的路径传递给不同的函数调用。

我是c#/asp.net新手,但如果我解释事件的顺序(至少对我来说是有意义的),可能会让事情更清楚:

  • 按查询按钮,并在唯一的gridview I上显示结果 使用(或者可能使用特定的名称在本地保存)该文件 将文件作为已传递查询的结果发出信号)
  • 用户可以将gridview导出到excel(这非常有效)或发送 将其作为excel文件保存在电子邮件附件中
经过一段时间的思考后,我的问题的唯一解决方案是拥有与查询按钮一样多的电子邮件按钮,并且这些电子邮件按钮读取gridview结果,然后将其转换为excel文件吗?如果是,我如何做到这一点

编辑:我有点明白了,在用户按下查询按钮并显示结果后,电子邮件按钮会将这些结果作为excel附件发送到电子邮件中,但是在发送电子邮件后,应用程序会将我重定向到包含查询中gridview数据的页面

结果显示得很好

“正常”页面

按下电子邮件按钮后,请注意这两行之间的差距现在很大

页面的代码是一个表(TR和TD),其中包含来自查询的所有数据(代码继续使用母版页中的div类)

编辑2:我发现,我从“导出到excel”按钮获取的“Response.Output.Write(sWriter.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);
        }
    }
}
string fileName = System.IO.Path.GetTempPath() + Guid.NewGuid().ToString() + ".csv"
<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";

}