Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Excel und Delphi (https://www.delphipraxis.net/147256-excel-und-delphi.html)

David Martens 4. Feb 2010 15:00


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:
GetLocaleInfo(GetUserDefaultLCID, LOCALE_SSHORTDATE, buff, 71)
bekomme ich ja nur das Windowsformat.



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

fishly 4. Feb 2010 15:54

Re: Excel und Delphi
 
Ich versteh irgendwie dein Problem nicht

Ist das nicht immer so?
Delphi-Quellcode:
Selection.NumberFormat = "dd/mm/yyyy;@"
Ich hab da keinen Unterschied entdeckt, wenn ich zwischen den Gebietsschemata wechsel.

p80286 4. Feb 2010 16:41

Re: Excel und Delphi
 
Zitat:

Zitat von David Martens
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.

da kann ich Dir nicht ganz zustimmen. Ich habe Excel gerade mit deutschen "Datumsen" gefüttert und es sortiert richtig (Excel 2003 SP2) wenn
"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;

David Martens 4. Feb 2010 16:45

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:
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;
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.

David Martens 4. Feb 2010 16:49

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
...

David Martens 4. Feb 2010 16:57

Re: Excel und Delphi
 
Liste der Anhänge anzeigen (Anzahl: 2)
Hier zur Anschauung noch die Excel-Dateien

p80286 4. Feb 2010 17:01

Re: Excel und Delphi
 
Zitat:

Zitat von David Martens
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.

Jo, und dieses "scheint" kann man nicht oft genug unterstreichen. Excel 2003 interpretiert irgendeinen Zahlenbereich als Datum, ich hab noch nicht herausbekommen welchen. (na gut bisher hab ich mich auch nur geärgert, und dann Text übergeben.)

ich übergebe folgende Strings
Code:
1234567
1236
66/56789
und Excel macht daraus:
Code:
     1234567
  28.05.1976
66/56789
find ich nicht witzig!

Zitat:

... und excel die Datumszeile als Text interpretiert ...
Genau da liegt ja der Hase im Pfeffer.
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!

Chemiker 4. Feb 2010 23:38

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

Amateurprofi 5. Feb 2010 00:50

Re: Excel und Delphi
 
Zitat:

Zitat von David Martens
(zum Glück ist bei Excel und Delphi die 0 der 1.1.1900) eintragen.

Bist du sicher ?

Meines Wissens ist das so

Excel : 0 = 00.01.1900, 1 = 01.01.1900
Delphi: 0 = 30.12.1899, 1 = 31.12.1899

p80286 5. Feb 2010 09:12

Re: Excel und Delphi
 
Zitat:

Zitat von Chemiker
Hallo David Martens,

Dazu folgenden Hinweis:
VBA rechnet intern mit dem amerikanischen Format. ...

Bist Du Dir da sicher? Ich traue Microsoft zwar vieles zu aber das nicht.
Daß Funktionen das Datum im amerikanischen Format erwarten glaube ich gerne, aber rechnen?

Gruß
K-H


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:50 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz