2016-09-12 3 views
2

Ich habe ein nerviges Problem mit SQL Server DATETIME Objekte in Excel 2013. Das Problem wurde mehrmals hier in SO angegeben, und ich weiß, dass die Arbeit um nur das Neuformatieren ist DATETIME Objekte in Excel, indem Sie diese:SQL Server Datetime Objekt persistente Neuformatierung Problem in Excel

  • rechts auf die Zelle klicken
  • Zellen formatieren wählen Sie
  • wählen Sie Benutzerdefinierte
  • im Typ: Eingabefeld eingeben yyyy-mm-dd hh:mm:ss.000

Das funktioniert gut, aber ich verabscheue es jedes Mal. Gibt es neben der Erstellung von Makros eine permanente Arbeit? Ich muss die Granularität des Objekts beibehalten, damit ich ein SMALLDATETIME nicht verwenden kann. Ich verwende derzeit Microsoft SQL Server Management Studio 2008 R2 auf einem Win7-Rechner.

Vielen Dank im Voraus.

-Stelio K.

+0

Wie bringen Sie es in Excel? Weil das auch per Makro möglich ist, schrumpfen Sie alle Ihre Schritte auf einen Klick. Es gibt auch eine Datenquellenverknüpfung, die in eine Tabelle kommt, die Sie formatieren können. –

+0

Dies geschieht normalerweise für Ad-hoc-Anfragen, und ich kopiere normalerweise meine Ergebnisse von sql sever in Excel. – StelioK

+1

Es sieht nicht so aus, als könnten Sie das Standard-Einfügeverhalten von Excel ohne weitere Probleme ändern. So nervig es auch ist, ich denke, das ist der Weg des geringsten Widerstands. –

Antwort

0

Ohne Code ist es schwer zu erraten, wie die Daten von SQL Server nach Excel wird. Ich gehe davon aus, dass dies nicht durch eine Datenverbindung geschieht, da Excel keine Probleme haben würde, die Daten direkt als Daten anzuzeigen.

Was ist mit Datenverbindungen?

Excel unterstützt keine Formatierung oder einen anderen nützlichen Designer, wenn Sie mit Datenverbindungen arbeiten nur. Diese Funktionalität wird von Power Query oder dem PivotTable-Designer bereitgestellt. Power Query ist in Excel 2016 integriert und als Download für Excel 2010+ verfügbar.

Warum brauchen Sie Termine

Excel zu formatieren nicht Typinformationen erhalten. Alles ist eine Zeichenkette oder Nummer und ihre Anzeige wird vom Format der Zelle bestimmt.

Datumsangaben werden als Dezimalstellen im OLE-Automatisierungsformat gespeichert. Der integrale Teil ist die Anzahl der Datumsangaben seit 1900-01-01 und der Nachkommaanteil ist die Uhrzeit. Dies ist, warum die System.DateTime diese FromOADate und ToOADate Funktionen hat.

Um ein Excel-Blatt mit Datumsangaben zu erstellen, sollten Sie das Zellenformat gleichzeitig mit dem Generieren der Zelle festlegen.

Wie Zellen zu formatieren

Dadurch relativ ist, wenn Sie das Open XML SDK oder eine Bibliothek wie EPPlus verwenden. Im folgenden Beispiel wird eine Excel-Tabelle aus einer Liste von Kunden:

static void Main(string[] args) 
{ 
    var customers = new[] 
    { 
     new Customer("A",DateTime.Now), 
     new Customer("B",DateTime.Today.AddDays(-1)) 
    }; 
    File.Delete("customers.xlsx"); 
    var newFile = new FileInfo(@"customers.xlsx"); 
    using (ExcelPackage pck = new ExcelPackage(newFile)) 
    {     
     var ws = pck.Workbook.Worksheets.Add("Content"); 

     // This format string *is* affected by the user locale! 
     // and so is "mm-dd-yy"! 
     ws.Column(2).Style.Numberformat.Format = "m/d/yy h:mm"; 

     //That's all it needs to load the data 
     ws.Cells.LoadFromCollection(customers,true); 
     pck.Save(); 
    } 
} 

Der Code verwendet die LoadFromCollection Methode eine Liste von Kunden direkt zu laden, ohne mit Zellen handelt. true bedeutet, dass eine Kopfzeile generiert wird.

Es gibt äquivalente Verfahren Daten von einer anderen Quelle zu laden: LoadFromDatatable, LoadFromDataReader, LoadFromText für CSV-Daten und auch für LoadFromArrays gezackten Objekt-Arrays.

Das Seltsame ist, dass das m/d/yy h:mm oder mm-dd-yy Format unter Angabe des Gebietsschema für die Formatierung des Benutzers verwendet, nicht das US-Format! Das liegt daran, dass diese Formate in Excel integriert sind und als länderabhängige Formate behandelt werden. In der Liste der Datumsformate werden sie mit einem Sternchen angezeigt, was bedeutet, dass sie vom Gebietsschema des Benutzers betroffen sind.

Der Grund für diese Verrücktheit ist, dass, als Excel vor 10 Jahren in das XML-basierte XLSX-Format wechselte, es die Macken des älteren XLS-Formats aus Gründen der Abwärtskompatibilität behielt.

Wenn EPPlus die xlsx-Datei speichert, erkennt sie diese und speichert einen Verweis auf die integrierte Format-ID (22 bzw. 14), anstatt die gesamte Formatzeichenfolge zu speichern.

Finding Format IDs

Die Liste der Standard-Format-IDs in der NumberingFormat element documentation page des Open XML-Standard gezeigt. Excel hat ursprünglich die IDs 0 (Allgemein) bis 49 definiert.

EPPlus erlaubt keine direkte Einstellung der ID. Es überprüft die Formatzeichenfolge und ordnet nur die Formate 0-49 zu, wie in der GetBfromBuildIdFromFormat-Methode von ExcelNumberFormat gezeigt. Um ID 22 zu erhalten, müssen wir die Format-Eigenschaft auf "m/d/yy h:mm"

setzen Ein weiterer Trick ist es, die Stylesheets eines vorhandenen Blattes zu überprüfen. xlsx ist ein komprimiertes Paket von XML-Dateien, das mit jedem Dekomprimierungsprogramm geöffnet werden kann. Die Stile sind in der Datei xl\styles.xml gespeichert.

+0

Ich habe in meinem OP angegeben, dass die Daten einfach kopiert und eingefügt werden. – StelioK

+0

@StelioK Sie können in Betracht ziehen, es in Ihren Beitrag als Bearbeitung anstelle von Kommentaren einzufügen, insbesondere, dass Sie nach dem Ausführen einer Abfrage aus dem SSMS-Bereich "Ergebnisse" kopieren. Ich denke, dass meine anfängliche Annahme richtig ist, aber mit den unzähligen Optionen gibt es eine offene Interpretation, woran Sie arbeiten könnten. –

+0

@StelioK Sie können den Assistenten zum Exportieren von Daten verwenden, um Excel-Dateien direkt zu generieren, wenn Sie Formatschätzungen vermeiden möchten. So kopieren Sie einfach Text. Excel erkennt einige Formate, ändert jedoch nicht die Stile aufgrund einer Schätzung. –