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 Ole Excel Spaltenlänge herausfinden (https://www.delphipraxis.net/149363-ole-excel-spaltenlaenge-herausfinden.html)

eragon123 19. Mär 2010 16:08


Ole Excel Spaltenlänge herausfinden
 
Ich habe mit googeln leider nichts finden können. Daher frage ich hier mal nach. Ich steuere Excel per OLE mit meinem Delphiprogramm. Das soll ne Datei öffnen und die gesammte erste Spalte kopieren in ein array, da ich das später dann brauche. Jetzt weiß ich aber die genaue Länge der Spalte nicht (damit ist gemeint bis wohin da Werte drinstehen). Wie bekomme ich das raus? Bei meinem Text meckert er immer. Hier mal mein QT (Ausschnitt):

Delphi-Quellcode:
// Excel starten
  try
    Excel := CreateOleObject('Excel.Application');
  except
    ShowMessage('Excel konnte nicht gestartet werden!');
    Exit;
  end;

  // Laden
  try
    Excel.workbooks.open(edtquelle.Text);
  except
    ShowMessage('Datei konnte nicht geöffnet werden');
    Excel.free;
    Exit;
  end;

  // Daten Kopieren
  menge := Excel.activeworksheet.range['A1','A1'].EntireColumn;

  setlength(namensliste,0);
  for i := 1 to menge do
  begin
    SetLength(namensliste,Length(namensliste)+1);
    namensliste[i-1] := excel.cells[inttostr(i),1].value;
  end;
So müsste das ja theoretisch gehen. Bloß der Befehl um in "Menge" die Länge der Spalte reinzuschreiben geht nicht. Hoffe auf Tipps :)

Blup 19. Mär 2010 16:39

Re: Ole Excel Spaltenlänge herausfinden
 
Delphi-Quellcode:
XLSheet := XLApp.ActiveWorkbook.Worksheets[i];
xMin := 1;
yMin := 1;
xMax := XLSheet.UsedRange.Columns.Count;
yMax := XLSheet.UsedRange.Rows.Count;
Data := VarArrayCreate([yMin, yMax, xMin, xMax], varVariant);
Data := XLSheet.UsedRange.Value;

eragon123 19. Mär 2010 17:30

Re: Ole Excel Spaltenlänge herausfinden
 
Ok hab jetzt:
Delphi-Quellcode:
procedure TForm1.btngoClick(Sender: TObject);
var Verz: string; i,xmin,xmax,ymin,ymax:Integer; Excel: Variant;

  // Excel öffnen und auslesen
  // Excel starten
  try
    Excel := CreateOleObject('Excel.Application');
  except
    ShowMessage('Excel konnte nicht gestartet werden!');
    Exit;
  end;

  // Laden
  try
    Excel.workbooks.open(edtquelle.Text);
  except
    ShowMessage('Datei konnte nicht geöffnet werden');
    Excel.free;
    Exit;
  end;

  // Daten Kopieren

  XLSheet := Excel.ActiveWorkbook.Worksheets[1];
  xMin := 1;
  yMin := 1;
  xMax := XLSheet.UsedRange.Columns.Count;
  yMax := 1;
  namensliste := VarArrayCreate([yMin, yMax, xMin, xMax], varString);
  namensliste := XLSheet.UsedRange.Value;

  Excel.Activeworkbook.saved := True;
  Excel.workbooks.close;
  Excel.quit;
  Excel := unassigned;
Aber es funktioniert noch nicht. Deshalb ein paar Fragen:
ist
Delphi-Quellcode:
XLSheet: Variant;
namensliste: array of string;
korrekt?

Oder muss ich nen array of variant oder so ähnlich nehmen um das zu speichern?
Ich brauche das später nämlich nur noch als Strings.

sx2008 19. Mär 2010 21:16

Re: Ole Excel Spaltenlänge herausfinden
 
Delphi-Quellcode:
// ein Variant Array wird erzeugt
namensliste := VarArrayCreate([yMin, yMax, xMin, xMax], varString);
// das bisherige Variant-Array wird freigegeben!
// es erfolgt eine neue Zuweisung
namensliste := XLSheet.UsedRange.Value;
// hier müsste man erst mal schauen, was genau in namensliste steht
// es könnte ein einzelner Wert sein oder auch ein 1- oder 2-dimensionales Variant-Array
if not VarIsArray(namensliste) then
   ShowMessage('kein Array');
