如何设置GridView导出Excel时指定列的数字或文本单元格格式
解决方法
你当前的导出逻辑是把GridView渲染成HTML后伪装成Excel文件,Excel解析HTML的时候会自动识别内容格式,所以可以通过给对应单元格添加Excel专用的CSS样式属性来强制指定格式,无需修改系统区域设置。
第一步:修改导出按钮的点击事件代码
把你原来的循环部分替换为如下代码即可:
protected void btn_excel_Click(object sender, ImageClickEventArgs e) { // 先处理每一行的单元格格式 foreach (GridViewRow r in grd_viabil.Rows) { if (r.RowType == DataControlRowType.DataRow) { // 第3列(列索引从0开始计数):Lumina列,强制文本格式 Label lbl_lumina = r.FindControl("lbl_lumina") as Label; if (lbl_lumina != null) { // 添加Excel专属格式属性,\@是文本格式标记 r.Cells[2].Attributes.Add("style", "mso-number-format:\\@;"); // 内容前加零宽空格,双重避免Excel自动识别格式 lbl_lumina.Text = "\u200B" + lbl_lumina.Text; } // 第4列:LungimeTotala列,强制两位小数数字格式 Label lbl_lungime = r.FindControl("lbl_lungime") as Label; if (lbl_lungime != null) { r.Cells[3].Attributes.Add("style", "mso-number-format:'0.00';"); } // 第5列:LungSupra列,强制两位小数数字格式 Label lbl_lsupra = r.FindControl("lbl_lsupra") as Label; if (lbl_lsupra != null) { r.Cells[4].Attributes.Add("style", "mso-number-format:'0.00';"); } } } Response.Clear(); Response.Buffer = true; Response.ContentType = "application/vnd.ms-excel"; Response.AddHeader("content-disposition", string.Format("attachment;filename={0}.xls", "Nivel interventie")); Response.Charset = ""; // 补充编码设置避免乱码 Response.ContentEncoding = System.Text.Encoding.UTF8; System.IO.StringWriter stringwriter = new System.IO.StringWriter(); HtmlTextWriter htmlwriter = new HtmlTextWriter(stringwriter); grd_viabil.RenderControl(htmlwriter); Response.Write(stringwriter.ToString()); Response.End(); }
注意事项
- 列索引从0开始计数,如果你后续调整了GridView的列顺序,需要对应修改
r.Cells[]里的索引值 - 常用的mso-number-format格式取值参考:
- 文本格式:
\@ - 整数格式:
'0' - 两位小数格式:
'0.00' - 百分比格式:
'0.00%'
- 文本格式:
兼容备选方案
如果上述样式属性在个别版本Excel中不生效,可以直接给内容加强制标记,让Excel完全按照你传入的内容展示,不需要识别格式:
// 文本列可以在内容前加零宽空格,数字列可以用等号+引号包裹 lbl_lungime.Text = $"=\"{lbl_lungime.Text}\"";
内容的提问来源于stack exchange,提问作者Beta_K
相关产品推荐
相关产品推荐

