Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Wann ist das Dateiende erreicht ? (xls file einlesen) (https://www.delphipraxis.net/95603-wann-ist-das-dateiende-erreicht-xls-file-einlesen.html)

bundy 10. Jul 2007 09:30


Wann ist das Dateiende erreicht ? (xls file einlesen)
 
Hallo DP ! :hi:

Ich hab folgende Procedure um ein XLS File in die DB einzulesen.

Delphi-Quellcode:
procedure TForm1.cxButton1Click(Sender: TObject);
var
  FExcelFilename : OleVariant;
  Cellrange:ExcelRange;
  i:integer;

begin
i:=2;
  FExcelFilename:='c:\import.xls';
  ExcelApplication1.Workbooks.Open(FExcelFilename,EmptyParam,EmptyParam,EmptyParam,EmptyParam,
                                   EmptyParam,EmptyParam,EmptyParam,EmptyParam,
                                   EmptyParam,EmptyParam,EmptyParam,EmptyParam,
                                   EmptyParam,EmptyParam,0);
  ExcelWorkbook1.ConnectTo(ExcelApplication1.Workbooks.Item['Import.xls']);
  ExcelWorksheet1.ConnectTo(ExcelWorkbook1.Sheets.Item['import'] as _WorkSheet);
  Cellrange:=ExcelWorksheet1.Cells;
    while VarToStr(Cellrange.Item[i,2])<> '' do
    begin
    dxMemData1.Insert;
    dxMemData1Montagefirma.Value:=VarToStr(Cellrange.Item[i,2]);
    dxMemData1Monteur.Value:=VarToStr(Cellrange.Item[i,3]);
    dxMemData1Installdatum.Value:=VarToDateTime(Cellrange.Item[i,4]);
    dxMemData1Installzeit.Value:=VarToStr(Cellrange.Item[i,5]);
    dxMemData1Teilnehmernummer.AsString:=VarToStr(Cellrange.Item[i,6]);
    dxMemData1Internenummer.Value:=VarToStr(Cellrange.Item[i,7]);
    dxMemData1Auftragsnummer.AsString:=VarToStr(Cellrange.Item[i,8]);
    dxMemData1Vorname.Value:=VarToStr(Cellrange.Item[i,9]);
    dxMemData1Nachname.Value:=VarToStr(Cellrange.Item[i,10]);
    dxMemData1Plz.AsString:=VarToStr(Cellrange.Item[i,11]);
    dxMemData1Ort.Value:=VarToStr(Cellrange.Item[i,12]);
    dxMemData1Strasse.Value:=VarToStr(Cellrange.Item[i,13]);
    dxMemData1Siege.Value:=VarToStr(Cellrange.Item[i,14]);
    dxMemData1HausNr.Value:=VarToStr(Cellrange.Item[i,15]);
    dxMemData1TuerNr.Value:=VarToStr(Cellrange.Item[i,16]);
    dxMemData1.Append;
    inc(i);
    end;
end;
aber irgendwie funktioniert das mit dem File Ende nicht, der arbeitet weiter obwohl ich mit
Delphi-Quellcode:
while VarToStr(Cellrange.Item[i,2])<> '' do
abfrage ob sich noch ein string zum verarbeiten im XLS Sheet befindet.

Kann ich das Fileende irgendwie anders ermitteln ? :gruebel:
Das einlesen funktioniert, nur das mit dem Fileende irgendwie nicht. :wall:

Ich bedanke mich im Voraus für eure Hilfe .
Lg
Bundy

[edit=MrSpock]Code war zu breit. Mfg, MrSpock[/edit]

mkinzler 10. Jul 2007 10:15

Re: Wann ist das Dateiende erreicht ? (xls file einlesen)
 
Delphi-Quellcode:
ExcelWorksheet1.Rows.Count

marabu 10. Jul 2007 16:19

Re: Wann ist das Dateiende erreicht ? (xls file einlesen)
 
Hallo Bundy,

meistens werden gar nicht alle Zeilen oder Spalten eines Excel Sheets genutzt - dann kann man die letzte genutzte Zelle ermitteln:

Delphi-Quellcode:
var
  iRow: Integer;
  LastCell: ExcelRange;
begin
  LastCell := Sheet.Cells.SpecialCells(xlCellTypeLastCell, EmptyParam);
  for iRow := 1 to LastCell.Row do
  begin
    // ...
  end;
end;
Grüße vom marabu

Chemiker 10. Jul 2007 16:46

Re: Wann ist das Dateiende erreicht ? (xls file einlesen)
 
Hallo bundy, mkinzler,

Rows.Count gibt die letzte Zeile überhaupt an. Dies kann man machen, aber das Ergebnis wird 65536 sein, also die letzte Zeile von Excel.

Es gibt 2 Möglichkeiten, entweder man geht zur letzten Zeile und geht von da aus nach oben und prüft immer ob die Zeile leer ist. Vorteil dabei ist, dass man auf jeden Fall die letzte Zeile findet. Nachtteil es dauert sehr lange.
Die andere Möglichkeit ist von oben zu zählen wie viel Zeilen die jeweilige Spalte hat. Vorteil dabei ist das es schneller geht, je nach dem wie viele Zeilen mit Werten gefüllt sind.
Nachteil dabei ist das alle Zellen mit Werten gefüllt sein müssen.

Delphi-Quellcode:
ZellenInhalt:= ExcelWorksheet1.cells[Zeile, Spalte].value; // Zelleninhalt auslesen.

If ZellenInhalt=’’ then // die Zelle ist leer, dann sollte auch die Prüfung funktioieren.
Den ZellenInhalt als String einlesen und erst anschließend konvertieren.

Bis bald Chemiker


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