Autor |
Beitrag |
flyhigh83
      
Beiträge: 67
Win 7
C# (VS2010)
|
Verfasst: Mi 01.12.10 15:48
Hallo,
habe mal eine bescheidene Frage da ich bei MSDN und sonst auch nicht gefunden habe. Warum funktioniert eigentlich der Zugriff auf die Office 2003 Komponenten von Visual Studio 2010 nicht?
Habe dies versucht.
www.tsql.de/csharp/csharp_word_office
Fehlermeldungen
Fehler 2 Der Interoptyp "Microsoft.Office.Interop.Word.ApplicationClass" kann nicht eingebettet werden. Verwenden Sie stattdessen die entsprechende Schnittstelle. C:\Dokumente und Einstellungen\...\FormMain.cs 566 35 TestProjekt
Ich habe auch schon auf der MSDN Seite gelesen das es nur imt Office 2007 und Offcie 2010 funktionieren soll. Nur geht das nicht richtig in meinen Kopf rein. Denn was mache ich wenn ich jetzt das Programm schreibe aber ein User kein Word 2007 oder 2010 hat? Das wäre dann sehr bescheiden.
Gibt es eine andere möglichkeit wie ich Werte von meinem Form in ein Wordvorlage zaubern kann?
Danke im Vorraus
|
|
Ralf Jansen
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Mi 01.12.10 16:53
Die Beschreibung in der MSDN bezieht sich nur auf die VSTO(Visual Studio Tools for Office) Geschichten. Das geht tatsächlich nur mit bestimmten Office Versionen. Was in deinem Link beschrieben wurde sollte mit jedem COM Objekt funktionieren, also auch mit jeder beliebigen Office Version, da dort VSTO nicht benutzt wird sondern selbst erstellte COM Interop Assemblies.
Sieht für mich aber so aus als würdest du die importierten Interop Assembly, wenn du nach der Beschreibung in deinem Link vorgegangen bist, gar nicht verwenden. Denn deine Fehlermeldung bezieht sich auf 'Microsoft.Office.Interop.Word' und das klingt nach den VSTO Klassen und nicht nach den importierten COM Interop Klassen. Bist du beides am mischen?
Für diesen Beitrag haben gedankt: flyhigh83
|
|
flyhigh83 
      
