Laden...

Word Dokument öffnen und auf Inhalt zugreifen in C#-Anwendung

Erstellt von DerSchnapper vor 18 Jahren Letzter Beitrag vor 17 Jahren 17.093 Views
D
DerSchnapper Themenstarter:in
45 Beiträge seit 2006
vor 18 Jahren
Word Dokument öffnen und auf Inhalt zugreifen in C#-Anwendung

Hallo,

nachdem ich alle Beiträge des Suchbegrifft "Word" und "C#" durchkämmt hab, bin ich leider noch nicht wirklich weiter gekommen, weil ihr scheinbar alle schon ein paar Schritte weiter seid wie ich.

Bitte bitte geb mir mal jemand eine Schritt-für-Schritt-Einführung!
Ich habe ein kleines Programm, meinetwegen eine Konsolenanwendung (ich nutze VStudio .NET 2003).

Darin möchte ich ein Word-Dokument öffnen, sagen wir mal, Pfad und Dateiname statisch im Code gegeben.
Dann will ich einen String in dem Word-Dokument suchen.
Dann das Dokument wieder schließen.

Ich weiß nicht einmal, wie ich ein Word-Dokument öffnen kann! Die MSDN lässt mich ein bisschen im Regen stehen. Da steht lediglich als Code-Beispiel:

// C#
object missingValue = Type.Missing;
object fileName = "C:\Test\MyNewDocument.doc";
ThisApplication.Documents.Open(ref fileName, ref missingValue,
ref missingValue, ref missingValue, ref missingValue,
ref missingValue, ref missingValue, ref missingValue,
ref missingValue, ref missingValue, ref missingValue,
ref missingValue, ref missingValue, ref missingValue,
ref missingValue, ref missingValue);

Schön, was bringt mir die Weisheit? Der Code funktioniert bei mir natürlich nicht. Ich weiß nicht einmal, welche Verweise ich zum Projekt setzen muss, damit das kompiliert werden kann! Bitte bitte sagt mir mal schlüssig und Anfängertauglich, was ich tun muss, um genanntes Vorhaben umzusetzen!

Vielen vielen Dank!

MfG
Der Schnapper

S
1.047 Beiträge seit 2005
vor 18 Jahren

dann hast du aber sehr schlecht gesucht 😉

stichwort office-interop, vernsteuerung von word usw.

was du brauchst sind die interop-dateien von office
je nachdem was du für eine version benutzt, bzw. unterstützen möchtest, mußt du dir diese besorgen und drauf referenzieren

bei microsoft gibts die interop dateien für office xp und 2003 zum download, einfach mal danach suchen

die interop dateien sind aufwärtskompatibel, d.h. mit den xp interops kannst du auch 2003 fernsteuern, allerdings fehlen dir neue methoden und objekte eventuell

ist halt abhängig davon was genau du machen willst

wenn du die interop dateien hast, bindest du diese ein überreferenz hinzufügen und wählst dann die jeweilige dll aus
falls du office 2003 hast, kannst du bei der installation angeben er soll die interopdateien mit installieren
einfach benutzerdefiniert auswählen und dort .net unterstützung anklicken
das geht aber nur wenn vorher .net installiert ist, da er die assemblies in den gac installiert

beim hinzufügen als referenz mußt du dann allerdings das tab com-objekte auswählen und dort z.b. microsoft word object library auswählen

wenn du alle referenzen hinzugefügt hast kommen wir zum eigentlichen code

hier mal ein kleines bsp:

using System;
using System.Runtime.InteropServices;

using Word = Microsoft.Office.Interop.Word;

class Program {
    static void Main(string[] args) {

        Word.Application oWord = null;
        Word.Documents oDocs = null;
        Word.Document oDoc = null;
        Word.Selection oSelection = null;

        try {
            oWord = (Word.Application)Marshal.GetActiveObject("Word.Application");
        } catch {        
        }

        if (oWord == null) {
            oWord = new Word.Application();
        }

        if (oWord != null) {
            oWord.Visible = true;
            oDocs = oWord.Documents;
            object oMissing = System.Type.Missing;
            oDoc = oWord.Documents.Add(ref oMissing, ref oMissing, ref oMissing, ref oMissing);
            oDoc.Activate();
            oSelection = oWord.Selection;
            oSelection.TypeText("Hello Word =)");
            Marshal.ReleaseComObject(oDoc);
            Marshal.ReleaseComObject(oDocs);
            Marshal.ReleaseComObject(oSelection);
            Marshal.ReleaseComObject(oWord);
        }
    }
}

