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


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:06 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