Excel-Interop-Zelle formatieren von Datumsangaben

Mein Programm erstellt eine Ausgabe in Excel.

Einige der Termine zu sein scheinen immer falsch interpretiert:
Excel-Interop-Zelle formatieren von Datumsangaben

Beim öffnen der Datei die Daten sind eine Mischung, wie in der Abbildung.

Wenn ich tatsächlich legte Sie den cursor in die Excel-Berechnungs-box (in Siebdruck) und drücken Sie geben Sie die Formatierung der Zelle wieder die richtige Formatierung.

Ich bin mit Microsoft.Office.Interop.Excel zum verschieben von Daten von einem Datatable zu einem Excel Vorlage gespeichert in meiner Lösung.

Bevor die Daten in die Zellen ein, die ich ändern Sie die einzelnen Spalten numberformat entsprechend mit einem 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;
    }
}

Verschieben der Werte aus der Datentabelle, die ich mit geschachtelten Schleifen:

//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;
}

In der gespeicherten Prozedur, wenn ich füllen der Datatable habe ich versucht, explizit festzuschreiben den Typ mit DATETIME und die folgenden:

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

Wie kann ich meine Daten also explizit, dass Excel nicht falsch interpretieren und die gewünschte Formatierung angewendet wird ?


Bearbeiten

Weiter (ungetestet) Versuch, die verschachtelte Schleife ist wie folgt:

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;
}

InformationsquelleAutor whytheq | 2013-03-24

Schreibe einen Kommentar