在C#中从DataGrid导出到Excel时停止日期自动格式化

时间:2010-12-10 21:27:24

标签: c# excel datetime

我目前正在格式化DataSet / DataGrid中特定Excel文件导出的日期 日期的格式如下:

DateTime date = Convert.ToDateTime(entry.Date);
string formatdate = String.Format("{0:yyyy/MM/dd}", date);

创建DataSet后,我使用以下代码将DataSet导出到Excel文件:

public static void ExportDStoExcel(DataSet ds, string filename)
    {
        HttpResponse response = HttpContext.Current.Response;
        response.Clear();
        response.Charset = "";

        response.ContentType = "application/vnd.ms-excel";
        response.AddHeader("Content-Disposition", "attachment;filename=\"" + filename + "\"");

        using (StringWriter sw = new StringWriter())
        {
            using (HtmlTextWriter htw = new HtmlTextWriter(sw))
            {
                DataGrid dg = new DataGrid();
                dg.DataSource = ds.Tables[0];
                dg.DataBind();
                dg.RenderControl(htw);
                response.Write(sw.ToString());
                response.End();
            }
        }

    }

我唯一的问题是,一旦我将其导出到Excel,Excel自动格式化这样的日期:MM / DD / YYYY而不是YYYY / MM / DD。

我知道这可以通过在Excel中打开来手动实现,但是Export正在构建到自动化系统中,需要进行硬编码。

有没有办法绕过Excel的DateTime自动格式化?

3 个答案:

答案 0 :(得分:4)

我遇到了同样的问题,并通过在文本前添加一个非破坏空格(& nbsp)来解决它。从自动格式化中停止Excel。不是最干净的解决方案,但为我做了诀窍......

答案 1 :(得分:1)

现在您只是输出HTML表格,Excel会解释它的喜好。您可以将自己降低到Excel的级别,以便能够指定列的属性(将类型设置为Text而不是General)。 这意味着您需要生成实际的xls文件(那里有各种各样的库)。或者(如果可以接受对Office 2010的限制)使用Open XML格式,您可以使用常规.NET API编写。

答案 2 :(得分:1)

您可以使用mso-number-format

设置excel单元格的样式

mso-number-format:"\\@"

\@会告诉excel仅以文本格式处理所有数据。所以自动格式不会发生。

请更新您的代码:

response.ContentType = "application/vnd.ms-excel";
response.AddHeader("Content-Disposition", "attachment;filename=\"" + filename + "\"");
response.Write("<html xmlns:x=\"urn:schemas-microsoft-com:office:excel\">");
response.Write("<head><style> td {mso-number-format:\\@;} </style></head><body>");

using (StringWriter sw = new StringWriter())
{
    using (HtmlTextWriter htw = new HtmlTextWriter(sw))
    {
        DataGrid dg = new DataGrid();
        dg.DataSource = ds.Tables[0];
        dg.DataBind();
        dg.RenderControl(htw);
        response.Write(sw.ToString());

        response.Write("</body></html>");
        response.End();
    }
}   

OR

您也可以尝试使用特定的日期格式。 请参阅:http://cosicimiento.blogspot.in/2008/11/styling-excel-cells-with-mso-number.html

mso-number-format:"yyyy\/mm\/dd"