![]() |
Excel und Delphi
Ich habe einen Excel-Server für den Export geschrieben (mit early binding). Damit kann man aus unserem Programm heraus alle möglichen Änderungen, bis hin zu Pivottabellen und Diagramme erzeugen.
Das Ganze unterstützt mehrere Excel Versionen (97 bis 2007). Nun bin ich aber auf leider auf ein(zwei) Problem(e) gestoßen das sich nicht mehr so einfach lösen lässt: 1. Wichtig: Seit Version 11 (2003) muß ich die Zahlen, die in die Zellen geschrieben werden, ins !!! englische !!! Format umwandeln. Das währe nicht weiter schlimm, wenn jetzt nicht eine weitere Eigenheit aufgetaucht währe. Soweit ich jetzt sagen kann, erkennt Excel ab 2003 keine "normalen" Datumswerte mehr. Bei Excel 2000 funktioniert es noch das Datum als "25.01.2010" in die Zelle zu schreiben und Excel erkennt die Eingabe als Datum. Bei Excel 2003 ist es lediglich Text. d.h. keine vernünftige Sortierung, keine Berechnung, nichts. Als Workaround habe ich das Zellenformat anhepasst, doch her kommt jetzt die Idiotie. Ich muß das deutsche Datumsformat nehmen und das Datum als .AsDateTime (zum Glück ist bei Excel und Delphi die 0 der 1.1.1900) eintragen. Dann erkennt Excel die Werte wieder. Jetzt zum eigentlichen Problem. Das funktioniert aber nur wenn ich das Datumsformat "händisch" eingebe. Das deutsche Datumsformat ist 'TT.MM.JJJJ', wiekann ich Excel nach "seinem" Datumsformat fragen um das sprachabhänige Format zu bekommen und nicht 'dd.MM.yyyy' . Mit
Delphi-Quellcode:
bekomme ich ja nur das Windowsformat.
GetLocaleInfo(GetUserDefaultLCID, LOCALE_SSHORTDATE, buff, 71)
2. (noch) unwichtig: Bis einschließlich Excel 2003 kann ich die "benutzerdefinierten" Diagramme aus der Datei Xl8galry.xls auslesen und bereitstellen. Mit Excel 2007 geht das nicht mehr, da hier das Ganze anders genutzt wird. Die Diagramme liegen jetzt als crtx-Datei unter Userprofile\Anwendungsdaten\Microsoft\Templates\Ch arts. Es gibt jetzt einer Prozedur TExcelChart.ApplyChartTemplate ABER DIE FUNKTIONERT NICHT. hat das schon jemand hingekommen? Danke und Gruß David |
Re: Excel und Delphi
Ich versteh irgendwie dein Problem nicht
Ist das nicht immer so?
Delphi-Quellcode:
Ich hab da keinen Unterschied entdeckt, wenn ich zwischen den Gebietsschemata wechsel.
Selection.NumberFormat = "dd/mm/yyyy;@"
|
Re: Excel und Delphi
Zitat:
"Alles was wie eine Zahl aussieht wie eine Zahl sortieren" gewählt wird. Das Excel ziemlich zickig ist und noch nicht einmal ein ISO-Datum versteht lassen wir einmal aussen vor Gruß K-H Edit: So läuft die Fütterung:
Delphi-Quellcode:
{ sg:tStringGrid; }
{ zelle : ansistring; } for i:=0 to sg.rowcount-1 do begin for j:=0 to sg.colcount-1 do begin zelle:=sg.cells[j,i]; excel.activesheet.cells(i+1,j+1):=zelle; {cells1..x/1..y } end; end; |
Re: Excel und Delphi
Also zu 1. nochmal. Ich glaube jetzt habe ich die Antwort, aber wiso das so ist, keine Ahnung?
noch zur Info: damit die Übertragung der Daten schneller geht mache ich folgendes:
Delphi-Quellcode:
TDataSource.DataSet.Fields.Fields[iCol].AsDateTime ergibt für heute 40213. Also wird ja eigentlich nur diese Zahl eingetragen, aber Excel scheint es trotzdem zu erkennen.
var
Data : OleVariant; ... begin ... i := 0; for iCol := 0 to TDataSource.DataSet.FieldCount - 1 do begin if TDataSource.DataSet.Fields[iCol].Visible then inc(i); end; ... Data := VarArrayCreate([0, TDataSource.DataSet.RecordCount - 1, 0, i - 1], varVariant); ... while (not TDataSource.DataSet.Eof) do begin ... if (FExcelServer.Version.Major >= 11) and // Excel 2003 und höher (iCol = iDatum) then // iDatum ist die Spalte des Datums begin Data[iRow, iCol - i] := TDataSource.DataSet.Fields.Fields[iCol].AsDateTime end else begin Data[iRow, iCol - i] := Trim(TDataSource.DataSet.Fields.Fields[iCol].AsString); end; end; ... FExcelServer.WriteRange(FStartRow, FStartCol, TDataSource.DataSet.RecordCount, VisibleFieldCount, Data); ... end; |
Re: Excel und Delphi
@p80286:
Wenn ich Daten vom z.B.: 1.2.2010 bis 1.4.2010 habe und excel die Datumszeile als Text interpretiert, dann ist in der dazugehörigen Pivottabelle die Sortierung: 01.02.2010 01.03.2010 01.04.2010 02.02.2010 02.03.2010 03.02.2010 03.03.2010 ... |
Re: Excel und Delphi
Liste der Anhänge anzeigen (Anzahl: 2)
Hier zur Anschauung noch die Excel-Dateien
|
Re: Excel und Delphi
Zitat:
ich übergebe folgende Strings
Code:
und Excel macht daraus:
1234567
1236 66/56789
Code:
find ich nicht witzig!
1234567
28.05.1976 66/56789 Zitat:
Als workaround würde ich das ISO-Datum (YYYYMMDD) vorschlagen, das wird als Zahl und als Text immer richtig sortiert. Gruß K-H NochnNachtrag: damit Die Datumsberechnung funktioniert darf unter Optionen > Berechnung der 1904-Datumswert nicht gesetzt sein! |
Re: Excel und Delphi
Hallo David Martens,
Dazu folgenden Hinweis: VBA rechnet intern mit dem amerikanischen Format. Wenn Du also die richtigen Sortierung bekommen willst solltest Du das Datum in amerikanischer Schreibweise übertragen: Monat/Tag/Jahr. Die Berechnungen und auch Sortierungen in VBA erfolgen im amerikanischen Format. Wogegen die Ausgabe der Daten von der Windows-Systemeinstellung abhängig ist. Bis bald Chemiker |
Re: Excel und Delphi
Zitat:
Meines Wissens ist das so Excel : 0 = 00.01.1900, 1 = 01.01.1900 Delphi: 0 = 30.12.1899, 1 = 31.12.1899 |
Re: Excel und Delphi
Zitat:
Daß Funktionen das Datum im amerikanischen Format erwarten glaube ich gerne, aber rechnen? Gruß K-H |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:06 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz