Utilisation de word dans VS

thristam Messages postés 23 Date d'inscription mercredi 16 juillet 2003 Statut Membre Dernière intervention 28 mars 2013 - 20 janv. 2009 à 15:59
thristam Messages postés 23 Date d'inscription mercredi 16 juillet 2003 Statut Membre Dernière intervention 28 mars 2013 - 28 oct. 2009 à 23:17
Bonjour,




Je souhaite modifier un document word dans VC# 2005, afin de pourvoir sélectionner les paragraphes du .doc ( grâce à la librairie word ) et des fonctions genre split ( grâce à la librairie dotNet ).




<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" /??>

 






Je pense avoir trouvé un

[ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.VisualStudio.v80.en/dv_vstcore/html/08f7fe4b-d96d-4a0c-b32a-aa7fd7992316.htm
lien

]
dans la msdn pour faire cela. Dans un premier temps, il s’agit de faire Application.Documents.Open("fichier.doc")





 






Pour pouvoir utiliser la fonction Open, je suis la

[ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.VisualStudio.v80.en/dv_vstcore/html/e5d1eaa4-e175-4897-8379-1b40ff3cca0a.htm
msdn

]
. J’installe Office Interop Primary Assembly et j’ajoute la référence COM : Microsoft Word Object 11.0 Library  ( librairie word ! ).





 






Le namespace Microsoft.Office.Interop.Word est reconnu par VS ( using ok ) mais malgré tout pas de complétion après Application. ( donc on peut pas choisir Documents ).





 






Des indices qui pourraient expliquer cela :






·       
La référence COM ( Microsoft Word 11.0 Object Library ) pointe sur msword.olb alors que la référence word ( que ça a ajouté ) pointe sur Microsoft.Office.interop.Word.dll.






·       
Les dlls corresponndant au Office Interop Primary sont installé en cache ( CAG ). Mais elle n’existe pas sur le disque dur quand je les cherche avec le finder.






·       
Office Interop Primary Assembly est peut-etre mal installé.





 






PS : J’ai installé le support .Net pour Office Word 2003, Office 2003 SP2 ( aussi réinstaller Office Interop Primary Assembly d’après le readme ). Trop long à expliquer tout en détails.





Si vous avez besoin d’informations complémentaires, n’hésitez pas, j’ai vu ce pb en long en large et en travers  .

8 réponses

actarus67 Messages postés 6 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 27 octobre 2009
21 oct. 2009 à 10:16
as tu essayé d'installer windowsBase.dll qui se trouve dans "C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.0" dans ton projet comme réference. essaye ça devrait t'aider. clic sur projet, ajouter réference, parcourir et suis le lien que j'ai indiqué.
bon courage
0
thristam Messages postés 23 Date d'inscription mercredi 16 juillet 2003 Statut Membre Dernière intervention 28 mars 2013
23 oct. 2009 à 15:31
J'ai justement regardé ce projet en cours mais c vraiment galère. G fini par faire par VBE ( VB Editor ). Avant ton message, j'avais fait cela :

using Word = Microsoft.Office.Interop.Word;
using Office = Microsoft.Office.Core;
using WWord = Microsoft.Office.Tools.Word;
using Microsoft.Win32.SafeHandles;

Word.Application a = new Microsoft.Office.Interop.Word.Application();
object path = @"C:\Fichier.doc";
object missing=System.Reflection.Missing.Value;
object visible = false;

a.Documents.Open(ref path, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing);

int nb_bad_mots = 0;
for (int i = 0; i < a.ActiveDocument.Words.Count; i++)
if (a.ActiveDocument.Words[i].SpellingChecked) nb_bad_mots++;



Provoque une erreur d'excution : COMException. Le membre de la collection ( Words[i] ) n'existe pas. A priori, le COMException est du à un pb pour déterminer le HRESULT retourné par l'objet COM.
En incluant WindowsBase.dll, change rien. Tiens ! Je ne sais pas quelle namespace utilisé. J'ai mis using Microsoft.Win32.SafeHandles, change rien.

Tu utilises WindowsBase.dll pour résoudre quel problème ?
As-tu une idée pour mon bug ... ( enfin sinon tantpis. Peut-etre quelqu'un d'autre. En tout cas, malgré le temps passé, Office Tools et Interop resteront un mystère pour moi. ).
0
thristam Messages postés 23 Date d'inscription mercredi 16 juillet 2003 Statut Membre Dernière intervention 28 mars 2013
23 oct. 2009 à 17:01
Tiens j'ai eu l'idée là ( encore une... ) de mettre carrément les dlls au niveau de l'exe ( dossier debug ).
Microsoft.Office.Tools.Word.dll
MSWORD.OLB ( Microsoft Word Object Library 11.0 )

Change rien.
Est-ce que parce ce que .olb et non dll ?

Références déjà ajoutées :
Microsoft.Office.Core ( Microsoft Office Object Library 11.0 ) ( installé dans le GAC ).
Microsoft.Office.Tools.Word ( pas dans le GAC )
Word ( Microsoft Word Object Library 11.0 )( pas dans le GAC )

Ya pas Microsoft.Office.Interop.Word mais en using ok. Primary Interop Assemblie installé dans ajout/suppression de programmes. Réinstallé, change rien.

Voilà voilà, enfn bref....
0
thristam Messages postés 23 Date d'inscription mercredi 16 juillet 2003 Statut Membre Dernière intervention 28 mars 2013
23 oct. 2009 à 17:03
Tiens j'ai eu l'idée là ( encore une... ) de mettre carrément les dlls au niveau de l'exe ( dossier debug ).
Microsoft.Office.Tools.Word.dll
MSWORD.OLB ( Microsoft Word Object Library 11.0 )

