我的程序在Excel中创建输出。
有些日期似乎被误解了:
在打开文件时,日期是屏幕截图中的混合 如果我实际上将光标放在Excel的计算框中(在丝网印刷中)并按Enter键,则单元格的格式将恢复为正确的格式。
我正在使用Microsoft.Office.Interop.Excel
将数据从我的解决方案中保存的Datatable
移动到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
和以下内容明确地拼写出类型:
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;
}
答案 0 :(得分:5)
这里的问题是您将所有内容编写为Excel作为字符串,Excel将这样存储它。在编辑并按Enter键时,Excel将重新解释单元格内容,然后可能以不同方式存储它。
当您在ToString()
上拨打DateTime
时,默认格式为DD / MM / YY HH:mm:ss格式,这正是您在结果文件中看到的内容。< / p>
Excel中的日期存储为表示自1900年以来经过的天数的数字。要获得此数字,您可以调用ToOADate()
方法。
请参阅http://msdn.microsoft.com/en-gb/library/system.datetime.tooadate.aspx
将数据设置为double
并使用适当的格式字符串,您应该得到您希望的结果!
答案 1 :(得分:-3)
只需用(格式化值)替换(字符串)