导出gridview以优化自定义值格式

我在我的内容页面有4个东西:

  • 一个gridview
  • 查询button,执行数据库视图,并显示查询结果在视图中的gridview
  • 导出为ex​​celbutton,将gridview导出为ex​​cel
  • 发送电子邮件与上面的Excel作为附件

他们工作得很好,但是我注意到一列中的一些单元格的格式奇怪的问题,该列有2个格式应用于值,“数字”和“一般”,是“数字”不正确的一个。

这里有一些照片的前几个结果来说明我在说什么:

在SQL Server中

SQL

在内容页面

内容页

在Excel中

高强

请注意,在SQL Server和页面上,单元格显示的格式是正确的,即XXXXX.etc( 通用格式 ),但数字较多的单元格被格式化为“数字”

我会发布一些代码下面:

网格视图

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

导出为ex​​celbutton

 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?

这对我有效

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

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

 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>"; 

但结果是一样的,我应该指出的另一件事是,并不是所有logging在ITMREF_0应该像XXXXX.YYYY.ZZZZZ,我会张贴截图波纹pipe:

例

12000073是正确的,excel应该像这样显示,22284.01.01也应该像在excel中那样显示

我将不胜感激一些帮助

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

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

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

编辑2:

正如我在第一篇文章中所说,我也有一个button,发送一个Excel文件的电子邮件作为具有gridview数据的附件,我想要做同样的事情这种方法,格式列为“一般”,但我无法弄清楚如何。

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

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

有人可以帮我吗?

你可以使用这个。 这对我有用..

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