我的程序在Excel中创建输出。Excel Interop单元格日期格式
一些日期似乎越来越误解:
在打开该文件的日期,如屏幕截图的混合物。
如果我实际上将光标放在Excel的计算框中(在screenprint中)并按回车,单元格的格式将恢复为正确的格式。
我正在使用Microsoft.Office.Interop.Excel
将数据从Datatable
移至保存在我的解决方案中的Excel
模板。
之前将数据放入细胞我改变各列的NumberFormat相应使用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
和以下内容明确地说明了类型:
SELECT
"Date" = CONVERT(DATE,b.[Date])
...
如何使我的日期数据如此明确以至Excel无法曲解并且应用所有所需的格式?
编辑
下一页(未经测试)在嵌套循环尝试如下:
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;
}
... + 1个感谢如果它的日期时间使用'ToOADate()';如果它的字符串,然后使用'ToString()'等? – whytheq 2013-03-25 09:19:11
是的,这将工作。另外,我认为'DataRow'索引器(例如'dr [i-1]')将根据列类型为您打字。所以你应该能够测试返回对象(例如'if(value is DateTime)'并且调用'ToOADate()'。 – 2013-03-25 13:06:21
...好的 - 我将用新的嵌套循环编辑我的OP - 我还没有测试过,我在黑暗中感觉有点;所以不要笑! – whytheq 2013-03-25 13:38:10