写入Excel时设置C#流编写器的日期时间格式

时间:2014-10-16 07:42:23

标签: c# excel datetime

我又遇到了一个新问题。这一次,是造成麻烦的输家。在我的代码中看到我有一个数据集,我试图导出到excel。代码基本上遍历数据集中的所有记录,并将它们添加到字符串中。然后,streamwriter对象将整个字符串写入文件。这是一个正常工作的代码,除了一个小问题。

在所有日期列中,日期为YYYY-MM-DD HH:MM:SS格式。当它写入excel时,streamwriter将其转换为mm / dd / yyyy hh:mm:ss格式。但是,excel默认为dd / mm / yyyy hh:mm:ss格式。因此,一半的日期显示错误,因为excel无法找到大于12的月份。

E.g。当日期是2014-10-16 00:00:00时,streamwriter将其写为10/16/2014 00:00:00。当我在excel中打开文件时,excel会将其解释为16个月的第10天。

现在,我知道,有一种方法可以格式化excel列中的数据,但这确实没什么。

我查了一下,完全无法找出我出错的地方。有人,请看下面的代码告诉我我错过了什么。

protected void Page_Load( object sender, System.EventArgs e )   {


        this.DeleteOldFiles( Server.MapPath( "../Temp" ) );    

        bool    bIsRowDataPresent       = false;
        bool    bIsColumnNamesPresent   = false;
        Row[]   rowReportData           = null;

        if ( Session[ "ROWOBJECT" ] != null )   {

            rowReportData       = ( Row [] )Session[ "ROWOBJECT" ];
            bIsRowDataPresent   = true;

            Session[ "ROWOBJECT" ] = null;
        }

        string[] strColumnNames = null;

        if ( Session[ "DISPLAYCOLUMNNAMES" ] != null )  {
            strColumnNames          = ( string [] )Session[ "DISPLAYCOLUMNNAMES" ];
            bIsColumnNamesPresent   = true;
        }

        string  strColumnNamesToExclude = "";

        if ( Session[ "COLUMNSTOREMOVE" ] != null ) strColumnNamesToExclude = ( string ) Session[ "COLUMNSTOREMOVE" ];

        string  strFromExcel    = ( string )Session[ Constants.FOR_EXCEL_REPORT ];

        Session[ Constants.FOR_EXCEL_REPORT ]   = null;

        string  strReport               = "";
        string  strDisplayColumn        = "";
        string  strDisplayColumnFlag    = "";

        ReportBC objReportBC = new ReportBC();

        strDisplayColumnFlag    = Convert.ToString( Session[ Constants.RPT_DISPLAY_COLUMN ] );

        if ( strDisplayColumnFlag.Trim().Equals( "" ) || strDisplayColumnFlag.Trim().Equals( Constants.CONST_NO ) ) {

            if ( bIsColumnNamesPresent )    {
                for ( int iCount = 0; iCount < strColumnNames.Length; iCount++ )    {
                    strDisplayColumn    += strColumnNames[ iCount ] + "\t";
                }
            }
        }


        if ( strFromExcel != Constants.CONST_YES && bIsRowDataPresent ) strReport   = Convert.ToString( objReportBC.ExportRowsToExcel( rowReportData, strDisplayColumn, strDisplayColumnFlag, strColumnNamesToExclude ) );
        else    {   

            string  strReportID         = ( string )Session[ Constants.REPORT_KEY_REPORTID ];
            string  strFilterCriteria   = ( string )Session[ Constants.REPORT_KEY_FILTER_CRITERIA ];

            if ( strReportID == null )  throw new FANUCApplicationException( "CM06951" );

            if ( strFilterCriteria == null )    strFilterCriteria   = "";

            if ( strFromExcel != Constants.CONST_YES )  strReport   = Convert.ToString( objReportBC.ExportToExcel( strReportID, strFilterCriteria, strDisplayColumn, strDisplayColumnFlag ) );
            else    {
                Row objRowFilter    = ( Row )Session[ Constants.FROM_ROWFILTER ];
                strReport   = Convert.ToString( objReportBC.ExportToExcelFromRowFilter( strReportID, strFilterCriteria, strDisplayColumn, strDisplayColumnFlag, objRowFilter ) );
            }               
        }

        Session.Clear();
        Response.Clear();
        Response.Buffer         = true;


        Response.ContentType    = "application/vnd.ms-excel";   
        Response.Charset        = "";

        string  strEncodingWebName  = Encoding.Default.WebName;

        CommonBQ    bqCommon    = new CommonBQ();


        // Encoding options supported are :
        // 1. ASCII -> us-ascii 
        // 2. Default
        // 3. Big5 -> big5
        // 4. UTF7 -> utf-7
        // 5. UTF8 -> utf-8
        // 6. Unicode
        // 7. UTF16 -> UnicodeFFFE

        Row rowExcelEncoding    = bqCommon.GetSystemParameters( Constants.SYS_PARAM_EXCEL_ENCODING );

        if ( rowExcelEncoding.HasField( "SYPM_AlphaNum_Val_2" ) && Convert.ToString( rowExcelEncoding[ "SYPM_AlphaNum_Val_2" ]) != ""  )    {

            string  strEncoding = Convert.ToString( rowExcelEncoding[ "SYPM_AlphaNum_Val_2" ] );

            if ( !strEncoding.Equals( Constants.EXCEL_ENCODING_DEFAULT ) )  strEncodingWebName = strEncoding;

            Encoding    objEncoding = Encoding.Default;

            try {

                objEncoding = Encoding.GetEncoding( strEncodingWebName );

            }
            catch ( Exception objSysEx )    {
                throw   new FANUCApplicationException( "CM13641", objSysEx );
            }

            Response.ContentEncoding    = objEncoding;
            EnableViewState             = false;


            string  strPath         = Server.MapPath( @"..\Temp" );

            string  strFileName     = DateTime.Now.Ticks.ToString() + ".xls";

            string  strFullFilePath = strPath +  @"\" + strFileName;



            StreamWriter    objStrmWrtr = new StreamWriter( strFullFilePath, false, objEncoding );

            objStrmWrtr.Write( strReport );

            objStrmWrtr.Close();

            Response.Redirect( "../Temp/" + strFileName );
            Response.End();
        }
        else
            throw new FANUCApplicationException( "CM13631" );
    }

更新: 其实没关系。事实证明,代码没有问题。 Excel正在使用系统的区域设置来获取日期格式。在我的系统上,它被设置为dd-mm-yy(我们使用的默认格式)。更改系统设置中的格式使其工作。

虽然,我想覆盖这种行为。我不能指望用户在PC上更改区域设置。所以,现在,一个不同的问题。有没有办法专门为此streamwriter或此页面覆盖此行为?

0 个答案:

没有答案