Beiträge: 67
Win 7
C# (VS2010)
|
Verfasst: Do 02.12.10 09:59
[quote="Sieht für mich aber so aus als würdest du die importierten Interop Assembly, wenn du nach der Beschreibung in deinem Link vorgegangen bist, gar nicht verwenden. Denn deine Fehlermeldung bezieht sich auf 'Microsoft.Office.Interop.Word' und das klingt nach den VSTO Klassen und nicht nach den importierten COM Interop Klassen. Bist du beides am mischen?[/quote]
Hm das mit dem mischen könnte sein. Ich schreibe mal kurz alles zusammen
1. ich bin auf den Reiter "COM" und habe dort die Microsoft Word Komponente hinzugefügt. Bei mir ist es die 11er Version
2. Using eingefügt "using Microsoft.Office.Interop.Word;"
3. Erzeugen eines neuen Objektes. "Word.ApplicationClass myWordApp = new Word.ApplicationClass();"
-> Hier erhalte ich genau die Fehlermeldung
"Fehler 2 Der Typ- oder Namespacename "Word" konnte nicht gefunden werden. (Fehlt eine Using-Direktive oder ein Assemblyverweis?)"
Sofern ich das Using weglasse. Ich habe aber kein passendes Using gefunden.
Weil wenn ich mir in Verweise den Namen von meiner COM Komponente anschaue sehe ich genau "Microsoft.Office.Interop.Word"
Gibt es da noch etwas anderes iwe du sagst und welche klassen wären dies beziehungsweise kurze Anleitung wäre hilfreich.
Danke
|
|
flyhigh83 
      
Beiträge: 67
Win 7
C# (VS2010)
|
Verfasst: Do 02.12.10 18:22
Hi,
bin total am verzweifeln ich bin heute ca. 5 Stunden nur am rumprobieren gewesen wo hier eine passende Komponente zu finden ist. Bisher kein Ergebnis.
die Komponente welche ich eingefügt habe heist
"Microsoft Word 11.0 Object Library 8.3 C:\Programme\Microsoft Office\OFFICE11\MSWORD.OLB"
irgend etwas ist hier faul. Weil das was ich dann in den Projektmappenexplorer unter "Verweise" finde ist definitiv nicht diese Datei sondern wie die Vermutung auch schon kam die Office.Interop xxx
Mein Zeil ist es eigentlich nur einer Wordvorlage gewissen Textfeldern (MergedField) gewisse Daten zu übergeben.
Warum baut Mirosoft so einen scheiß das nur die Interop funktionieren und nur mit gewissen Office Versionen. Weil mit der Visual Studio 2008 Version geht mein Programm. Nur habe ich bisher nicht getestet, wenn es kompaliert ist, ob es dann auf einem PC mit Office 2007 auch geht. Und das sollte es da irgendwann mein PC auch mal auf ein neueres Office umgestellt wird. Oder vielleicht Open Office spendiert bekommt. 
|
|
Ralf Jansen
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Fr 03.12.10 11:28
Wie gesagt 'Microsoft.Office.Interop.Word' ist der Namespace der in VSTO für Word benutzt wird. Lass das using darauf und die Referenz, die du vermutlich auf VSTO hasst auch, weg.
Die von dir erstellte Interop Assembly(das du eine hast ist richtig) sollte eigentlich einfach im Namespace Word (nicht Microsoft.Office.Interop.Word) liegen. Das kannst du dir aber auch selbst ansehen wenn du in deinem Projekt mal die Referenz auf Word anklickst und über das Kontextmenü den Objektbrowser öffnest.
Wenn das soweit stimmt sollte ein simples
C#-Quelltext 1:
| Word.Application word = new Word.Application(); |
dir ein Word Application Objekt liefern.
|
|
flyhigh83 
      
Beiträge: 67
Win 7
C# (VS2010)
|
Verfasst: Fr 03.12.10 11:37
Danke Ralf,
ich werd nicht mehr, ich habe es hinbekommen.
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42:
| Object oMissing = System.Reflection.Missing.Value;
Object oTrue = true; Object oFalse = false; Microsoft.Office.Interop.Word.Application oWord = new Microsoft.Office.Interop.Word.Application(); Microsoft.Office.Interop.Word.Document oWordDoc = new Microsoft.Office.Interop.Word.Document();
oWord.Visible = true; Object oTemplatePath = "C:\\...\\Vorlage.dot";
oWordDoc = oWord.Documents.Add(ref oTemplatePath, ref oMissing, ref oMissing, ref oMissing);
foreach (Microsoft.Office.Interop.Word.Field myMergeField in oWordDoc.Fields) { Microsoft.Office.Interop.Word.Range rngFieldCode = myMergeField.Code; String fieldText = rngFieldCode.Text;
if (fieldText.StartsWith(" MERGEFIELD")) { Int32 endMerge = fieldText.IndexOf("\\"); Int32 fieldNameLength = fieldText.Length - endMerge; String fieldName = fieldText.Substring(11, endMerge - 11);
fieldName = fieldName.Trim();
if (fieldName == "test") { myMergeField.Select(); oWord.Selection.TypeText("Test"); } } } |
Allerdings falls jemand mal Zeit hat, kann er mir vielleicht sagen warum es mit mit einem "using Microsoft.Office.Interop.Word;" nicht funktioniert?
Wenn ich richtig liege verwende ich jetzt nicht die VSTO von Microsoft, weil es auch mit Visual Studio 2010 geht und einem Word 2003
Noch etwas Anpassung muss ich machen aber das ist kein Problem mehr.
|
|
bombike
Hält's aus hier
Beiträge: 1
|
Verfasst: Mi 15.12.10 17:00
Hallo
Habe versucht den Code zu kompilieren aber ich kriege schon beim 3. Zeile ein Fehler.
Microsoft.Office.Interop.Word.Application oWord = new Microsoft.Office.Interop.Word.Application();
Microsoft.Office.Interop.Word.Document oWordDoc = new Microsoft.Office.Interop.Word.Document();
oWord.Visible = true;
Sagt mir dass fur oWord - Type or namespace expected.
Kann mir jemand weiterhelfen, bitte.
Mfg.
Z
|
|
flyhigh83 
      
Beiträge: 67
Win 7
C# (VS2010)
|
Verfasst: Mi 22.12.10 12:47
Hi bombike,
Zitat: | Sagt mir dass fur oWord - Type or namespace expected. |
Sagt mir jetzt auf Anhieb nichts. Hatte diese Fehlermeldung wärend der Test bekommen. Wo hast du denn den Code implementiert?
Bei mir ist alles selbst in der Form, was man auch auslagern könnte. Aber wenn es nach Namespace klingt, klingt es erstmal für mich danach, dass du mehrere Nutzt?
Bist du auch nach dem Link aus dem Beispiel vorgegangen?
|
|
Trashkid2000
      
Beiträge: 561
Erhaltene Danke: 137
|
Verfasst: Mi 22.12.10 13:07
Hallo,
anstatt immer den vollen Namespace angeben zu müssen, wie hier
C#-Quelltext 1:
| Microsoft.Office.Interop.Word.Application oWord = new Microsoft.Office.Interop.Word.Application(); | kann man es auch so machen: Bei den Namepaces dies deklarieren
C#-Quelltext 1:
| using Word = Microsoft.Office.Interop.Word; | und dann einfach so benutzen:
C#-Quelltext 1:
| Word.Application oWord = new Word.Application(); |
LG, Marko
|
|
Yogu
      
Beiträge: 2598
Erhaltene Danke: 156
Ubuntu 13.04, Win 7
C# (VS 2013)
|
Verfasst: Mi 22.12.10 19:50
|
|