Change rien.
Est-ce que parce ce que .olb et non dll ?

Références déjà ajoutées :
Microsoft.Office.Core ( Microsoft Office Object Library 11.0 ) ( installé dans le GAC ).
Microsoft.Office.Tools.Word ( pas dans le GAC )
Word ( Microsoft Word Object Library 11.0 )( pas dans le GAC )

Ya pas Microsoft.Office.Interop.Word mais en using ok. Primary Interop Assemblie installé dans ajout/suppression de programmes. Réinstallé, change rien.

Voilà voilà, enfn bref....
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
actarus67 Messages postés 6 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 27 octobre 2009
26 oct. 2009 à 09:26
essaye ceci pour ouvrir word, ça marche très bien
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.IO.Packaging;




namespace projet_vmware_ouvrir_fichier_doc_10_09_09
{
public partial class Form1 : Form
{
public Microsoft.Office.Interop.Word.Application msWord=null; //declare l'application word et l'instancie à null//
public Microsoft.Office.Interop.Word.Document docWord = null; //declare le document word et l'instancie à null/
object missing = System.Reflection.Missing.Value; //declare l'objet par défaut, utile pour la suite pour les parametres par défaut//




public Form1()
{
InitializeComponent();
}

private void btn1_Click(object sender, EventArgs e)
{
object fileName = @"C:\Users\gurcan\Desktop\stage\test.docx";
//début du try catch//
try
{ //declare msWord comme nouvelle application word//
msWord = new Microsoft.Office.Interop.Word.Application();
//rend l'application visible//
msWord.Visible = true;
//declare docWord comme nouveau document//
docWord = new Microsoft.Office.Interop.Word.Document();
//montre où se trouve le document word//

//ouvre le document word//
docWord = msWord.Documents.Open(ref fileName, ref missing, ref missing, ref missing, ref missing, ref missing,
ref missing, ref missing, ref missing, ref missing, ref missing,
ref missing, ref missing, ref missing, ref missing, ref missing);
}
catch(Exception ex)
{
MessageBox.Show(ex.Message);
}
}



private void btn2_Click(object sender, EventArgs e)
{
//fermeture du document word//
docWord.Close(ref missing, ref missing, ref missing);
//fermeture de l'application word//
msWord.Quit(ref missing, ref missing, ref missing);
}
}
}

ton doc s'ouvre ensuite tu peut le modifier suivant ton programme
0
thristam Messages postés 23 Date d'inscription mercredi 16 juillet 2003 Statut Membre Dernière intervention 28 mars 2013
27 oct. 2009 à 05:04
Bonjour,
Je suppose que dans ton code, tu as ajouté using Microsoft.Office.Interop.Word; ( et ajouter la référence Microsoft Word Object 11.0 ( ou plutot 12.0 pour toi )) pour que ça compile.

Et dans ton projet word, tu peux utiliser les membres d'objets et ça marche ????? Car pour moi, g toujours un problème d'exécution ( COMException ) : le membre de la collection n'existe pas. Vérifier le code erreur de l'exception pour déterminer le HRESULT retourné par l'objet COM.
Erreur d'execution sur (msWord.ActiveDocument.Words[i].SpellingChecked) nb_bad_mots++;

( pas mis tout le code )

...
object fileName = @"C:\Todo.doc";

try
{
msWord = new Microsoft.Office.Interop.Word.Application();
msWord.Visible = true;
docWord = new Microsoft.Office.Interop.Word.Document();
docWord = msWord.Documents.Open(ref fileName, ref missing, ref missing, ref missing, ref missing, ref missing,
ref missing, ref missing, ref missing, ref missing, ref missing,
ref missing, ref missing, ref missing, ref missing, ref missing);

int nb_bad_mots = 0;
for (int i = 0; i < msWord.ActiveDocument.Words.Count; i++)
if (msWord.ActiveDocument.Words[i].SpellingChecked) nb_bad_mots++;

}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
...

J'ai remarqué que les 3 namespace de la référence ( Microsoft.Office Core, VBIDE, Word ) sont des " contrôle " ActiveX. Ton projet, c bien un projet Windows Application ?


ça me parait impossible pour que ça marche.
0
actarus67 Messages postés 6 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 27 octobre 2009
27 oct. 2009 à 09:20
tu as pensé à déclarer les objets word et leur application que tu utilises en public dans " public partial class Form1 : Form "?
0
thristam Messages postés 23 Date d'inscription mercredi 16 juillet 2003 Statut Membre Dernière intervention 28 mars 2013
28 oct. 2009 à 23:17
Oui, oui c fait. D'ailleurs si cela posait un pb, il y aurait une erreur de compilation et non d'execution.
Un bon truc qui aurait pu marcher c une copie local des références ( de manière à avoir les dll à coté de l'exe ). Mais marche pas non plus.

Ton code arrive effectivement à ouvrir word très bien. Mais essaies d'utiliser une méthode de la librairie ( comme le code suivant ) et tu verras une erreur d'exécution.
int nb_bad_mots = 0;
for (int i = 0; i < msWord.ActiveDocument.Words.Count; i++)
if (msWord.ActiveDocument.Words[i].SpellingChecked) nb_bad_mots++;

Quelle version de visual studio utilises-tu ? ( question très importante, merci d'y répondre ).

Bon voilà, je me demande vraiment si on peut utiliser cette librairie avec VS 2005. Tu utilises la librairie word dans un projet ???
0
Rejoignez-nous