Delphi-PRAXiS
Seite 4 von 4   « Erste     234   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Zugriff auf MS Excel (https://www.delphipraxis.net/123829-zugriff-auf-ms-excel.html)

stoxx 12. Feb 2009 18:20

Re: Zugriff auf MS Excel
 
Zitat:

Leider findet mein Delphi 2007 die TExcel...-Komponenten nicht. Und meine Versuche diese als Typenbibliotheken zu importieren scheiterten kläglich, da immer irgendwelche Sachen fehlen.
da ich das heute auch hatte, kann ich Dir sagen, dass alle fehlenden Sachen da sind, nachdem Du zusätzlich zu der Excel_TLB, auch die Office_TLB erstellt hast.
Wenn die Pfade stimmen, sollte auch alles gehen.
(Ansonsten mal schnell die TLB's in Dein Projektverzeichnis kopieren)

ich hoffe, Du programmierst nicht völlig blind ohne IDE unterstützung mit den komischen OLEVariants :shock:

ThoPos 12. Feb 2009 18:50

Re: Zugriff auf MS Excel
 
Hallo Allerseits,

der Tipp von Sputnic hat mir den Weg zur Lösung freigeräumt :dancer: :

Delphi-Quellcode:
Uses
  ComObj, ActiveX, UrlMon;

procedure TForm1.Button1Click(Sender: TObject);
var
  BindCtx    : IBindCtx;
  Mk         : IMoniker;
  chEaten    : ULONG;
  DmyObj     : IUnknown;
  wb         : OleVariant;
  xl         : OleVariant;
  ws         : OLEVariant;
begin
  OleCheck(CreateBindCtx(0, BindCtx));
  OleCheck(MkParseDisplayNameEx(BindCtx, PWideChar(WideString(_Mappe)), chEaten, Mk));
  OleCheck(Mk.BindToObject(BindCtx, nil, IUnknown, DmyObj));
  wb := DmyObj as IDispatch;
  xl := wb.Application;
  ws := xl.workbooks[_Mappe].WorkSheets[_Tabelle];
  ws.range[_Zelle] := _Inhalt;
  ws := unassigned;
  wb := unassigned;
  xl := unassigned;
end;
Die vier Variablen haben folgenden Inhalt:
_Mappe -> FullName der Arbeitsmappe, z.B. 'D:\Temp\Mappe1.xls'
_Tabelle -> Name der Tabelle in der Arbeitsmappe, z.B. 'Tabelle1'
_Zelle -> Name oder Koordinaten der Zelle, z.B. 'A1' oder 'MeineZelle'
_Inhalt -> der in die Zelle zu schreibende Text

Gruß aus Köln
Thomas

stoxx 13. Feb 2009 14:58

Re: Zugriff auf MS Excel
 
also ich hab da mal gebastelt. Schick, Schick !
Die Lösung gefällt mir besser, als GetActiveOLEObject :-)

Delphi-Quellcode:
unit

  ComObj,
  ActiveX,

  ExcelXP;

  // oder nach Belieben

  // Excel2000;
  // Excel_TLB;

procedure TForm1.Button1Click(Sender : TObject);
var

    eApp : ExcelApplication;

begin

  eapp := SearchExcelAppFromWorkBook('Mappe1');
  eApp.Quit; // Mappe beenden
  eApp := nil; // Excel Instanz beenden


  eapp := SearchExcelAppFromWorkBook(FFileName);
  if not assigned(eapp) then
    eApp := CoExcelApplication.Create;
 


end;

Delphi-Quellcode:
//==============================================================================
// sucht zu einem Workbook (FileName) die passende Excel Application, wenn mehrere
// Instanzen von Excel offen sind
//==============================================================================

function SearchExcelAppFromWorkBook(const aWorkBookName : string) : ExcelApplication;
var
  ROT: IRunningObjectTable;
  Enum: IEnumMoniker;
  Fetched: integer;
  RunningObj: IMoniker;
  Name: PWideChar;
  BindCtx: IBindCtx;
  App : IInterface;

  wb : _WorkBook;

begin
  result := nil;

  try
      OleCheck(CreateBindCtx(0, BindCtx));
      OleCheck(GetRunningObjectTable(0, ROT));
      if ROT.EnumRunning(Enum) = S_OK then
      begin
        Enum.Next(1, RunningObj, @Fetched);
        while RunningObj <> nil do
        begin
          RunningObj.GetDisplayName(BindCtx, nil, Name);

          // ShowMessage('RunningObj.GetDisplayName: ' + Name);

          if Name = aWorkBookName then begin
              ROT.GetObject(RunningObj, app );
              App.QueryInterface(_WorkBook, WB);
              if assigned(WB) then begin
                  // ShowMessage('Gefunden: ' + aWorkBookName);
                  wb.Application.QueryInterface(_Application, result);
                  exit;
               end;
          end;

          Enum.Next(1, RunningObj, @Fetched);
        end;
      end;
  except
      result := nil;
  end;

end; //  SearchExcelAppFromWorkBook

stoxx 13. Feb 2009 16:29

Re: Zugriff auf MS Excel
 
könnte man eigentlich in die Codelib stellen :-)

