Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   FreePascal (https://www.delphipraxis.net/74-freepascal/)
-   -   FreePascal Dateien in Excel übertragen (https://www.delphipraxis.net/202098-dateien-excel-uebertragen.html)

Moombas 27. Sep 2019 14:51

Dateien in Excel übertragen
 
Moin zusammen,

ein wenig weiter bin ich nun gekommen, jedoch scheitere ich an folgender Hürde, da ich leider keine Fehlermeldung erhalte, nur einen "halben" Absturz:
Delphi-Quellcode:
function StringGridToXLS(AXLApp : OleVariant; AGrid : TStringGrid; Sheetname : widestring):Boolean;
var
  Sheet: OLEVariant;
  MaxCol : Integer;
  MaxRow : Integer;
  Range : OleVariant;
  Data : OleVariant;
  Col : Integer;
  Row : Integer;
  R1,R2 : string;
begin
  Result := False;
  try
    //Worksheet auswählen
    if (Sheetname <> '') and HaveSheet(AXLApp, String(Sheetname)) then
    begin
      Sheet := AXLApp.WorkSheets[sheetname];
    end else
    begin
      Sheet := AXLApp.WorkSheets[1];
    end;
    Sheet.select;
    if AXLApp.ActiveSheet.FilterMode then
    begin
      AXLApp.ActiveSheet.ShowAllData;
    end;
    // Der vorhandenen Daten im Grid, nicht der möglichen in Excel...
    MaxCol := AGrid.ColCount;
    MaxRow := AGrid.RowCount;

    if (MaxRow > 0) and (MaxCol > 0) then
    begin
      //Bereich auswählen
      R1 := RefToCell(1, 1);
      R2 := RefToCell(MaxCol, MaxRow);
      Range := Sheet.Range[R1, R2]; //--ABSTURZ--!!
      if not VarIsNull(Range) then
      begin
        //Daten aus Grid holen
        Data := VarArrayCreate([1, MaxRow, 1, MaxCol], varVariant);
        for Row := 0 to Pred(MaxRow) do
        begin
          for Col := 0 to Pred(MaxCol) do
          begin
            Data[Succ(Row), Succ(Col)] := AGrid.Cells[Col, Row];
          end;
        end;
        //Daten dem Excelsheet übergeben
        Range.Value := Data;
        Range.Columns.AutoFit;
        Result := True;
      end;
    end;
  finally
    SaveExcel(AXLApp);
    Range := UnAssigned;
    Sheet := Unassigned;
    Data := Unassigned;
  end;
end;
An der markierten Stelle, also bei
Delphi-Quellcode:
Range := Sheet.Range[R1, R2]; //--ABSTURZ--!!
stürzt das Programm ab.
Die Werte in R1 und R2 sind korrekt ermittelt worden und in weder in Excel noch sonst irgendwie erhalte ich eine Fehlermeldung.
Ich lande in Lazarus nur im Assembler:
Delphi-Quellcode:
0000000077C7F2D0 895c2420                 mov   %ebx,0x20(%rsp)
und muss sowohl das Programm als auch Excel dann "killen". Was macht Lazarus hier wieder anders?

hoika 27. Sep 2019 15:42

AW: Dateien in Excel übertragen
 
Hallo,
was steht denn in R1 und R2 ?

Aus einem alten Artikel:
To access a Range object in Excel, simply specify the Range with which you want to work: Range := Sheet.Range['C1:F25']; In this case the code defines a range from cell C1 to cell F25.

Also müsste das doch so sein
statt
Range := Sheet.Range[R1, R2];

so sein
Range := Sheet.Range[R1+':'+R2];

Moombas 30. Sep 2019 06:50

AW: Dateien in Excel übertragen
 
In R1 bzw. R2 steht der Zellverweis also: R1 ist immer "A1" und R2 ist die höchste Zelle (z.B.) K4285

Hmm, danke an die "echte" Excel Schematic habe ich gar nicht gedacht, da dies bisher in Delphi ja so funktioniert hat und ich dachte das Excel es dann auch so erwartet, aber ich teste das mal aus.

...

Nein, das war es leider nicht, dann Stürzt das Programm auch ab, jedoch mit einer leeren Fehlermeldung.

hoika 30. Sep 2019 08:08

AW: Dateien in Excel übertragen
 
Hallo,
immer noch an der gleichen Stelle?
Sind das wirklich gültige Werte?

Moombas 30. Sep 2019 08:16

AW: Dateien in Excel übertragen
 
Wie gesagt, das ist ja 1:1 das was ich in Delphi auch verwendet habe und funktionierte, erst ab Lazarus tritt das Problem auf.
Ich habe mir die Werte mal per showmessage(); ausgeben lassen und die Werte passen.

...hab es "gefunden"...

Delphi-Quellcode:
function RefToCell( ACol, ARow: Integer): string;
geändert auf
Delphi-Quellcode:
function RefToCell( ACol, ARow: Integer): widestring;
,

Delphi-Quellcode:
R1, R2 : string;
geändert auf
Delphi-Quellcode:
R1, R2 : widestring;
Und nun funktioniert es -.-

Ron67 30. Sep 2019 08:31

AW: Dateien in Excel übertragen
 
Hast du auch an die $-Zeichen gedacht?

Range['$B$3:$C$4']

Bei mir muß das so stehen.

Jumpy 30. Sep 2019 08:51

AW: Dateien in Excel übertragen
 
Anderer Variablenname für Range? Nur um sicher zu gehen?
Ansonsten die Range-Methode direkt benutzen, nicht auf dem Sheet-Objekt? Also sinngenäß:
Delphi-Quellcode:
rg := xlApp.Range(Sheet.Cells[1,1],Sheet.Cells[Sheet.UsedRange.Rows.Count,Sheet.UsedRange.Columns.Count])

hoika 30. Sep 2019 09:10

AW: Dateien in Excel übertragen
 
Hallo,
es funktioniert jetzt ja.
Komisch ist es trotzdem ...

Moombas 30. Sep 2019 10:36

AW: Dateien in Excel übertragen
 
Naja, ich habe in Lazarus nun schon an seeehr vielen Stellen das Problem mit "WideString" lösen können, aber die Idee das hier einzusetzen kam mir leider erst heute -.-


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