2010-07-22 5 views
27

Iam Exportieren einer DataTable in eine Excel-Datei mit Office-Interop. Das Problem ist, dass Excel Daten nicht als solche erkennt, sondern Zahlen anzeigt. In einem anderen Fall übergebe ich einen String, den er dann als Datum erkennt. In beiden Fällen sind die Daten durcheinander.So erstellen Sie das richtige Datumsformat beim Schreiben von Daten nach Excel

Ich habe NumberFormat @ versucht, das die Zelle im Textformat speichern soll, aber es hat auch nicht funktioniert.

  Application app = new Application(); 
      app.Visible = false; 
      app.ScreenUpdating = false; 
      app.DisplayAlerts = false; 
      app.EnableAnimations = false; 
      app.EnableAutoComplete = false; 
      app.EnableSound = false; 
      app.EnableTipWizard = false; 
      app.ErrorCheckingOptions.BackgroundChecking = false; 

      Workbook wb = app.Workbooks.Add(XlWBATemplate.xlWBATWorksheet); 
      Worksheet ws = (Worksheet)wb.Worksheets[1]; 

      for (int j = 0; j < dt.Rows.Count; j++) 
      { 
       for (int i = 0; i < dt.Columns.Count; i++) 
       { 
        Range rng = ws.Cells[j+2, i+1]as Range; 
        rng.Value2 = dt.Rows[j][i].ToString(); 
        rng.NumberFormat = "@"; 
       } 
      }   

      wb.SaveAs(filename, Missing.Value, Missing.Value, Missing.Value, Missing.Value, 
        Missing.Value, XlSaveAsAccessMode.xlExclusive, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value); 

      wb.Close(false, Missing.Value, Missing.Value);    

      app.Workbooks.Close(); 
      app.Application.Quit(); 
      app.Quit();  
      System.Runtime.InteropServices.Marshal.ReleaseComObject(ws); 
      System.Runtime.InteropServices.Marshal.ReleaseComObject(wb); 
      System.Runtime.InteropServices.Marshal.ReleaseComObject(app); 
      ws = null; 
      wb = null; 
      app = null; 
      GC.Collect(); 

Warum funktioniert mein NumberFormat @ nicht? Sollte Textformat nicht alles genauso anzeigen, wie ich es eingegeben habe?

Antwort

31

Haben Sie versucht, die gesamte Spalte als Datumsspalte zu formatieren? Etwas wie folgt aus:

Range rg = (Excel.Range)worksheetobject.Cells[1,1]; 
rg.EntireColumn.NumberFormat = "MM/DD/YYYY"; 

Die andere Sache, die Sie vor dem String-Ausdruck einen einzigen Zecke versuchen könnte, wäre setzen, bevor Sie den Text in die Excel-Zelle zu laden (nicht sicher, ob es ankommt oder nicht, aber es funktioniert, wenn die Eingabe von Text direkt in eine Zelle).

+0

Formatieren jeder Zelle separat sollte nicht anders sein. Wie kann ich alles richtig als Text formatieren? – codymanix

+0

Wenn Sie möchten, dass Excel die Spalte als Datumsspalte behandelt, sollte sie wirklich ein Datumsformat haben, sonst werden seltsame Dinge passieren, die Sie bereits erlebt haben. Sie können jedoch für eine andere mögliche Problemumgehung auf meine letzte Änderung verweisen. – dcp

7

Versuchen Sie es mit

DateTime.ToOADate() 

Und setzen, dass als Doppel in der Zelle. Es könnte Probleme mit Excel auf Mac-Systemen geben (es verwendet eine andere Datetime -> doppelte Konvertierung), aber es sollte für die meisten Fälle gut funktionieren.

Hoffe, das hilft.

+0

Warum hat mein @ work nicht funktioniert? Ich möchte, dass alles genauso aussieht, wie ich es eingegeben habe. – codymanix

+0

Gute Lösung ... alles andere ist fehlgeschlagen! – Sheridan

+0

Upvote! Arbeitete, als alles andere fehlschlug! –

2

Ich weiß, diese Frage ist alt, aber Excell Zellen mit Daten über VSTO bevölkern hat ein paar Fehler.

Ich fand Formula nicht mit yyyy-mmm-dd Format zu Terminen arbeiten - auch wenn die Zellen DATE FORMAT waren! Sie müssen Datumsangaben für die Verwendung in Formeln in ein TT/MM/JJJJ-Format übertragen.

Zum Beispiel der Tage, ich bin immer wieder von SQL Analysis Server kommen, und ich hatte sie zu drehen und sie dann formatieren:

using (var dateRn = xlApp.Range["A1"].WithComCleanup()) 
{ 
    dateRn.Resource.Value2 = Convert.ToDateTime(dateRn.Resource.Value2).ToString("dd-MMM-yyyy"); 
} 


using (var rn = xlApp.Range["A1:A10"].WithComCleanup()) 
{ 
    rn.Resource.Select(); 
    rn.Resource.NumberFormat = "d-mmm-yyyy;@"; 
} 

Andernfalls Formel der Daten unter Verwendung von nicht funktioniert - die Formel in Zelle C4 ist die gleiche wie C3:

enter image description here

1

Alte Frage, aber immer noch relevant.Ich habe ein Wörterbuch erzeugt, das die entsprechende Datums-Zeitformat für jede Region wird, ist hier die Hilfsklasse I erzeugt:

https://github.com/anakic/ExcelDateTimeFormatHelper/blob/master/FormatHelper.cs

FWIW das ist, wie ich es ging:

  1. geöffnet excel , manuell eingegeben eine Datetime in die erste Zelle einer Arbeitsmappe
  2. öffnete die Regionen-Dialog in der Systemsteuerung
  3. Spy verwendet, um herauszufinden, die HWNDs der Regionen Combobox und die Schaltfläche anwenden, so dass ich SetFore verwenden kann GroundWindow und SendKey, um die Region zu ändern (
  4. konnte nicht gefunden werden.) Ich habe alle Regionen durchsucht und für jede Region Excel nach dem NumberFormat der Zelle gefragt, in der das Datum gespeichert wurde eine Datei für mich
+0

Das ist wahrscheinlich nicht die Antwort, die der Fragesteller im Sinn hatte, aber ich finde es sehr hilfreich (aber ich hoffte, dass es eine einfachere Lösung gibt ...). Vielen Dank für die Freigabe Ihres Codes! – habakuk

+1

Ja, ich war auf der Suche nach einer einfacheren Lösung, aber nachdem ich einige Stunden damit verbracht habe, habe ich festgestellt, dass es einfach keinen gibt. In Excel wird keine Regions-agnostische Formatierung von Daten angezeigt. Ich habe dies gepostet, weil die akzeptierte Antwort dies nicht berücksichtigt; Es funktioniert gut für Englisch und die meisten anderen Kulturen, würde aber für z.B. Deutsch, Französisch und viele andere Regionen. Ja, vielleicht nicht die Antwort OP verdient, aber die Antwort, die er braucht :) – anakic

0

das funktionierte:

hoja_trabajo.Cells[i + 2, j + 1] = fecha.ToString("dd-MMM-yyyy").Replace(".", ""); 
0

das ist für mich gearbeitet:

sheet.Cells[currentRow, ++currentColumn] = "'" + theDate.ToString("MM/dd/yy"); 

Beachten Sie die Zecke m Arche vor dem Datum hinzugefügt.

Verwandte Themen