我又遇到了一个新问题。这一次,是造成麻烦的输家。在我的代码中看到我有一个数据集,我试图导出到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或此页面覆盖此行为?