Entwickler-Ecke

Dateizugriff - Daten aus Excel in StringList laden


MarioL - So 19.12.10 18:08
Titel: Daten aus Excel in StringList laden
Hallo, ich möchte eine ComboBox und 3 StringListen mit Daten aus einer Excel-Datei füllen und habe folgende Frage:

wie kann ich ein bestimmtes Sheet auswählen ?
und wie kann ich die letzte Zeile einer bestimmten Spalte (B) ermitteln ?

hier mein code:
(Teile davon sind von 'DBR Delphi-Ecke' http://www.s170867368.online.de/delphi/lastrow.php)



Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
var
  xcl : OleVariant;
  sl1, sl2, sl3 : TStringlist;

const
  xlCellTypeLastCell = 11;

//Laden aus Excel
procedure Laden(Datei: string; list: TStrings);
var i, r: integer;
begin
  list.clear;
  xcl := createOleObject('Excel.Application');
  xcl.Workbooks.Open(Datei);
  r := xcl.Cells.SpecialCells(xlCellTypeLastCell, EmptyParam).Row; 
       //hier benötige ich die letzte Zeile von Spalte B (Spalte A enthält mehr Daten als Spalte B)
  for i := 3 to r do begin
    list.add(xcl.range['B' + inttostr(i)]);
    sl1.add(xcl.range['C' + inttostr(i)]);
    //sl2 ...
  end;
  xcl.quit;
end;

procedure TForm1.Button1Click(Sender: TObject);
var Datei: string;
begin
  if OpenDialog1.Execute then begin
    sl1 := TStringlist.create;
    //sl2 ...
    Datei := OpenDialog1.FileName;
    Laden(Datei, ComboBox1.items);
    ComboBox1.ItemIndex := 0;
    Edit1.Text := sl1.Strings[0];
    // ...
  end;
end;




MfG Mario

Moderiert von user profile iconMartok: Delphi-Tags gesetzt


MarioL - So 19.12.10 18:57

Hallo, Problem 1 konnte ich lösen.



Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
//Laden aus Excel
procedure Laden(Datei: string; list: TStrings);
var i, r: integer;
    s, x : string;
begin
  list.clear;
  xcl := createOleObject('Excel.Application');
  xcl.Workbooks.Open(Datei);
  for i := 1 to xcl.Sheets.Count do begin
    s := s + chr(13) + IntToStr(i) + ' - ' +xcl.Sheets[i].name
  end;
  InputQuery('Tabelle auswählen', s, x);
  r := xcl.Sheets[StrToInt(x)].Cells.SpecialCells(xlCellTypeLastCell, EmptyParam).Row;
  for i := 3 to r do begin
    list.add(xcl.Sheets[StrToInt(x)].range['B' + inttostr(i)]);
    sl1.add(xcl.Sheets[StrToInt(x)].range['C' + inttostr(i)]);
    //sl2 ...
  end;
  xcl.quit;
end;




MfG Mario

Moderiert von user profile iconMartok: Delphi-Tags gesetzt


Martok - So 19.12.10 19:12

Hallo!

Bitte verwende für Quellcode die entsprechenden [delphi]-Tags, dann wird er "schöner" dargestellt als im Fließtext. Beispiel:

Quelltext
1:
<span class="inlineSyntax"><span class="codecomment">{PROTECTTAGd6f0893982771bbe9faced57b60e8924}</span></span>                    

Wird:

Delphi-Quelltext
1:
var Test: integer;                    


Ich habe das mal für dich gemacht, also für die Zukunft dann ;)

Viele Grüße,
Martok


Gerd Kayser - So 19.12.10 19:40

user profile iconMarioL hat folgendes geschrieben Zum zitierten Posting springen:
wie kann ich ein bestimmtes Sheet auswählen ?
und wie kann ich die letzte Zeile einer bestimmten Spalte (B) ermitteln ?
Siehe hier:
http://www.ozgrid.com/forum/showthread.php?t=65705&page=1
http://www.djpate.freeserve.co.uk/Automation.htm


Chemiker - So 19.12.10 22:50

Hallo MarioL,

hat jetzt nicht direkt was mit Deinem Problem zu tun, aber nach den:


Delphi-Quelltext
1:
xcl.quit;                    

sollte unbedingt noch ein:


Delphi-Quelltext
1:
xcl:= Unassigned;                    

folgen. Sonst bleibt die Excel-Instanz weiter im Speicher. Kann man schön beobachten, wenn man nach dem Schließen in den Taskmanger schaut.

Bis bald Chemiker