【问题标题】:export gridview to excel with custom value formatting使用自定义值格式将 gridview 导出到 excel
【发布时间】:2013-12-24 03:04:16
【问题描述】:

我的内容页面中有 4 件事:

  • 单个网格视图
  • 执行数据库视图并在 gridview 的视图内显示查询结果的查询按钮
  • export to excel 按钮,用于将 gridview 导出到 excel 中
  • 用上面的excel作为附件发送电子邮件

它们工作正常,但是我注意到一列中某些单元格的格式存在一个奇怪的问题,该列有两种格式应用于值,“数字”和“一般”,“数字”是不正确的.

这里有一些前几个结果的图片来说明我的意思:

在 sql 服务器中

在内容页面中

在excel中

请注意,在 sql server 和页面上,单元格以正确的格式显示,即 XXXXX.etc(常规格式),但具有更多数字的单元格被格式化为“数字”

我将在下面发布一些代码:

网格视图

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="true"></asp:GridView>

导出到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();
    }

}

有没有一种方法可以只强制整个 xls 的“一般”格式?

【问题讨论】:

标签: c# asp.net sql excel gridview


【解决方案1】:

这对我有用

        var grid = new GridView();
        grid.DataSource = candidates;
        grid.DataBind();
        Response.ClearContent();
        Response.AddHeader("content-disposition", "attachment; filename=candidates.xls");
        Response.ContentType = "application/excel";
        StringWriter sw = new StringWriter();
        HtmlTextWriter htw = new HtmlTextWriter(sw);
        grid.RenderControl(htw);
        string style = @"<style> td { mso-number-format:\@;} </style>";
        Response.Write(style);
        Response.Write(sw.ToString());
        Response.End();

【讨论】:

    【解决方案2】:

    你可以使用它。它对我有用..

    foreach (GridViewRow row in dummyGridView.Rows)
                    {
                        foreach (TableCell item in row.Cells)
                        {
                            item.Attributes.Add("class", "textmode");
                        }
                    }
    

    【讨论】:

      【解决方案3】:

      @Poormina,感谢您的输入,我的代码现在是:

      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);
              string style = @"<style> .textmode {mso-number-format:General} </style>";
              Response.Output.Write(sWriter.ToString());
              Response.Flush();
              Response.End();
          }
          catch (Exception ex)
          {
              Label1.Text = ex.ToString();
          }
      
      }
      

      但是 excel 格式保持不变,一些单元格被格式化为“数字”而另一些被格式化为“一般”,我也试过了:

      string style = @"<style> .textmode { mso-number-format:\@; } </style>";
      

      但结果是一样的,我要指出的另一件事是,并非 ITMREF_0 中的所有记录都应该像 XXXXX.YYYY.ZZZZZ,我将在下面发布截图:

      12000073正确,excel应该这样显示,22284.01.01在excel中也应该这样显示

      我会很感激一些帮助

      编辑:我想通了,我只需要添加:

      string style = @"<style> TD { mso-number-format:\@; } </style>";
              Response.Write(style);
      

      excel 仍然给我一个警告,说数字被格式化为文本或者它有一个撇号,但没关系

      编辑 2:

      正如我在第一篇文章中所说,我还有一个按钮,用于发送带有 excel 文件作为附件的电子邮件,其中包含 gridview 数据,我想对这种方法做同样的事情,将列格式化为“一般" 但是我不知道怎么做。

      这里是发送电子邮件按钮代码:

      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);
          MailMessage mail = new MailMessage();
          mail.IsBodyHtml = true;
          mail.To.Add(new MailAddress(txtto.Text));
          mail.Subject = "Foi";
          System.Text.Encoding Enc = System.Text.Encoding.ASCII;
          byte[] mBArray = Enc.GetBytes(sWriter.ToString());
          string style = @"<style> TD { mso-number-format:\@; } </style>";
          Response.Write(style);
          System.IO.MemoryStream mAtt = new System.IO.MemoryStream(mBArray, false);
          mail.Attachments.Add(new Attachment(mAtt, "rotina.xls"));
          mail.Body = "Foi detectado o seguinte problema";
          SmtpClient smtp = new SmtpClient();
          mail.From = new MailAddress("email_from", "name displayed");
          smtp.Host = "smtp.gmail.com";
          smtp.UseDefaultCredentials = true;
          System.Net.NetworkCredential NetworkCred = new System.Net.NetworkCredential();
          NetworkCred.UserName = "email_from";
          NetworkCred.Password = "password";
          smtp.Credentials = NetworkCred;
          smtp.EnableSsl = true;
          smtp.Port = 587;
          smtp.Send(mail);
          ScriptManager.RegisterClientScriptBlock(this, typeof(Page), "anything", "alert('Enviado com sucesso.');", true);
      }
      

      有人可以帮我吗?

      【讨论】:

      • 我想通了,我只需要做这个字符串 style = @""; byte[] mBArray = Enc.GetBytes(style + sWriter.ToString());
      • 在导出到 excel 时,我没有得到在 gridiview 中使用的格式或颜色。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多