Delphi-PRAXiS
Seite 3 von 4     123 4      

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)

ThoPos 5. Feb 2009 19:58

Re: Zugriff auf MS Excel
 
Zitat:

Zitat von globetrotter77
b) ..., aber auf keinen Fall aus Delphi wieder Excel aufrufen ... das ist vergleichbar damit, sich am eigenen Schopf aus dem Sumpf zu ziehen.

Hallo Globetrotter,

das verstehe ich nicht. Wenn ich aus Excel heraus mein Programm starte und per GetOLEObjekt die Steuerung von Excel übernehme und anschließend Excel wieder freigebe, so ist doch alles in Ordnung? Ich kann doch auch, wenn ich mit dem Auto unterwegs bin, einen ortskundigen Passanten für mich durch die Stadt fahren lassen, und anschließend wieder selber weiterfahren; nur das anschließend der Passant an einem anderen Ort ist. So wie meine Excel-Mappe geändert ist.

Gruß
Thomas

Chemiker 5. Feb 2009 20:16

Re: Zugriff auf MS Excel
 
Hallo ThoPos,

Zitat:

Zitat von ThoPos
Ich kann doch auch, wenn ich mit dem Auto unterwegs bin, einen ortskundigen Passanten für mich durch die Stadt fahren lassen, und anschließend wieder selber weiterfahren; nur das anschließend der Passant an einem anderen Ort ist. So wie meine Excel-Mappe geändert ist.

Klar geht alles, aber was machst Du, wenn der Passant einfach nach Hause fährt. Excel wird geschlossen.


Bis bald Chemiker

ThoPos 6. Feb 2009 04:54

Re: Zugriff auf MS Excel
 
Na ja ...

solche und ähnliche Risiken bleiben immer.

Beim dem von euch immer wieder angesprochenen Datenaustausch per Datei kann es auch vorkommen, daß das eine Programm noch am schreiben ist, während das andere schon mit dem einlesen beginnt. Hier muß man sich - wie ich leider aus meiner Praxis schon erfahren mußte - einen Mechanismus ausdenken, der sicherstellt, daß die Datei auch wirklich zuende geschrieben wurde, bevor das zweite Programm anfängt zu lesen. Und Windows täuscht, insbesondere beim Speichern auf Netzwerklaufwerken, ein "fertig gespeichert" vor, obwohl ein Teil der Datei noch im Schreibpuffer von Windows ruht.

Genauso muß ich mir bei OLE eine entsprechende Sicherheit programmieren.

Aber zurück zu meiner ursprünglichen Frage: Kann mir einer das Beispiel von MS in C ein Beispiel in Delphi übersetzen oder einen anderen Weg nennen, wie ich an die richtige Instanz von Excel komme?

Gruß aus Köln
Thomas

Yheeky 6. Feb 2009 10:40

Re: Zugriff auf MS Excel
 
Weiss jetzt nicht, ob ich dein Problem genau verstanden habe:
Du liest Daten mit deiner Steuersoftware ein (d.h. die Daten sind in deinem Programm). Dann willst du diese Daten in eine Exceldatei packen, welche danach noch mit Formeln angepasst werden müssen. Und die Ergebnisse kommen dann in eine Datenbank...?

Richtig so?
Also ich kann dir nur raten: WENN du einen Export nach Excel umsetzen willst, dann beschäftige dich mit dem Format an sich. Ich würde mich nicht auf irgendwelche Schnittstellen verlassen, das ist immer unsicher. Gehe mal von einem Windows-/Office Update aus, was irgendwas an der Schnittstelle ändert und schon funktioniert dein Programm nicht mehr.

Hoffe ich hab dich richtig verstanden.

ThoPos 6. Feb 2009 11:31

Re: Zugriff auf MS Excel
 
Hallo Christian,

du hast mich leider nicht richtig verstanden. Die Steuersoftware ist vom Gerätehersteller und exportiert von sich aus per OLE nach Excel. Daran läßt sich nichts ändern. Die anschließenden Berechnungen in Excel erfolgen entweder mit AddIns des Gerätehersteller oder manuell. Ich will nur weitere Daten aus einer Oracle-DB abholen und in die Tabelle schreiben bzw. die endgültigen Daten aus Excel nach Oracle schreiben und ggf. Daten an den Auftraggeber senden.

Gruß
Thomas

p80286 6. Feb 2009 14:43

Re: Zugriff auf MS Excel
 
Hallo Thopos,

ein paar Tage keine Zeit gehabt und schon ist der Teufel los.
Bei Deiner Beschreibung des Text-Datenformates fiel mir ASCII-Delimited, auf Microsoftisch CSV ein.
Und das ist von Excel recht einfach zu bearbeiten (lesen).

Allerdings sehe ich keinen Grund von meinem Vorschlag abzurücken.
1) alle Addins werden in den Schritten a und b genutzt. -> kein Bedarf etwas über sie zu wissen.
2) Das Delphiprogramm bekommt die von 1) erstellten Daten (in welchem Format auch immer), die Schritte c,d,e ausführt.
3) der Qualitätsteil läuft ab.
Zitat:

F: Der Anwender: QS-Dokumentation.
1. Formatieren der Tabelle für den Andruck
2. Andruck der Excel-Tabellen mit allen Meß- und DB-Daten.
3. Unterschreiben und archiveren der Andrucke.
1. Formatieren der Tabelle für den Andruck Was auch immer das heißt(allein damit kann man für ein Leben Aufträge generieren)
2. Andruck der Excel-Tabellen mit allen Meß- und DB-Daten. Also irgendwo gibt es eine (Excel-)Datei mit allen Daten
3. Unterschreiben und archiveren der Andrucke. "das fertige Produkt"

