通过 C# 在 Excel 中给出数字格式

Posted

技术标签:

【中文标题】通过 C# 在 Excel 中给出数字格式【英文标题】:Giving number format in Excel through C# 【发布时间】:2012-11-06 07:14:42 【问题描述】:

我正在尝试从GridView 导出到 Excel。

下面是我的代码:

 public override void ExecuteResult(ControllerContext context)
        

            HttpContext curContext = HttpContext.Current;
            curContext.Response.Clear();

            curContext.Response.AddHeader("content-disposition", "attachment;filename=" + fileName);
            curContext.Response.Charset = "";
            curContext.Response.Cache.SetCacheability(HttpCacheability.NoCache);
            curContext.Response.ContentType = "application/vnd.ms-excel";
            StringWriter sw = new StringWriter();
            htmlTextWriter htw = new HtmlTextWriter(sw);
            htw.WriteLine("<font size=6>COMPANY<font>");
            htw.WriteLine("</br>");
            ExcelGridView.HeaderStyle.BackColor = Color.Orange;
            ExcelGridView.RenderControl(htw);
            ExcelGridView.Rows[2].
            htw.WriteLine("<table border=1 bgcolor=#DBA901>");
            htw.WriteLine("<tr >");
            htw.WriteLine("<td>");
            htw.WriteLine("Total");
            htw.WriteLine("</td>");
            htw.WriteLine("<td colspan=1>");
            htw.WriteLine(totalQ);
            htw.WriteLine("</td>");
            htw.WriteLine("<td>");
            htw.WriteLine("</td>");
            htw.WriteLine("<td  style=mso-number-format:.00>");
            htw.WriteLine(totalP);
            htw.WriteLine("</td>");
            htw.WriteLine("</tr>");
            htw.WriteLine("<table>");

            byte[] byteArray = Encoding.ASCII.GetBytes(sw.ToString());
            MemoryStream s = new MemoryStream(byteArray);
            StreamReader sr = new StreamReader(s, Encoding.ASCII);
            curContext.Response.Write(sr.ReadToEnd());

            curContext.Response.End();
        

我的问题是在 Excel 中生成的表格中,数字不是以十进制格式显示的。

例如 123.45 将按原样显示,但 123.00 将显示为 123。我想在这些值中强制执行 .00。我也只想在第三和第四列强制执行它。

GridView 中的值与我希望的一样,但是在导出到 Excel 时仅发生上述问题。

谁能建议我一个可能的解决方案?谢谢。

注意:上面代码中ExcelGridView.RenderControl(htw);是GridView的代码,ExcelGridView是GridView的名字.

【问题讨论】:

我试过你的代码,但用 StringBuilder 代替 HtmlTextWriter 和十进制格式看起来不错。 如果您使用字符串生成器,您是否将十进制值设为 123.00 而不是 123?我传递的值也是十进制格式。另外我听说 excel 2010 有小数的格式问题。是真的吗? 如果我通过了 123,我在 Excel 中得到了 123.00。如果我通过 123.1,我会在 Excel 中得到 123.10。可以试试吗? 嗨,如果我使用你的代码,我会得到空白的 excel。你认为这可能是因为 ExcelGridView.RenderControl(htw);线?因为它是将gridview传递给excel的主线。 【参考方案1】:

尝试使用 EPPlus 库从 C# 创建 Excel:

http://epplus.codeplex.com/

使用此库,您可以将单元格格式设置为数字、十进制和千位分隔符。

尝试使用 StringBuilder(自定义格式有效):

public override void ExecuteResult(ControllerContext context)


    HttpContext curContext = HttpContext.Current;
    curContext.Response.Clear();
    curContext.Response.AddHeader("content-disposition", "attachment;filename=" + fileName);
    curContext.Response.Charset = "";
    curContext.Response.Cache.SetCacheability(HttpCacheability.NoCache);
    curContext.Response.ContentType = "application/vnd.ms-excel";
    StringBuilder sb = new StringBuilder();
    sb.Append("<font size=6>COMPANY<font>");
    sb.Append("</br>");
    ExcelGridView.HeaderStyle.BackColor = Color.Orange;
    ExcelGridView.RenderControl(htw);
    ExcelGridView.Rows[2].
    sb.Append("<table border=1 bgcolor=#DBA901>");
    sb.Append("<tr >");
    sb.Append("<td>");
    sb.Append("Total");
    sb.Append("</td>");
    sb.Append("<td colspan=1>");
    sb.Append(totalQ);
    sb.Append("</td>");
    sb.Append("<td>");
    sb.Append("</td>");
    sb.Append("<td  style=mso-number-format:.00>");
    sb.Append(totalP);
    sb.Append("</td>");
    sb.Append("</tr>");
    sb.Append("<table>");

    byte[] byteArray = Encoding.ASCII.GetBytes(sb.ToString());
    MemoryStream s = new MemoryStream(byteArray);
    StreamReader sr = new StreamReader(s, Encoding.ASCII);
    curContext.Response.Write(sr.ReadToEnd());

    curContext.Response.End();

【讨论】:

该库是否需要互操作(在服务器上安装 excel)? 没有。我们没有使用 interop 或 openxml,因为我们在服务器上托管时遇到了问题。它只是简单的 gridview 到 excel @Danilo 您好,我们之前曾考虑过您的解决方案,但我们的主管不希望我们使用任何第三方工具。 @JPHellemons 不,EPPlus 不需要 Excel。它通过编写 .xlsx 文件来工作,这是一种开放格式。 @nitinvertigo 告诉您的主管,它是开源的,并且在 GNU LGPL epplus.codeplex.com/license 许可下,它可以为您节省大量时间和精力。

以上是关于通过 C# 在 Excel 中给出数字格式的主要内容,如果未能解决你的问题,请参考以下文章

C#:DataTable 到 Excel(货币格式)

c# 导入导出excel表格式

C# Excel 数字格式作为巴西货币

数字应格式化为 excel 中的数字,而不是文本 C#

C# Excel.Interop 数字格式

如何在 C# Excel 互操作中格式化公式结果?