Excel Interop单元格date格式

我的程序在Excel中创build一个输出。

有些date似乎被误解了: 在这里输入图像说明

在打开文件时,date是截图中的混合。
如果我真的把光标放在Excel的计算框中(在screenprint中)并按回车,单元格的格式化将恢复到正确的格式。

我正在使用Microsoft.Office.Interop.Excel将数据从Datatable移动到保存在我的解决scheme中的Excel模板。

在将数据放入单元格之前,我使用switch相应地更改每个列的数字格式:

 for(int i = 1; i < NumColumns + 1; i++) { switch(dt.Columns[i-1].DataType.ToString()) { case "System.Int32": xlWorkSheet.Columns[i].NumberFormat = "#,##0_ ;[Red]-#,##0 "; break; case "System.String": xlWorkSheet.Columns[i].NumberFormat = "@"; break; case "System.DateTime": xlWorkSheet.Columns[i].NumberFormat = "[$-809]dd mmmm yyyy;@"; //"dd-mmm-yy"; break; case "System.Date": xlWorkSheet.Columns[i].NumberFormat = "[$-809]dd mmmm yyyy;@"; //"dd-mmm-yy"; break; default: xlWorkSheet.Columns[i].NumberFormat = "@"; break; } } 

要从数据表中移动值,我使用嵌套循环:

 //move header totals into the spreadsheet for(int i = 1; i < NumColumns + 1; i++) { xlWorkSheet.Cells[1, i].value = dt.Columns[i - 1].ColumnName; } //move in the data DataView dv = new DataView(dt); dv.Sort = "Date ASC"; int rowCount = 2; string theValue; try { foreach(DataRowView dr in dv) {//(DataRow dr indt.Rows) for(int i = 1; i < NumColumns + 1; i++) { theValue = dr[i - 1].ToString(); xlWorkSheet.Cells[rowCount, i].value = theValue; } rowCount += 1; } } catch(Exception) { throw; } 

在存储过程中,当我填充数据表时,我已经明确地使用DATETIME和以下内容来拼出types:

 SELECT "Date" = CONVERT(DATE,b.[Date]) ... 

我怎样才能使我的date数据如此明确,Excel不能曲解和所有所需的格式应用?


编辑

接下来(未经testing)尝试嵌套循环如下:

 int rowCount = 2; string theValue; DateTime dtm; DateTime d; try { foreach(DataRowView dr in dv) {//(DataRow dr indt.Rows) for(int i = 1; i < NumColumns + 1; i++) { //theValue = dr[i - 1].ToString(); //xlWorkSheet.Cells[rowCount, i].value = theValue; switch(dr[i - 1].GetType().ToString()) { case "System.DateTime": dtm = Convert.ToDateTime(dr[i - 1]); xlWorkSheet.Cells[rowCount, i].value = dtm.ToOADate(); break; case "System.Date": d = Convert.ToDateTime(dr[i - 1]); xlWorkSheet.Cells[rowCount, i].value = d.ToOADate(); break; default: theValue = dr[i - 1].ToString(); xlWorkSheet.Cells[rowCount, i].value = theValue; break; } } rowCount += 1; } } catch(Exception) { throw; } 

这里的问题是,你把所有的东西都写成Excel的forms,Excel就会把它存储起来。 编辑并按Enter键后,Excel将重新解释单元格内容,然后可能会以不同的方式存储它。

DateTime上调用ToString()时,默认格式的格式为DD / MM / YY HH:mm:ss,这正是您在结果文件中看到的内容。

Excel中的date存储为表示自1900年以来经过的天数的数字。要获取此数字,可以调用ToOADate()方法。

请参阅http://msdn.microsoft.com/en-gb/library/system.datetime.tooadate.aspx

将数据设置为double精度string和适当的格式string,您应该可以得到您希望的结果!

用(forms值)replace(以string)