Bei diesen Schritten sehe ich nirgendwo die Notwendigkeit von excel, abgesehen von der Erstellung der "Entproduktdatei", für die ich nebenbei bemerkt ein Text-Format (CSV) zwecks späterer Lesbarkeit, bevorzugen würde.

So wie Du es dargestellt hast, werden diese Arbeitsschritte z.Zt. vom Anwender durchgeführt (Bentzer an der Tastatur). Könnte man diesen vllt. davon überzeugen ein komfortableres und schnelleres und ..... Programm zu nutzen?
Vielleicht noch eine Fehlerprüfung / Vollständigkeitsprüfung als Gimmik obendrauf?

Ansonsten kann ich mich nur allen Ausführungen von globetrotter77 und chemiker anschließen.

Gruß K-H

globetrotter77 6. Feb 2009 20:28

Re: Zugriff auf MS Excel
 
Zitat:

Zitat von ThoPos
Zitat:

Zitat von globetrotter77
b) ..., aber auf keinen Fall aus Delphi wieder Excel aufrufen ... das ist vergleichbar damit, sich am eigenen Schopf aus dem Sumpf zu ziehen.

Hallo Globetrotter,

das verstehe ich nicht. Wenn ich aus Excel heraus mein Programm starte und per GetOLEObjekt die Steuerung von Excel übernehme und anschließend Excel wieder freigebe, so ist doch alles in Ordnung? Ich kann doch auch, wenn ich mit dem Auto unterwegs bin, einen ortskundigen Passanten für mich durch die Stadt fahren lassen, und anschließend wieder selber weiterfahren; nur das anschließend der Passant an einem anderen Ort ist. So wie meine Excel-Mappe geändert ist.

Gruß
Thomas

Das sagt sich so leicht, und es kann auch gut sein, dass ich selber einfach ein paar Sachen falsch mache damit, aber irgendwie hatte ich mit solchen Konstrukten bisher IMMER meine Schwierigkeiten.
Sogar dann, wenn ich in einer etwas längeren Schleife neue Excel-Dateien erstellen wollte, konnte es (musste aber nicht!?) passieren, dass beim Aufruf einer neuen Instanz von Excel (durch einen anderen Benutzer ... meist den ungeduldigen Anwender) irgendjemand oder irgendetwas durcheinander kam. Meistens waren das die üblichen Verdächtigen aus Redmond, die sich ausnahmsweise selber aufhängten.

Die schöne neue Welt, in der jeder mit jedem Auto rumgurken kann, erweist sich meiner Meinung nach nur allzu oft als ne einzige Schlittenfahrt auf ner riesigen Eisfläche.

In deinem Fall würde ich vermutlich eher die Methode des Staffellaufs bevorzugen, wenn es sich nicht ohnehin als sinnvoll erweist, alles in Excel abzuhandeln. (nun ja ... sinnvoll ist vielleicht der falsche Ausdruck bei Excel)
Also Kommando an Delphi komplett übergeben, sobald alle Add-Ins abgearbeitet sind,
und die restlichen Formatierungsarbeiten sowie Ausdruck etc. von Delphi erledigen lassen. Dann beißen sie sich zumindest nicht gegenseitig.

sputnic 12. Feb 2009 16:07

Re: Zugriff auf MS Excel
 
Hallo ThoPos,

ich möchte mal auf deine Ausgangsfrage:

Zitat:

Aber wie kann ich die korrekte Instanz von Excel identifizieren und als Object einbinden?
Excel speichert die offenen Instanzen in der RunningObjectTable, diese kannst Du abfragen. Ich habe dazu folgenden Code gefunden:

Delphi-Quellcode:
uses ComObj, ActiveX, Excel2000
var
  ROT: IRunningObjectTable;
  Enum: IEnumMoniker;
  Fetched: integer;
  RunningObj: IMoniker;
  Name: PWideChar;
  BindCtx: IBindCtx;
begin
  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);
      Memo1.Lines.Append(Name);
      Enum.Next(1, RunningObj, @Fetched);
    end;
  end;
Damit erhälst Du schon mal die Namen der offenen Arbeitsmappen. Über den Namen kannst du dann auf die Instanz zugreifen. Was Du erhälst ist dann ein Workbook Interface. Das könnte dann ungefähr so aussehen:

Delphi-Quellcode:
var
    WB: _WorkBook;
begin
    ....
      if Name = 'Mappe2' then
      begin
        ROT.GetObject(RunningObj, App);
        App.QueryInterface(_WorkBook, WB);
        if assigned(WB) then
        begin
          ShowMessage('Done');
          WB.Application.Quit;
        end;
      end;
    ....
end;
Ich hoffe, Du kannst was damit anfangen.

Grüße
Volker

ThoPos 12. Feb 2009 18:49

Re: Zugriff auf MS Excel
 
Hallo Volker,

vielen Dank schon mal für den Tipp.

Die obere Routine funktioniert prima und ich sehe auch die gewünschte Mappe.

In der unteren Routine habe ich aber das Problem mit der Variablen App. Was für ein Typ ist diese?
Denn ich erhalte immer eine Exception.

Gruß aus Köln
Thomas

mkinzler 12. Feb 2009 18:51

Re: Zugriff auf MS Excel
 
Müsste TExcelApplication sein


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:26 Uhr.
Seite 3 von 4     123 4      

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