导出到excel会丢失日期格式

时间:2011-10-13 07:12:09

标签: asp.net visual-studio gridview export-to-excel

我将SP的内容导出到excel。其中一列将日期格式显示为08/2015,但在导出到Excel时,格式将更改为2015年8月。

我做了同样的谷歌,发现包括下面的代码就可以了;

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

导出到excel(数据集到Excel)在下面工作;

 /// <summary>
    /// This method can be used for exporting data to excel from dataset
    /// </summary>
    /// <param name="dgrExport">System.Data.DataSet</param>
    /// <param name="response">System.Web.Httpresponse</param>
    public static void DataSetToExcel(System.Data.DataSet dtExport, System.Web.HttpResponse response, string strFileName)
    {

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

        //Clean up the response Object
        response.Clear();
        response.Charset = "";

        //Set the respomse MIME type to excel
        response.ContentType = "application/vnd.ms-excel";

        //Opens the attachment in new window
        response.AddHeader("Content-Disposition", "attachment; filename=" + strFileName.ToString() + ".xls;");
        response.ContentEncoding = Encoding.Unicode;
        response.BinaryWrite(Encoding.Unicode.GetPreamble());

        //Create a string writer
        System.IO.StringWriter stringWrite = new System.IO.StringWriter();

        //Create an htmltextwriter which uses the stringwriter
        System.Web.UI.HtmlTextWriter htmlWrite = new System.Web.UI.HtmlTextWriter(stringWrite);

        //Instantiate the datagrid

        System.Web.UI.WebControls.GridView dgrExport = new System.Web.UI.WebControls.GridView();

        //Set input datagrid to dataset table
        dgrExport.DataSource = dtExport.Tables[0];

        //bind the data with datagrid
        dgrExport.DataBind();

        //Make header text bold
        dgrExport.HeaderStyle.Font.Bold = true;

        //bind the modified datagrid
        dgrExport.DataBind();

        //Tell the datagrid to render itself to our htmltextwriter
        dgrExport.RenderControl(htmlWrite);

        response.Write(style);

        //Output the HTML
        response.Write(stringWrite.ToString());

        response.End();
    }

我在哪里弄错了?请指导!

谢谢!

3 个答案:

答案 0 :(得分:3)

问题不在于日期格式,Excel根据CELL的数据类型(Default is GENERAL)转换数据。为防止数据转换,您必须提供数据类型(TEXT)以及数据。

您使用了正确的代码,但样式表.text未应用于您的数据。在所有<TD>标签上应用样式表。它将100%正常工作,并将保留您提供的数据(Date- 08/2015, 0001 or any data)。

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

答案 1 :(得分:1)

以下是一些示例代码。

Response.AddHeader("content-disposition", "attachment; filename=Report.xls");
Response.Charset = "";
Response.ContentType = "application/vnd.xls";
System.IO.StringWriter stringWrite = new System.IO.StringWriter();
System.Web.UI.HtmlTextWriter htmlWrite = new HtmlTextWriter(stringWrite);
DataGrid g = new DataGrid();
DataTable d = new System.Data.DataTable();
d = (DataTable)Session["ReportData"];        
g.DataSource = d;
g.DataBind();       
foreach (DataGridItem i in g.Items)
{
    foreach (TableCell tc in i.Cells)
        tc.Attributes.Add("class", "text");
}
g.RenderControl(htmlWrite);
string style = @"<style> .text { mso-number-format:\@; } </style> ";
Response.Write(style);
Response.Write(stringWrite.ToString());
Response.End();

答案 2 :(得分:0)

我真的不太了解相当多的代码(在asp.net中不流利)但我会说如果你想在excel表中强制文本,你需要在放置你的文件之前将目标区域定义为文本那里的数据。

如果我对代码的理解是正确的,那么:

response.Write(style);

需要在此之前。

dgrExport.RenderControl(htmlWrite);

编辑:也许是另一种解决方案

您找到的谷歌代码位将单元格的格式设置为文本。在所有可能的情况下,您希望excel将日期视为具有MM / YYYY显示格式的日期。

也许可以尝试替换它:

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

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

我不确定/或\是否是ASP.net中的转义字符,所以确切的snytax可能会有所不同。在excel术语中,数字格式@表示文本,mm / yyyy表示具有所需显示格式的日期。