【问题标题】:send gridview as excel attachment将gridview作为excel附件发送
【发布时间】:2026-02-01 10:40:02
【问题描述】:

我目前正在从事一个包含以下项目的项目:

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

我的问题是,我不想在电子邮件正文中发送 gridview 内容,而是想将其作为附件发送,但我在这上面花了大约 3 个小时,但不知道该怎么做。另外,如果我有例如 6 个查询按钮,我如何使“发送电子邮件”按钮发送 6 封不同的电子邮件(顺序应该是,按查询按钮,然后按发送电子邮件按钮)以及有关查询的文本已经通过了吗?

我们将不胜感激

这是相关的代码

网格视图代码

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

【问题讨论】:

    标签: c# asp.net excel email gridview


    【解决方案1】:

    您需要在创建后将excel文件保存在本地服务器上,然后您就可以将该文件附加到电子邮件中。

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

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

    如果不清楚或没有让您走上正确的道路,请告诉我,我会为您设置一些代码示例。

    【讨论】:

      【解决方案2】:

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

      string fileName = System.IO.Path.GetTempPath() + Guid.NewGuid().ToString() + ".csv"
      

      然后只需将 Excel 文件的路径传递给不同的函数调用。

      【讨论】:

        【解决方案3】:

        我是一个 c#/asp.net 新手,但也许如果我解释一下事件的顺序(至少对我来说是有道理的),它会让事情变得更清楚:

        • 按下查询按钮并在唯一的 gridview I 上显示结果 有(并且可能使用某个名称在本地保存文件 将文件作为已通过查询的结果发出信号)
        • 用户可以将 gridview 导出到 excel(这非常好用)或发送 它作为电子邮件附件中的 excel 文件

        在考虑了一段时间之后,我的问题的唯一解决方案是拥有与查询按钮一样多的电子邮件按钮,并且这些电子邮件按钮读取 gridview 结果,然后将它们转换为 excel 文件?如果是这样,我如何做到这一点?

        编辑: 我有点明白了,在用户按下查询按钮并显示结果后,电子邮件按钮将这些结果作为 excel 附件发送到电子邮件中,但是在发送电子邮件后应用程序将我重定向到包含来自查询的 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 按钮中获取的内容导致页面再次呈现表格

        【讨论】: