5

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

有些日期似乎被误解了: 在此处输入图像描述

打开文件时,日期是屏幕截图中的混合。
如果我实际上将光标放在 Excel 的计算框中(在屏幕打印中)并按 Enter,则单元格的格式将恢复为正确的格式。

我正在使用Microsoft.Office.Interop.Excel将数据从 a 移动DatatableExcel保存在我的解决方案中的模板。

在将数据放入单元格之前,我使用以下命令相应地更改每列的数字格式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;
}
4

2 回答 2

5

这里的问题是您将所有内容作为字符串写入 Excel,而 Excel 会将其存储为字符串。在编辑并按 Enter 时,Excel 将重新解释单元格内容,然后可能会以不同的方式存储它。

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

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

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

将数据集作为一个double适当的格式字符串,您应该得到您希望的结果!

于 2013-03-24T21:12:36.533 回答
-3

只需将 (to string) 替换为 (formated value)

于 2017-11-12T13:01:12.150 回答