ThoPos 14. Feb 2009 05:52

Re: Zugriff auf MS Excel und MS Word
 
Hallo,

nach dem ich es endlich geschaft habe, wollte ich die Routine so abändern, daß ich alle geöffneten Word-Dokumente finde. Problematisch sind dabei neue Dokumente auf Basis einer Vorlage, welche noch nicht gespeichert sind. Hier steht in der ROT nur der FullName der Vorlage, aber nicht der von Word vergebene Name, z.B. "MeineVorlage1".

Also dachte ich mir, ich gehe die Word-Instanzen in einer Schleife als OLEVariant in der Variable "App" durch und lese dann die Documents[..] aus :

Delphi-Quellcode:
function LeseWordDokumente(App: OLEVariant): TStringList;
var
  i    : Integer;
  Datei : OLEVariant;
begin
  Result := TStringList.Create;
  if UpperCase(App.Name) = 'MICROSOFT WORD' then
  begin
  for j := 1 to App.Documents.Count; do
  begin
    Datei := App.Documents[j];  // <-- hier tritt der Fehler auf !!!!
    SL.Add(Datei.FullName);
  end;
end;
Aber, warum kann ich die Dokumente nicht, analog VBA, mit App.Documents[j] ansprechen? Ich erhalte immer eine Exception.
Bei Excel funktioniert App.Workbooks[j] einwandfrei.

Gruß aus Köln
Thomas

ThoPos 14. Feb 2009 10:21

Re: Zugriff auf MS Excel und MS Word
 
Hallo,

hab's gefunden:

Delphi-Quellcode:
function LeseWordDokumente(App: OLEVariant): TStringList;
var
  i    : Integer;
  Datei : OLEVariant;
begin
  Result := TStringList.Create;
  if UpperCase(App.Name) = 'MICROSOFT WORD' then
  begin
  for j := 1 to App.Documents.Count; do
  begin
    Datei := App.Documents.Item(j); // Wichtig: Runde Klammern!!!
    SL.Add(Datei.FullName);
  end;
end;
Gruß aus Köln
Thomas

stoxx 14. Feb 2009 11:34

Re: Zugriff auf MS Excel und MS Word
 
nimm doch endlich mal die Interface Klassen und Deklarationen .. aus ExcelXP .. Excel2000 oder der importierten Excel_TLB
Dasselbe für Word.
da lässt es sich gar nicht erst compilieren, und Deine Fehler treten gar nicht auf :-)
frühe Bindung bevorzugen anstatt der späten Bindung ..

ThoPos 14. Feb 2009 18:52

Re: Zugriff auf MS Excel
 
Funktionieren die Interface-Klassen denn auch 100%ig mit allen Versionen von Office 97 bis Office 2007. Von Delphi 6 habe ich noch genau in Erinnerung, daß es Probleme mit den Komponenten gab. Die mit den Komponenten erstellten Programme waren an bestimmte Office-Versionen gebunden. Deshalb bin ich damals auf OLE umgestiegen und war die Versionsprobleme quitt. Und in dem "Gemischtwarenhandel" an Steuerrechner auf der Arbeit habe ich es leider mit allen Versionen seit Office 97 zu tun. Immer die aktuelle Office-Version auf allen Rechner zu haben, ist nicht gerade preiswert ...

stoxx 14. Feb 2009 19:09

Re: Zugriff auf MS Excel
 
also ich meinte nicht die Komponenten mit dem " T " davor. sondern die reinen Interfacedeklarationen.
bei der TLB werden die ja auch automatisch generiert.
(geht ja bei jedem OLE Interface)

und das ist zu Deinem Vorgehen genau dasselbe, einmal greifst Du auf die Interfaces mit OLEVariant zu, oder eben mit "typisierten" Interfaces .. wie z.b. _Workbook;


Wenn Du neue Features von Office2007 aufrufst ( wie z.b. ExportAsFixedFormat)
Und nur ein Office 97 installiert ist, passiert es Dir in beiden Varianten, dass das Interface eine Exception wirft.
(denke ich mir mal :-)


Der Unterschied ist nur, dass bei Deiner Variante aufwändig zur Laufzeit anhand des Quelltextes alle Interfacefunktionen erst in der Registry gesucht werden, bevor sie aufgerufen werden können.

Bei der frühen Bindung fällt das weg, und man sagt, es wäre schneller :-)

... wenn ich richtig informiert bin :-)

außerdem macht das Programmieren in Deiner Variante keinen Spaß :-)
Wenn Du also mit einer Office97_TLB arbeitest, dann funktionieren die auch noch auf Office2007 ....
natürlich nicht mit allen Funktionen ...


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:15 Uhr.
Seite 4 von 4   « Erste     234   

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