ShowMessageFmt('Dimensionen: %d', [VarArrayDimCount(namensliste)]);

Chemiker 19. Mär 2010 22:14

Re: Ole Excel Spaltenlänge herausfinden
 
Hallo eragon123,

Delphi-Quellcode:
namensliste := VarArrayCreate([yMin, yMax, xMin, xMax], varString);
besser ist:

Delphi-Quellcode:
namensliste := VarArrayCreate([yMin, yMax, xMin, xMax], varOLEStr);
Bis bald Chemiker

sx2008 19. Mär 2010 22:26

Re: Ole Excel Spaltenlänge herausfinden
 
Zitat:

Zitat von Chemiker
besser ist:
Delphi-Quellcode:
namensliste := VarArrayCreate([yMin, yMax, xMin, xMax], varOLEStr);

Das ist bringt aber nichts, weil das Array sowieso überschrieben wird.
Vergleiche das mal mit:
Delphi-Quellcode:
var
  a : Variant;
begin
  a := 3.14;
  a := 'test';
Die erste Zuweisung ist sinnlos, da die Variable a in der zweiten Zuweisung überschrieben wird.

Chemiker 19. Mär 2010 22:43

Re: Ole Excel Spaltenlänge herausfinden
 
Hallo sx2008,

Delphi-Quellcode:
varString  = $0100; { Pascal string 256 } {not OLE compatible }
Ist so in der System-Unit angegeben.

Bis bald Chemiker

sx2008 19. Mär 2010 23:09

Re: Ole Excel Spaltenlänge herausfinden
 
Zitat:

Zitat von Chemiker
Delphi-Quellcode:
varString  = $0100; { Pascal string 256 } {not OLE compatible }
Ist so in der System-Unit angegeben.

Wir reden irgendwie aneinander vorbei.
Es ist völlig egal wie das Variantarray erzeugt wird - es spielt absolut keine Rolle, weil es in der nächsten Anweisung zerstört wird.

Blup 22. Mär 2010 14:21

Re: Ole Excel Spaltenlänge herausfinden
 
Das Variantarray zu erzeugen ist natürlich nur notwendig, wenn Daten nach Excel exportiert werden.
Die Zeile kann deshalb hier entfallen. Zumindest ist so Struktur und Typ der Daten erkennbar (dachte ich).
Delphi-Quellcode:
{Zugriff über Zeile, Spalte}
for y := yMin to yMax do
  for x := xMin to xMax do
    if VarIsEmpty(Data[y, x]) then
      Stringrid1.Cells[x, y] := ''
    else
      Stringrid1.Cells[x, y] := Data[y, x];
Edit:
Datum/Zeit wird so noch nicht richtig angezeigt.

eragon123 7. Jun 2010 21:48

AW: Ole Excel Spaltenlänge herausfinden
 
Ich hätte hier nochmal eine Frage zu. Ich arbeite mittlerweile an einem anderen ähnlichen Projekt. Ich habe eine Exceldatei, in der die ersten paar Zeilen leer sind bzw. zum Teil in einzelnen Spalten Daten stehen die mich nicht interessieren. Dann kommt ein Reihe von Zeilen, in denen Werte stehen. 3 Spalten hieraus will ich auslesen.
Also z.B. Spalte 5 Zeile 8 bis x, wobei x eben dort ist wo die Daten aufhören, das kann unterschiedlich sein.

Delphi-Quellcode:
xMax := XLSheet.UsedRange.Columns.Count
scheint dabei nicht zu helfen. Das spuckt irgendwie immer nur 3 aus obwohl die ersten Zeilen leer sind und danach viel mehr als 3 Zeilen mit Daten folgen. Woher weiß er überhaupt um welche Spalte es geht? Und das er die ersten leeren Spalten übergehen muss? Hat da jemand einen Tipp wie ich das machen könnte?


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:25 Uhr.
Seite 1 von 2  1 2      

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