Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi excel to interbase (https://www.delphipraxis.net/163222-excel-interbase.html)

hirsch 20. Sep 2011 12:09

Datenbank: interbase/excel • Version: 6.0/2007 • Zugriff über: ibconnect

excel to interbase
 
Liebes Forum,
Was ich tun will:
In eine Interbasedatenbank in eine Tabelle, in eine Spalte was reinschreiben, was ich aus Excel 2007(nur 1 sheet) ausgelesen habe.
In interbase lese ich aus einer Tabelle einen String aus, diesen String soll mir Excel finden, die linke Nachbarzelle als Ergebnis zurückbringen.
Wenn ich das Ergebnis habe, kann ich das in die Interbasetabelle zurückschreiben.
Mein Problem:
Ich greife über die OLE auf die Exceltabelle zu.
In Excel habe ich ein Makkro aufgezeichnet das mir den find mitgeplottet hat. I'ch bin aber nicht in der Lage das was ich da sehe in Delphi zu übersetzen.
Makkro: Cells.Find(What:="100300", After:=ActiveCell, LookIn:=xlFormulas, LookAt _
:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _
False, SearchFormat:=False).Activate
Makkro ende
Was macht excel da mit den _ (Underscores)?
Wie bekomme ich die aktuelle Zeile und Spalte des Cursors?

Nun suche ich schon seit 2 Tagen im internet nach etwas, was ich verwerten kann, aber leider ohne Erfolg.
Alle Tutorials beschreiben wie man in Excel schreibt, aber nicht wie man aus Excel liest, wenn man weder Zeile noch Spalte kennt.
Was ich bisher habe:
Delphi-Quellcode:
begin
  //Excel öffnen und Tabelle laden
  Dateiname:='D:\TDB_Artikel_neu\Teileneu.xlsx';
  if FileExists(Dateiname) then begin
     try
        Excel:=CreateOleObject('Excel.Application');
        Excel.Workbooks.Open (Dateiname);
        b_Excel:=True;
        Excel.Visible:=false;
        with Datamodule1 do begin
           CDS.First;
           while not CDS.Eof do begin
              art:=cds.FieldByName('ART_NR').AsString;
              grp:=cds.FieldByName('ART_GR').Asstring;
              val(art,wert,code);
              if wert<>0 then begin
                 schnart:=lese_Artikel(art);
              end;
              cds.Next;
           end;
        end;
     except
       Showmessage('Excel konnte nicht gestartet werden !');
       Excel.visible:=true;
       EXIT;
     end;
  end;
end;
function TForm1.lese_Artikel(art: string):String;
var spalte, zeile : integer;
    XLApp  :OleVariant;
    X, Y, Z: Variant;
begin
  //Zeilenweise auslesen
  excel.Worksheets[1].cells.find(art, MatchCase:=False, SearchFormat:=False).Activate;
  zeile:= Excel.ActiveCell.Row; //<-funktioniert nicht
  //zeile:=excel.cells[zeile];  //<-funktioniert nicht
  //spalte:=excel.cells[spalte]; //<-funktioniert nicht
  spalte := Excel.ActiveCell.Column; //<-funktioniert nicht
  result:=excel.cells[zeile,spalte-1].select;//<-sinnfrei

end;

Union 20. Sep 2011 12:28

AW: excel to interbase
 
Warum verwendest Du nicht ADO für den Zugriff auf Excel? Damit kannst Du lesen und schreiben. Musst Dir nur den richtigen ConnectionString bauen. Und formatier mal bitte Deinen Source.

daywalker9 20. Sep 2011 12:33

AW: excel to interbase
 
Bitte mal die Delphi-Tags drum setzen, dann kann man das auch leichter lesen.

hirsch 20. Sep 2011 12:59

AW: excel to interbase
 
Zitat:

Zitat von Union (Beitrag 1125495)
Warum verwendest Du nicht ADO für den Zugriff auf Excel? Damit kannst Du lesen und schreiben. Musst Dir nur den richtigen ConnectionString bauen. Und formatier mal bitte Deinen Source.

Was braucht man für ADO?

Zitat:

Zitat von daywalker9 (Beitrag 1125498)
Bitte mal die Delphi-Tags drum setzen, dann kann man das auch leichter lesen.

.. erledigt.
War keine Absicht, ich konnte es auch nicht richtig lesen.....

Union 20. Sep 2011 15:05

AW: excel to interbase
 
Zitat:

Zitat von hirsch (Beitrag 1125514)
Was braucht man für ADO?

Wenn Du ein halbwegs aktuelles Windows hast und Excel darauf installiert, brauchst Du Computerseitig nix. Du bist allerdings nicht der Erste der dieses Poblem hat Hier im Forum suchenADO Excel

Jumpy 21. Sep 2011 07:53

AW: excel to interbase
 
Zu deiner bisherigen Variante:
cells.find liefert ein Range Objekt zurück, davon liefert .Offset(0,-1) wieder ein Range-Objekt, nämlich das mit der Zelle links daneben zurück und .Value liefert deren Wert:

Code:
function TForm1.lese_Artikel(art: string):String;
begin
  result:=excel.Worksheets[1].cells.find(art, MatchCase:=False, SearchFormat:=False).Offset(0,-1).Value
end;
Das ist aber nur Q+D. Findet Find nichts, liefert es Nothing/nil zurück und dann knallt der Rest. Sauber wäre also eine variable (z.B. rg) für das Range-Objekt zu erstellen. .Find anwenden. Wenn rg nicht nil, dann weiter machen mit .Offset usw.

Bernhard Geyer 21. Sep 2011 07:59

AW: excel to interbase
 
Zitat:

Zitat von Union (Beitrag 1125495)
Warum verwendest Du nicht ADO für den Zugriff auf Excel? Damit kannst Du lesen und schreiben. Musst Dir nur den richtigen ConnectionString bauen. Und formatier mal bitte Deinen Source.

Die Probleme mit Formeln, Datentypen, ... sind bei direkten Zugriff geringer als wenn man über ADO geht.
Und wenn man mit Ranges arbeitet gehts auch ziemlich fix.

hirsch 22. Sep 2011 12:42

AW: excel to interbase
 
Vielen Dank für Eure Ideen,
weil sich Excel so umständlich anstellt, habe ich die Tabelle in eine CSV exportiert. Diese lese ich nun in ein TStringGrid ein, da alles nur Text ist.
Excel und co habe ich zwar installiert, aber mit dem ADO-Zugriff habe ich noch nie etwas gemacht.
Ich werde mir das mal ansehen, wenn die Zeit nicht mehr so brennt. Denn ich denke asi ist bestimmt ein Faß, das sich da auf tut.


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:21 Uhr.

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