Excel-Interop-Zelle formatieren von Datumsangaben
Mein Programm erstellt eine Ausgabe in Excel.
Einige der Termine zu sein scheinen immer falsch interpretiert:
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
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hier das Problem ist, Sie schreiben alles, was in Excel als string, und Excel speichern Sie es als solche. Auf Bearbeiten und drücken Sie die EINGABETASTE, Excel, re-interpretieren der Inhalt der Zelle und können dann speichern Sie es anders.
Beim Aufruf
ToString()
auf eineDateTime
die Standard-Formatierung ist in der form DD/MM/YY HH:mm:ss, das ist genau das, was Sie sehen, in der resultierenden Datei.Datumsangaben werden in Excel als zahlen gespeichert, die die Anzahl der Tage, die vergangen sind, seit 1900. Um diese Zahl können Sie rufen Sie die
ToOADate()
Methode.Sehen http://msdn.microsoft.com/en-gb/library/system.datetime.tooadate.aspx
Mit den Daten als
double
und einem entsprechenden format-string, sollten Sie bekommen die Ergebnis Sie hoffen auf!switch
innerhalb der nested-loop-tests, die für diedatatype
; wenn Ihr ein datetime verwenden Sie dannToOADate()
; wenn es ein string, dann verwenden SieToString()
etc. ?Ja, das würde funktionieren. Außerdem finde ich die
DataRow
indexer (z.B.dr[i-1]
) die Eingabe für die Spalte Typ. So sollten Sie in der Lage sein, um test-die Rückkehr-Objekt (e.gif (value is DateTime)
- und call -ToOADate()
.... ok - ich werde Bearbeiten meiner OP mit dem neuen nested-loop - ich habe es nicht getestet noch, und ich habe das Gefühl im Dunkeln herum ein bisschen ; also nicht lachen!
InformationsquelleAutor Charles Mager
Einfach ersetzen (string) mit (formatierte Wert)
InformationsquelleAutor Mohand GK