Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi DataSet in Excel exportieren, Integer immer 64 als Wert (https://www.delphipraxis.net/170574-dataset-excel-exportieren-integer-immer-64-als-wert.html)

Eppos 24. Sep 2012 13:08

DataSet in Excel exportieren, Integer immer 64 als Wert
 
Hallo zusammen,

ich versuche mich gerade an Delphi XE2.
Mein Funktion für den Export in Excel aus einem DataSet heraus hat unter Delphi 5 einwandfrei funktioniert.

Ich Speichere die Daten in ein

ExcelArray : OLEVariant;

Wenn ich dieses Array nun an Excel übergebe erscheint immer in Zahlenfeldern "64".

Hat jemand eine Idee?

Vielen Dank

Eppos

mkinzler 24. Sep 2012 13:10

AW: DataSet in Excel exportieren, Integer immer 64 als Wert
 
Zeig mal etwas Code.

Eppos 24. Sep 2012 13:14

AW: DataSet in Excel exportieren, Integer immer 64 als Wert
 
Delphi-Quellcode:
procedure SetExcelTable( vDS : TDataSet; vForm : TForm);
const
  xlWBATWorksheet = -4167;
  xlContinuous = 1;
var
  XLApp: Variant;
  XLWorkbook: Variant;
  XLSheet: Variant;
  XLArrayData : OLEVariant;
  XLCellBegin: Variant;
  XLCellEnd: Variant;
  XLRange: Variant;

  iColumnsCount: Integer;
  iRowsCount: Integer;
  i: Integer;
  j: Integer;
begin
  try
    XLApp.DisplayAlerts := False;
    Screen.Cursor := crHourGlass;
    try
      XLWorkbook := XLApp.Workbooks.Add(xlWBATWorkSheet);
      XLSheet := XLWorkbook.Sheets[1];

      vDs.DisableControls;
      iRowsCount := vDS.RecordCount + 1;

      iColumnsCount:= vDS.FieldCount;

      XLArrayData := VarArrayCreate([1, iRowsCount, 1, iColumnsCount], varVariant);

      vDS.First;

      for i := 2 to iRowsCount do
      begin
        for j:= 1 to iColumnsCount do
          case vDS.Fields.Fields[j - 1].DataType of
            ftString : XLArrayData[i, j] := vDS.Fields.Fields[j - 1].AsString;
            ftInteger : XLArrayData[i, j] := vDS.Fields.Fields[j - 1].AsInteger;
            ftFloat, ftCurrency : XLArrayData[i, j] := vDS.Fields.Fields[j - 1].AsFloat;
            ftDate,ftDateTime : begin
                                  XLArrayData[i, j] := FormatDateTime( 'dd.mm.yyyy hh:mm:ss', vDS.Fields.Fields[j - 1].AsDateTime );
                                  XLArrayData[i, j] := StringReplace( XLArrayData[i, j], ' 00:00:00', '', [rfReplaceAll] );
                                end;
          else ;
          end;
        vDS.Next;
      end;
      XLCellBegin := XLSheet.Cells[1, 1];
      XLCellEnd := XLSheet.Cells[iRowsCount, iColumnsCount];
      XLRange := XLSheet.Range[XLCellBegin, XLCellEnd];
      XLRange.NumberFormat := '@';
      XLRange.Value := XLArrayData;
      XLRange.Borders.LineStyle := xlContinuous;
      for i:= 1 to iColumnsCount do
        XLSheet.Columns[i].AutoFit;

      XLApp.Visible := True;
      vDs.EnableControls;
    finally
      vDs.EnableControls;
      vForm.Enabled:= True;
      Screen.Cursor := crDefault;
      XLApp.DisplayAlerts:= True;
      VarClear(XLArrayData);
    end;
  except
    vDs.EnableControls;
    XLApp.Quit;
  end;
end;

shmia 24. Sep 2012 14:08

AW: DataSet in Excel exportieren, Integer immer 64 als Wert
 
Es gibt nicht nur ftInteger sondern auch noch ftSmallint, ftWord, ftLargeint.
Delphi-Quellcode:
        for j:= 1 to iColumnsCount do
          case vDS.Fields.Fields[j - 1].DataType of
             ...
          else
             // Zelle sollte sinnvollen Wert erhalten
             // ohne Zuweisung ist XLArrayData[i, j] undefiniert
             XLArrayData[i, j] := 'unsupported datatype';
          end;

Eppos 24. Sep 2012 14:11

AW: DataSet in Excel exportieren, Integer immer 64 als Wert
 
@shima
Ich habe die Else-Anweisung hinzugeüfgt, dort springt er überhaupt nicht rein.

shmia 24. Sep 2012 14:21

AW: DataSet in Excel exportieren, Integer immer 64 als Wert
 
Zitat:

Zitat von Eppos (Beitrag 1184192)
Ich habe die Else-Anweisung hinzugeüfgt, dort springt er überhaupt nicht rein.

Na, das ist doch schon mal was.

Dann verwende mal eine Zwischenvariable für das Feld damit du besser debuggen kannst
Delphi-Quellcode:
var
  f:TField;

    for j:= 1 to iColumnsCount do
    begin
       f := vDS.Fields.Fields[j - 1];
       case f.DataType of
          ftString : XLArrayData[i, j] := f.AsString;
          ftInteger : XLArrayData[i, j] := f.AsInteger;
 
         ...
Zusätzlich solltest du den Datentyp Variant überall durch OleVariant ersetzen.

Bummi 24. Sep 2012 14:22

AW: DataSet in Excel exportieren, Integer immer 64 als Wert
 
der Bösewicht ist

XLRange.NumberFormat := '@';

versuch es mal mit

XLRange.NumberFormat := '#.##0,00';

shmia 24. Sep 2012 14:33

AW: DataSet in Excel exportieren, Integer immer 64 als Wert
 
Zitat:

Zitat von Bummi (Beitrag 1184197)
XLRange.NumberFormat := '#.##0,00';

Geht aber nicht, weil sich das NumberFormat auf den gesamten Range (der auch String- & Datumsfelder enthalten kann) bezieht.
Das ist schon mal ein grundlegender Fehler.

Eppos 24. Sep 2012 14:37

AW: DataSet in Excel exportieren, Integer immer 64 als Wert
 
Danke an Shmia und Bummi.

Ich habe die Zeile
XLRange.NumberFormat := '@';
einfach auskommentiert :-D
und jetzt geht es!

p80286 24. Sep 2012 14:53

AW: DataSet in Excel exportieren, Integer immer 64 als Wert
 
Da Excel wie seine Schwester Word etwas zickig ist versuch es mal so:
Delphi-Quellcode:
excel.activesheet.Cells.NumberFormat := '@';
Gruß
K-H

Bummi 24. Sep 2012 14:59

AW: DataSet in Excel exportieren, Integer immer 64 als Wert
 
@shmia

sicher ein Fehler den kompletten Range damit zu belegen
Strings und "Datümer" beleiben aber unberührt hiervon

Olli73 24. Sep 2012 15:36

AW: DataSet in Excel exportieren, Integer immer 64 als Wert
 
Zitat:

Zitat von Eppos (Beitrag 1184204)
Ich habe die Zeile
XLRange.NumberFormat := '@';
einfach auskommentiert :-D
und jetzt geht es!

Ein XLRange.NumberFormat := AnsiChar('@'); tuts auch.

Hat mich mal den letzten Nerv gekostet, da ich viele Strings, die auch Zahlen mit führenden Nullen enthalten konnten, übergeben musste...

Eppos 25. Sep 2012 08:12

AW: DataSet in Excel exportieren, Integer immer 64 als Wert
 
@Olli73
geht auch!

@Bummi
würde nicht gehen, da Integer Felder auch mit Nachkommastellen angezeigt werden

@p80286
geht nicht!

p80286 25. Sep 2012 20:21

AW: DataSet in Excel exportieren, Integer immer 64 als Wert
 
Welche Excel-Version?
und was heißt geht nicht?
Gibt's eine Fehlermeldung oder zeigt Excel nur keine Reaktion?

(unter 2003 erzwinge ich so den text)

Gruß
K-H

Olli73 26. Sep 2012 04:27

AW: DataSet in Excel exportieren, Integer immer 64 als Wert
 
Zitat:

Zitat von p80286 (Beitrag 1184441)
Welche Excel-Version?
und was heißt geht nicht?
Gibt's eine Fehlermeldung oder zeigt Excel nur keine Reaktion?
(unter 2003 erzwinge ich so den text)

Ich schätze mal es passiert das gleiche wie in #1 genannt:
Zitat:

... erscheint immer in Zahlenfeldern "64".
Das hat auch nichts mit der Excel-Version zu tun, sondern wurde mit Unicode in Delphi 2009 "eingeführt". Ein AnsiChar('@') hilft aber.


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:43 Uhr.

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