Entwickler-Ecke

Sonstiges (Delphi) - Embedded Word-Dokument in Excel mit Delphi auslesen


jasocul - Mi 06.03.13 15:39
Titel: Embedded Word-Dokument in Excel mit Delphi auslesen
Ich habe gerade ein Brett vor dem Kopf. Vermutlich zuviel von der ungewohnten Sonne eingebrannt. :)

Ich habe ein Excel-Dokument vorliegen, in dem ein Word-Objekt eingebettet ist.
Nun möchte ich gerne an den Inhalt des Word-Objektes.
Inzwischen habe ich soviel versucht, dass ich mich irgendwie verrannt habe.
Mein letzter Ansatz (Ich arbeite mit late binding):

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
  var
    WordDoc : Variant;
  begin
    WordDoc := ExcelApp.ActiveSheet.OLEObjects('Objekt XY');
    Result := WordDoc.Content.Text;
  end;

In dieser Variante erzählt er mir zur Laufzeit, dass er Content nicht kennt.

Die auskommentierten Fehlversuche habe ich rausgeschmissen.
Vermutlich sehe ich einfach den Wald vor lauter Bäumen inzwischen nicht mehr. Das kann doch nicht so kompliziert sein :motz:


jasocul - Fr 08.03.13 08:27

Hat wirklich keiner eine Idee?
Ich habe mal ein Beispiel in den Anhang gepackt


Delete - Fr 08.03.13 14:38

Hab eben mal kurz in den alten Postings von borland.public.delphi.oleautomation gestöbert und herausgefunden, daß es zwischen 2003 und 2008 etliche Anfragen bezüglich Zugang zu embedded documents gab, von denen keine einzige beantwortet wurde. Das läßt den Schluß zu, daß es schon damals keiner wußte ... und ich hab leider auch keinen blassen Schimmer ...


GuaAck - Fr 08.03.13 19:16

Ich habe eben in VisualBasic für eine EXCEL-Tabelle mit eingebettetem Word-Dokument ein Makro gemacht:

Sub Makro2()
ActiveSheet.OLEObjects(1).Visible = False
WordDoc = ActiveSheet.OLEObjects(1)
End Sub

Ergebnis: "Visible" schaltet richtig mein Word-Doc unsichtbar (bzw. wieder sichtbar, wenn ich True einsetzte.)
Bei der Zuweisung WordDoc = ... erhalte ich aber die Fehlermeldung "Object unterstützt diese Eigenschaft oder Methode nicht."

Idee: ActiveSheet.OLEObjects(1).copy kopiert das Word-Doc in die Zwischenablage.

Vielleicht hilft es ja,

Gruß
GuaAck


Gerd Kayser - Fr 08.03.13 23:47

user profile iconGuaAck hat folgendes geschrieben Zum zitierten Posting springen:
Ich habe eben in VisualBasic für eine EXCEL-Tabelle mit eingebettetem Word-Dokument ein Makro gemacht:

Das wird im vorliegenden Fall aber nichts nützen. Sobald man in Excel das Objekt aktiviert, wechselt innerhalb von Excel die Menüleiste in eine Word-Menüleiste. Man befindet sich dann in Word. Excel-Makros funktionieren hier nicht, sondern nur Word-Makros.

Man kann das leicht austesten: In Excel die Makro-Aufzeichnung starten, die Bearbeitung des Objekts mit einem Doppelklick starten und etwas in dem Dokument machen (z. B. Text selektieren). Danach innerhalb von Excel eine beliebige Zelle selektieren, um die Bearbeitung des Objekts zu beenden. Schaut man sich jetzt das Makro einmal an, wird man feststellen, dass alle Aktionen zur Bearbeitung des Objekts im Makro nicht auftauchen.

Die einzige Möglichkeit, das Ziel zu erreichen, besteht darin, die Excel-Datei als XLSX-Datei abzuspeichern und anschließend die Dateiendung in ZIP abzuändern. Die Worddatei findet man anschließend in der Zip-Datei im Verzeichnis "xl/embeddings".


jasocul - So 10.03.13 18:08

Hmm. Dann betrachte ich das erstmal als erledigt.
Falls ich beim rumtüfteln noch eine Lösung finden sollte, steht die natürlich sofort hier. :wink:

Auf jeden Fall danke ich euch für die Unterstützung.


jasocul - Mo 11.03.13 10:24

So habe die Lösung selbst rausgefunden :mrgreen:

Es ist zwar noch ohne irgendwelche Tests und Sicherheitsabfragen, aber im Prinzip funktioniert es so:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
  function GetObjektData(ObjName : String) : String;
  // Ein Embedded Word-Objekt innerhalb Excel auslesen
  var
    WordDoc : Variant;
    WordApp : Word_TLB._Application;
  begin
    Result := '';
    try
      WordDoc := xlsWS.OLEObjects(ObjName);
      WordDoc.Activate; // Ohne Activate kann im nächsten Schritt die Application nicht zugeordnet werden
      WordApp := IDispatch(WordDoc.Object.Application) as Word_TLB._Application;

      Result := WordApp.ActiveDocument.Content.Text;
    except
    end;
    Result := Trim(Result);
  end;

Das ist nur ein Grundgerüst!
Es können ja auch andere Objekte im Excelsheet enthalten sein, was hier nicht geprüft wird.
Die Variable xlsWS kommt aus der übergeordneten Prozedur und ist vom Typ Variant (Excel-Worksheet).

@Mods:
Habe die letzten Beiträge nicht zusammengefasst, damit der Thread nochmal nach oben kommt. Es gab doch eine Menge Hits und könnte daher für mehrere interessant sein. Zumal es ja wohl sonst noch keine Lösung zu finden gibt.