im namespace Microsoft.Office.Interop.Word liegen alle Objekte die mit Word was zu tun haben, also z.B. Documents, Document, Bookmark usw.
allgemeine objekte die in office sind liegen im Microsoft.Office.Interop namespace afaik.

oWord = new Word.Application();
öffnet dir ein word bzw. erzeug t eine wordinstanz, mit der du dann arbeiten kannst
das objekt entspricht dem application object vom vba

wenn du vba mit office gemacht hast, wirst du sehen das alles analog übermnommen werden kann
nur das drumherum, deklarieren udn aufräumen, is halt bissl anders

naja derest is vielleicht selbst erklärend, ansonten frag ruhig =)

D
DerSchnapper Themenstarter:in
45 Beiträge seit 2006
vor 18 Jahren

Ok, das ist mal ne Aussage, mit der ich arbeiten kann, danke! Vielen Dank!

Ich versuch mich mal dran, und dann melde ich mich wieder, wenn ich zu blöd bin 😉

MfG
Der Schnapper

C
38 Beiträge seit 2005
vor 17 Jahren

Moin Moin!

ich habe noch eine Frage zu dem Thema Microsoft.Office.Interop.Word.dll.
Weiß jemand, ob es bei der Verwendung des Novell Application Launcher zu Problemen kommen kann?

3.728 Beiträge seit 2005
vor 17 Jahren
Nal

Der Novell Application Launcher ist ein System zur automatischen Softwareverteilung im Netzwerk (Vergleichbar mit den Softwareverteilungsfunktionen von Active Directory). Der sorgt nur dafür, dass bestimmte Programme mit bestimmter Konfiguration auf bestimmten Clients eingerichtet werden. Wenn das verteilte MSI-Paket in Ordnung ist, sollte es keine Probleme geben.

C
38 Beiträge seit 2005
vor 17 Jahren

Moin zusammen!

ist zwar schon länger her, aber habe immer noch Probleme beim Verwenden von Word. Allerdings nur auf bestimmten Systemen.

Mein Code sieht folgendermaßen aus:

Microsoft.Office.Interop.Word.ApplicationClass word;
Microsoft.Office.Interop.Word.Document document = null;
word = new ApplicationClass ();

Danch läßt sich auf die Properties word.Version und word.Path zugreifen. Ein Objekt wurde alo erstellt und Word anscheinend auch erkannt. Beim Aufruf von word.Documents.Open kommt allerdings auf einem System eine Fehlermeldung:

Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.

Die Version der Interop-DLL ist 10.*, der Fehler tritt mit Word 9.0 auf.

Könnte es daran liegen?

Würde mich sehr freuen, wenn ihr mir helfen könntet, weil ich nun schon Wochen an diesem Problem hänge.

3.728 Beiträge seit 2005
vor 17 Jahren
Office Versionen

Du versuchst Automatisierungscode, der für Office XP (Version 10) geschrieben wurde mit Office 2000 (Version 9) zu verwenden. Das geht so nicht. Entweder baust Du eine separate Version, die auf Office 2000 abgestimmt ist, oder Du verwendest keine Interop-Assemblies, sondern machst alles per Reflection über späte Bindung. Hier kannst Du Dir ansehen, wie sowas gemacht wird: Word zu HTML Konverter

Oder Du sorgst dafür, dass auf allen Rechnern Office XP ausgerollt ist.

C
38 Beiträge seit 2005
vor 17 Jahren

Danke für die schnelle Antwort!!

HTML ist leider keine Alternative.
Und für Office 2000 habe ich noch keine Interop-Assemblies gefunden. Gibts dafür überhaupt welche?

3.728 Beiträge seit 2005
vor 17 Jahren
Word Automatisierung mit Reflection

Ich habe auch nix von HTML gesagt, sondern wollte nur, dass Du Dir den Code dieses Beispiels anschaust. Dieses Beispiel steuert Word (Egal ob 2000, XP oder 2003) ganz ohne Interop-Assemblies. Die Tatsache, dass Word-Dateien in HTML ausgegeben werden ist dafür unwesentlich.

Infos über PIAs und Office COM-Automatisierung stehen in unserer Office FAQ: Office (Word, Excel, Outlook, ...) in eigenen Anwendungen verwenden