![]() |
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:
So müsste das ja theoretisch gehen. Bloß der Befehl um in "Menge" die Länge der Spalte reinzuschreiben geht nicht. Hoffe auf Tipps :)
// 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; |
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; |
Re: Ole Excel Spaltenlänge herausfinden
Ok hab jetzt:
Delphi-Quellcode:
Aber es funktioniert noch nicht. Deshalb ein paar Fragen:
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; ist
Delphi-Quellcode:
korrekt?
XLSheet: Variant;
namensliste: array of string; 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. |
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)]); |
Re: Ole Excel Spaltenlänge herausfinden
Hallo eragon123,
Delphi-Quellcode:
besser ist:
namensliste := VarArrayCreate([yMin, yMax, xMin, xMax], varString);
Delphi-Quellcode:
Bis bald Chemiker
namensliste := VarArrayCreate([yMin, yMax, xMin, xMax], varOLEStr);
|
Re: Ole Excel Spaltenlänge herausfinden
Zitat:
Vergleiche das mal mit:
Delphi-Quellcode:
Die erste Zuweisung ist sinnlos, da die Variable a in der zweiten Zuweisung überschrieben wird.
var
a : Variant; begin a := 3.14; a := 'test'; |
Re: Ole Excel Spaltenlänge herausfinden
Hallo sx2008,
Delphi-Quellcode:
Ist so in der System-Unit angegeben.
varString = $0100; { Pascal string 256 } {not OLE compatible }
Bis bald Chemiker |
Re: Ole Excel Spaltenlänge herausfinden
Zitat:
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. |
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:
Edit:
{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]; Datum/Zeit wird so noch nicht richtig angezeigt. |
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:
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?
xMax := XLSheet.UsedRange.Columns.Count
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:25 Uhr. |
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