Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Falsche Zahlen beim Export von Delphi nach Excel (https://www.delphipraxis.net/213072-falsche-zahlen-beim-export-von-delphi-nach-excel.html)

enigma 18. Mai 2023 13:35

Falsche Zahlen beim Export von Delphi nach Excel
 
Hallo,

ich habe eine kurze Frage:
Wenn ich von Delphi 2010 Werte nach Excel 2019 exportiere, s.u.
klappt das mit der Double-Variablen DN.
Bei dem Array mit Doublewerten treten jedoch falsche Werte in Excel auf.

Delphi-Quellcode:
      Excel.ActiveSheet.Cells[2, 4].Value := 'DN = ';
      Excel.ActiveSheet.Cells[2, 5].Value := FloatToStr(DN);

      Excel.ActiveSheet.Cells[3 + idxDa, 3].Value := 'TestArray[i] = ';
      Excel.ActiveSheet.Cells[3 + idxDa, 4].Value := FloatToStr(TestArray[i]);
Vielen Dank für eure Tipps!

Delphi.Narium 18. Mai 2023 14:15

AW: Falsche Zahlen beim Export von Delphi nach Excel
 
Deklaration von DN ist?
Deklaration von TestArray ist?

Typproblem bei der Interpretation und Zuweisung nach Value? (z. B. Tausenderzeichen bzw. Komma?)

Welche Werte sind in TestArray enthalten, welche Werte erscheinen in Excel?

FloatToStr liefert (vermutlich) das Dezimalkomma. Es könnte aber sein, dass bei der Zuweisung auf Value als Dezimaltrenner der Punkt erwartet wird.

Da Value aber ein Variant sein dürfte, erscheint es mir fraglich, ob die Nutzung von FloatToStr überhaupt erforderlich ist.

Meiner Meinung nach sollte es auch so gehen:
Delphi-Quellcode:
  Excel.ActiveSheet.Cells[2, 4].Value := 'DN = ';
  Excel.ActiveSheet.Cells[2, 5].Value := DN;

  Excel.ActiveSheet.Cells[3 + idxDa, 3].Value := 'TestArray[i] = ';
  Excel.ActiveSheet.Cells[3 + idxDa, 4].Value := TestArray[i];

himitsu 18. Mai 2023 14:24

AW: Falsche Zahlen beim Export von Delphi nach Excel
 
Zitat:

Zitat von Delphi.Narium (Beitrag 1522571)
Deklaration von DN ist?
Deklaration von TestArray ist?

Ist eigentlich egal, da FloatToStr irgendeinen "Float" entgegennimmt und einen String auf gibt.

Aber die Werte wären interessant. (zu Großes oder zu Kleines wird ja anders als String dargestellt)


Was für einen Typ hat Value?
Falls Variant/OleVariant anstatt WideString, warum dann als String übergeben, anstatt als "Float" (Double) ?


Zitat:

Da Value aber ein Variant sein dürfte,
Habs nicht ausprobiert, aber in Excel2000/Excel2010/ExcelXP hatte ich versucht das zu finden, aber mich beim Nachverfolgen von ActiveSheet>Cells>Value verlaufen und es dann aufgegeben .... Nja, "Value" ist meistens ein WideString, aber gibt es auch als Integer (hier unwahrscheinlich) und selten auch als OleVariant.

enigma 18. Mai 2023 14:38

AW: Falsche Zahlen beim Export von Delphi nach Excel
 
Erstmal danke für euere Tipps!

In Delphi erhalte ich mit ShowMessage für TestArray[0] = 5,8726....
in Excel mit
Excel.ActiveSheet.Cells[3 + idxDa, 4].Value := FloatToStr(TestArray[i]);
19.862.388,00

ohne FloatToStr:
Excel.ActiveSheet.Cells[3 + idxDa, 4].Value := TestArray[i];
198,62388

himitsu 18. Mai 2023 14:45

AW: Falsche Zahlen beim Export von Delphi nach Excel
 
Und welchen Wert hat i?

Die Bereichsprüfung mal aktivieren?

Es steht nicht zufällig im Compiler-Log etwas von wegen "i sei nicht initialisiert"?
Und wenn ja, warum hört niemand darauf?


Zitat:

ShowMessage
Tipp: lernen wie man zumindestens die Grundfunktionen des Debugger benutzt.

Delphi.Narium 18. Mai 2023 14:53

AW: Falsche Zahlen beim Export von Delphi nach Excel
 
Value war bisher immer ein Variant, zumindest bei den Delphi- und Excelversionen, mit denen ich zu tun hatte.

Warum soll das jetzt anders sein.

Variant hat den Vorteil, dass man da "reinschieben" kann was man will und den Nachteil, dass da interpretiert wird, wie Excel, ... es wollen.

Und da können zuweilen Unterschiede zwischen gewünscht, erwartet und tatsächlich auftreten :-(

Den Typ von Value erfährt man (meist) durch Nachschauen in der PAS-Datei zur entsprechenden Typelib.

Alternativ in die Doku schauen: excel.range.value

Warum sollten TestArray[0] und TestArray[i] den gleichen Wert enthalten? Das kann nur dann zutreffen, wenn i = 0.

Und 19.862.388,00 sowie 198,62388 zeigen eindeutig, dass FloatToStr das Komma als Dezimaltrenner liefert, während Excel den Punkt als Dezimaltrenner erwartet und dann irgendwie interpretiert, nur nicht richtig.

Die Stringkonvertierung von Doublewerte bei der Zuweisung auf Value ist schlicht und einfach überflüssig und Kontraproduktiv.

himitsu 18. Mai 2023 14:58

AW: Falsche Zahlen beim Export von Delphi nach Excel
 
"Dieses" Value vielleicht.
Aber nicht alle "Value" in dieser Unit. :angle:
Im ExcelRange hatte ich das Array nicht gefunden und demnach auch nicht was das für ein Typ ist und welches der vielen Value das nun ist.


Genau, wenn es Variant/OleVariant ist, warum dann nicht direkt den Float zuweisen.

Delphi.Narium 18. Mai 2023 15:02

AW: Falsche Zahlen beim Export von Delphi nach Excel
 
Zitat:

Zitat von himitsu (Beitrag 1522577)
"Dieses" Value vielleicht.
Aber nicht alle "Value" in dieser Unit. :angle:

Natürlich "Dieses" Value und nicht irgendeines. Es ist ja auch nicht jedes i ein Integer ;-)

himitsu 18. Mai 2023 15:06

AW: Falsche Zahlen beim Export von Delphi nach Excel
 
Drum hatte ich ja aufgegeben und ihn dann gefragt.

Sein CodeIngight wird es hoffenltich besser wissen, als meine verkorkste Suche in der Unit.




Auch wenn OleVariant als übergeordnetes Objekt leider bissl pervers sind.

Uwe Raabe 18. Mai 2023 15:12

AW: Falsche Zahlen beim Export von Delphi nach Excel
 
Es lässt zumindest aufmerken, dass hier zwei Indexvariablen idxDa und i verwendet werden.


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:16 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-2025 by Thomas Breitkreuz