Bonjour à tous !!!
Le cas que je vais vous exposer est assez atypique. Je galère depuis ce matin sur ça alors que je sais que je suis très proche de la fin de mon application.
Je développe sur iPhone une application native qui récupère des informations et des photos via l'interface que j'ai créé. Sur la dernière "vue" de mon interface j'envois ces données.
Jusque là tout va bien. Mes données sont bien envoyées et reçues par mon serveur asp.net.
Là où ça se corse c'est lors de la génération du document word.
J'ai tout d'abord testé en local (cad sur le serveur même). Et mon word est bien généré avec mes images.
Là où ça coince c'est quand j'essais de générer ce word directement de l'iPhone.
D'un point de vue fonctionnel, lorsque je clique sur le bouton d'envois, l'iPhone envoi des données (images et texte) sur mon serveur via la méthode POST.
Je peux donc aisément récupérer ces informations de l'autre côté. Mais apparement je ne peux pas correctement utiliser le "msWord" qui est sur le serveur.
Voici la fonction que j'appelle lorsque je génère mon word (et qui fonctionne très bien en local):
La première fois que j'ai testé ceci à partir de l'iPhone j'ai reçu cette erreur :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62 public void generateDocument() { // Connexion à Word string pathTemplates = Server.MapPath("./templates/"); string pathDocuments = Server.MapPath("./Documents/"); string pathImgBefore = Server.MapPath("./Upload/imageBefore.jpg"); Object myFalse = false ; Object myTrue = true ; Microsoft.Office.Interop.Word.Application msWord = new Microsoft.Office.Interop.Word.Application(); msWord.Visible = true; // mettez cette variable à true si vous souhaitez visualiser les opérations. object missing = System.Reflection.Missing.Value; // Attribuer le nom object fileName = pathDocuments + "rapport.doc"; Microsoft.Office.Interop.Word.Document nvDoc; // Tester s'il s'agit d'un nouveau document ou d'un document existant. if (System.IO.File.Exists((string)fileName)) { // ouvrir le document existant nvDoc = 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); } else { // Choisir le template object templateName = pathTemplates + "template.dot"; // Créer le document nvDoc = msWord.Documents.Add(ref templateName, ref missing, ref missing, ref missing); } // Les champs de formulaire définis dans le modèle se nomment "choix1" et "choix2". object field = "choix1"; nvDoc.FormFields.get_Item(ref field).Result = choix1; field = "choix2"; nvDoc.FormFields.get_Item(ref field).Result = choix2; field = "imgBefore"; Object imgRange = nvDoc.FormFields.get_Item(ref field).Range; nvDoc.InlineShapes.AddPicture(pathImgBefore, ref myFalse, ref myTrue, ref imgRange); // Sauver le document nvDoc.SaveAs(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); // Fermer le document nvDoc.Close(ref missing, ref missing, ref missing); // Fermeture de word msWord.Quit(ref missing, ref missing, ref missing); }
à la ligne :La récupération de la fabrique de classe COM pour le composant avec le CLSID {000209FF-0000-0000-C000-000000000046} a échoué en raison de l'erreur suivante : 80070005.
J'ai donc pu en conclure qu'il y avait une histoire de permission dans tout ça. Je suis donc directement intervenu dans les services de composants afin de donner les droits au composant "Microsoft Word Application". Ce composant étant absent j'ai directement donné les droits (comme un sauvage) à toute l'entité (Mon serveur) pour qu'on puise accéder à ces composant depuis l'extérieur.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 Microsoft.Office.Interop.Word.Application msWord = new Microsoft.Office.Interop.Word.Application();
Depuis cela, je n'ai plus l'erreur ci dessus. Par contre, j'en ai une nouvelle :-) :
Cette erreur se produit à cette ligne là :La référence d'objet n'est pas définie à une instance d'un objet.
J'en conclu(après certains tests) que nvDoc est nul. Et c'est là où je coince ... je ne sais pas pouruoi nvDoc est nul alors que la variable msWord elle ne l'est pas ...
Code : Sélectionner tout - Visualiser dans une fenêtre à part nvDoc.FormFields.get_Item(ref field).Result = choix1;
Est ce que quelqu'un aurait une idée ?? Je suis sur que c'est encore une histoire de permission ou quelque chose comme ça parce qu'en "local" ce script marche très bien et me génère un beau document word tout frais !!!
Merci d'avance pour vos idées ou toute autre aide !!!
MoKeS![]()
Partager