AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Zugriff auf MS Excel

Ein Thema von ThoPos · begonnen am 9. Nov 2008 · letzter Beitrag vom 14. Feb 2009
Antwort Antwort
Seite 4 von 4   « Erste     234   
Benutzerbild von stoxx
stoxx

Registriert seit: 13. Aug 2003
1.111 Beiträge
 
#31

Re: Zugriff auf MS Excel

  Alt 12. Feb 2009, 18:20
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
Phantasie ist etwas, was sich manche Leute gar nicht vorstellen können.
  Mit Zitat antworten Zitat
ThoPos

Registriert seit: 30. Jun 2004
Ort: Köln
69 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#32

Re: Zugriff auf MS Excel

  Alt 12. Feb 2009, 18:50
Hallo Allerseits,

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

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
Thomas
  Mit Zitat antworten Zitat
Benutzerbild von stoxx
stoxx

Registriert seit: 13. Aug 2003
1.111 Beiträge
 
#33

Re: Zugriff auf MS Excel

  Alt 13. Feb 2009, 14:58
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
Phantasie ist etwas, was sich manche Leute gar nicht vorstellen können.
  Mit Zitat antworten Zitat
Benutzerbild von stoxx
stoxx

Registriert seit: 13. Aug 2003
1.111 Beiträge
 
#34

Re: Zugriff auf MS Excel

  Alt 13. Feb 2009, 16:29
könnte man eigentlich in die Codelib stellen
Phantasie ist etwas, was sich manche Leute gar nicht vorstellen können.
  Mit Zitat antworten Zitat
ThoPos

Registriert seit: 30. Jun 2004
Ort: Köln
69 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#35

Re: Zugriff auf MS Excel und MS Word

  Alt 14. Feb 2009, 05:52
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 WORDthen
  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
Thomas
  Mit Zitat antworten Zitat
ThoPos

Registriert seit: 30. Jun 2004
Ort: Köln
69 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#36

Re: Zugriff auf MS Excel und MS Word

  Alt 14. Feb 2009, 10:21
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 WORDthen
  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
Thomas
  Mit Zitat antworten Zitat
Benutzerbild von stoxx
stoxx

Registriert seit: 13. Aug 2003
1.111 Beiträge
 
#37

Re: Zugriff auf MS Excel und MS Word

  Alt 14. Feb 2009, 11:34
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 ..
Phantasie ist etwas, was sich manche Leute gar nicht vorstellen können.
  Mit Zitat antworten Zitat
ThoPos

Registriert seit: 30. Jun 2004
Ort: Köln
69 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#38

Re: Zugriff auf MS Excel

  Alt 14. Feb 2009, 18:52
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 ...
Thomas
  Mit Zitat antworten Zitat
Benutzerbild von stoxx
stoxx

Registriert seit: 13. Aug 2003
1.111 Beiträge
 
#39

Re: Zugriff auf MS Excel

  Alt 14. Feb 2009, 19:09
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 ...
Phantasie ist etwas, was sich manche Leute gar nicht vorstellen können.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 4 von 4   « Erste     234   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:26 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