Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Excel mit mehreren Sheets öffnen (https://www.delphipraxis.net/195901-excel-mit-mehreren-sheets-oeffnen.html)

Moombas 5. Apr 2018 11:28

Excel mit mehreren Sheets öffnen
 
Moin ich habe folgendes Problem:

Ich habe eine xls Datei mit mehreren Sheets und möchte sie in Stringgrid einlesen. Mit dem ersten Sheet funktioniert es auch aber ab dem 2. kommt immer eine Fehlermeldung.

"Die Activate Methode des Range Objektes konnte nicht ausgeführt werden"

Jemand eine Idee wo mein Denkfehler ist?

Code:
function TTools.Xls_To_StringGrid(AGrid: TStringGrid; AXLSFile: string; Sheetname : string): Boolean;
const
  xlCellTypeLastCell = $0000000B;
var
  XLApp, Sheet: OLEVariant;
  RangeMatrix: Variant;
  x, y, k, r: Integer;
begin
  Result := False;
  XLApp := CreateOleObject('Excel.Application'); // Create Excel-OLE Object
  try
    XLApp.Visible := True;                       // Excel
    XLApp.Workbooks.Open(AXLSFile);              // Open the Workbook

    Sheet := XLApp.Workbooks[ExtractFileName(AXLSFile)].WorkSheets[sheetname]; // Sheet := XLApp.Workbooks[1].WorkSheets[1];
    // In order to know the dimension of the WorkSheet, i.e the number of rows
    // and the number of columns, we activate the last non-empty cell of it

    Sheet.Cells.SpecialCells(xlCellTypeLastCell, EmptyParam).Activate;

    x := XLApp.ActiveCell.Row;                  // Get the value of the last row
    y := XLApp.ActiveCell.Column;               // Get the value of the last column

    // Set Stringgrid's row &col dimensions.
    AGrid.RowCount := x;
    AGrid.ColCount := y;

    RangeMatrix := XLApp.Range['A1', XLApp.Cells.Item[X, Y]].Value;    // Assign the Variant associated with the WorkSheet to the Delphi Variant

    //  Define the loop for filling in the TStringGrid
    k := 1;
    repeat
      for r := 1 to y do
        AGrid.Cells[(r - 1), (k - 1)] := RangeMatrix[K, R];
      Inc(k, 1);
      AGrid.RowCount := k + 1;
    until k > x;
    // Unassign the Delphi Variant Matrix
    RangeMatrix := Unassigned;

  finally
    // Quit Excel
    if not VarIsEmpty(XLApp) then
    begin
      XLApp.DisplayAlerts := False;
      XLApp.Quit;
      XLAPP := Unassigned;
      Sheet := Unassigned;
      Result := True;
    end;
  end;
end;


procedure TTools.EinlesenFClick(Sender: TObject);
begin
  Xls_To_StringGrid(DE_XLS, ExcelE.Text, 'DE');
  Xls_To_StringGrid(CH_XLS, ExcelE.Text, 'CH');
end;

jobo 5. Apr 2018 11:53

AW: Excel mit mehreren Sheets öffnen
 
unsicher:
War es nicht so, dass Excel zwischen technischen (intern) und sichtbaren Sheetnames unterscheidet?
Die beiden Attribute können identischen Inhalt haben oder sich unterscheiden (bei kopierten Sheets z.B.). Einfach mal ein workbook öffnen und alles sheetnamen ausgeben lassen bzw. Doku nachschlagen, wie das mit der Sheetbenennung/Zugriff ist.

Moombas 6. Apr 2018 07:35

AW: Excel mit mehreren Sheets öffnen
 
also wenn ich XLApp.Workbooks[ExtractFileName(AXLSFile)].WorkSheets[sheetname].name mir als showmessage ausgeben lasse passt es, das er das sheet findet. Er hat auch immer nur dann ein Problem, wenn ich nicht mit Sheet 1 arbeiten möchte (die Sheets sind vom Aufbau identisch).

und er hat eindeutig mit "Sheet.Cells.SpecialCells(xlCellTypeLastCell, EmptyParam).Activate;" ein Problem, wenn ich das auskommentiere läufts durch, nur bekomme ich natürlich nicht das Ergebnis was ich brauche.

Jasocul 6. Apr 2018 07:53

AW: Excel mit mehreren Sheets öffnen
 
Vermutlich geht es nicht, weil es sich nicht um das aktive Sheet handelt.

Moombas 6. Apr 2018 08:07

AW: Excel mit mehreren Sheets öffnen
 
Das habe ich auch schon probiert, dann bekomme ich die Fehlermeldung:

"Variante des Typs (Error) konnte nicht in Typ (OleStr) konvertiert werden."

Und das auch nur wenn ich "Sheet.Cells.SpecialCells(xlCellTypeLastCell, EmptyParam).Activate;" mit drin habe.

...

Edit: Es lag an der Exceldatei, kleine Korrekturen haben den Fehler behoben. -.-

Jasocul 6. Apr 2018 08:42

AW: Excel mit mehreren Sheets öffnen
 
Zitat:

Zitat von Moombas (Beitrag 1398268)
Das habe ich auch schon probiert

Was hast du probiert?
Ich meine, dass du vorher noch das hier ausführen musst:
Delphi-Quellcode:
Sheet.Select;

tshubaka 6. Apr 2018 08:49

AW: Excel mit mehreren Sheets öffnen
 
Hallo Moombas
hier
Sheet := XLApp.Workbooks[ExtractFileName(AXLSFile)].WorkSheets[sheetname];

muss das nicht so lauten?
XLApp.workbooks.open(ExtractFileName(AXLSFile));

Sheet := XLApp.WorkSheets[sheetname].Select;

Gruss
Peter

HolgerX 6. Apr 2018 09:01

AW: Excel mit mehreren Sheets öffnen
 
Hmm..

Zitat:

Zitat von Moombas (Beitrag 1398268)
Das habe ich auch schon probiert, dann bekomme ich die Fehlermeldung:

"Variante des Typs (Error) konnte nicht in Typ (OleStr) konvertiert werden."

Und das auch nur wenn ich "Sheet.Cells.SpecialCells(xlCellTypeLastCell, EmptyParam).Activate;" mit drin habe.


Du müsstest zunächst das Sheet selber auf 'active' setzen, nicht nur die 'Cells.SpecialCells'.

'Sheet.Activate;'

Moombas 6. Apr 2018 09:09

AW: Excel mit mehreren Sheets öffnen
 
Es lag an der Exceldatei, kleine Korrekturen haben den Fehler behoben.

Moombas 7. Sep 2018 08:04

AW: Excel mit mehreren Sheets öffnen
 
Moin zusammen,

ich bin es nochmal und habe einen kleinen Nachtrag/Nachfrage, die am besten hierzu passt.
Der Fehler der Exceltabelle beim Einlesen lag immer dann vor, wenn ein Filter gesetzt war und dieser bestimmte Zeilen raus gefiltert hat (ich war davon ausgegangen, das der Filter nur eine optische Geschichte ist und im Hintergrund die Tabelle ja noch alle Daten hat).

Weiß jemand wie ich den Filter über Delphi entferne? Das was in den Excel-Makros drin steht, hat leider nicht geholfen, denn wenn ich "Sheet.ShowAllData;" aktiviere kann mein Programm die Exceldatei nicht mehr einlesen (keine Fehlermeldung, das Stringgrid bleibt einfach leer). Ich würde damit gerne diese Fehlerquelle ausschließen.

Delphi-Quellcode:
function XLS_To_StringGrid(AXLApp : OleVariant; AGrid : TStringGrid; Sheetname : string):Boolean;
const
  xlCellTypeLastCell = $0000000B;
var
  Sheet: OLEVariant;
  RangeMatrix: Variant;
  X, Y, K, R: Integer;
begin
  Result := False;
  try
    try
      if (Sheetname <> '') and HaveSheet(AXLApp, Sheetname) then begin
        Sheet := AXLApp.WorkSheets[Sheetname];
      end else
        Sheet := AXLApp.WorkSheets[1];

      // In order to know the dimension of the WorkSheet, i.e the number of rows
      // and the number of columns, we activate the last non-empty cell of it
      Sheet.select;
//      Sheet.ShowAllData;
      Sheet.Cells.SpecialCells(xlCellTypeLastCell, EmptyParam).Activate;
      X := AXLApp.ActiveCell.Row; // Get the value of the last row
      Y := AXLApp.ActiveCell.Column; // Get the value of the last column

      // Set Stringgrid's row &col dimensions.
      AGrid.RowCount := X; // Excel-Row 1 = Header
      AGrid.ColCount := Y;

      RangeMatrix := Sheet.Range['A1', Sheet.Cells.Item[X, Y]].Value; // Assign the Variant associated with the WorkSheet to the Delphi Variant
      // Define the loop for filling in the TStringGrid
      K := 0;
      While (K < X) do begin
        Inc(K);
        for r := 1 to y do
          AGrid.Cells[(R - 1), (K - 1)] := RangeMatrix[K, R];
      end;
      Result := True;
    except
      // Logging...
    end;
  finally
    RangeMatrix := Unassigned;
    Sheet := Unassigned;
  end;
end;


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