Le forum (ô combien francophone) des utilisateurs de Powerbuilder.
Pages: 1
Bonjour,
je vous fais part d'un code que j'utilise pour créer, lire, ecrire dans un document word grâce à OLE.
Le code est très brouillon, mais assez commenté donc pour ceux que ça interesse et en cherchant un peu (!), vous pourrez retrouver les principales fonctions à utiliser.
Je n'ai testé ce code que sous Word 2003 et 2000, donc je ne garantis pas le fonctionnement de tout le script.
Une version plus claire et concise sera mise à jour lorsque j'aurai un peu plus de temps.
/////////////////////////////////////////////////////////// // Traitement de la liaison OLE /////////////////////////////////////////////////////////// long ll_nb_ins = 1, ll_nb_row, ll_i, ll_col, ll_row, ll_no_designation long ll_tab = 1, ll_fin_de_page, ll_fin_selection string ls_last_critere_orga, ls_tri, ls_tri_orga String ls_marquage, ls_etat, ls_type, ls_constructeur, ls_affectation string ls_path DataStore lds lds = CREATE DataStore /////////////////////////////////////////////////////////// // Création des objets OLE /////////////////////////////////////////////////////////// OLEObject Resultat //OLEObject Modele Resultat = CREATE OLEObject //Modele = CREATE OLEObject /////////////////////////////////////////////////////////// // Test de connection à l'application Word /////////////////////////////////////////////////////////// IF Resultat.ConnectToNewObject("word.application") = 0 THEN // AND Modele.ConnectToNewObject("word.application") = 0 /////////////////////////////////////////////////////////// // Rend visible les processus Word /////////////////////////////////////////////////////////// //Modele.Application.Visible=TRUE ls_path = of_get_current_directory() Resultat.Application.Visible=TRUE /////////////////////////////////////////////////////////// // Ajoute une feuille vierge et l'active /////////////////////////////////////////////////////////// //Resultat.Documents.Add Resultat.Application.Activate() //Modele.Application.Activate() //Resultat.Application.Name = "Liste des instruments pour la désignation" + ddlb_designation.Text /////////////////////////////////////////////////////////// // Ecris du texte /////////////////////////////////////////////////////////// //Resultat.Selection.TypeText("TEST") // Condition car il se peut qu'il n'y ait pas les droits pour ouvrir... // + CHEMIN COMPLET UNIQUEMENT //Modele.Application.Documents.open("D:\Sources\TestWord\modele.doc") Resultat.Application.Documents.open(ls_path + "\modele.doc") ///////////////////////////////////////////////////////// // Aller au bookmark <NBI>. NON TESTE ///////////////////////////////////////////////////////// //Modele.selection.GoTo(TRUE,0,0,"<NBI>") ///////////////////////////////////////////////////////// // Trouve du texte et le remplace ///////////////////////////////////////////////////////// /* Modele.Selection.Find.Forward = True Modele.Selection.Find.ClearFormatting Modele.Selection.Find.MatchWholeWord = True Modele.Selection.Find.MatchCase = False Modele.Selection.Find.Execute("<TRI>") Modele.selection.TypeText("Texte Remplacé") */ /////////////////////////////////////////////////////////// // Aller 3 lignes plus bas /////////////////////////////////////////////////////////// /* Modele.selection.GoToNext(3) Modele.selection.TypeText("3 lignes plus bas") */ /////////////////////////////////////////////////////////// // Impression sans confirmation /////////////////////////////////////////////////////////// //Modele.PrintOut() /////////////////////////////////////////////////////////// // Affichage du choix de l'imprimante /////////////////////////////////////////////////////////// //Modele.Application.Dialogs.Item(88).Show() /////////////////////////////////////////////////////////// // Traitement des tableaux /////////////////////////////////////////////////////////// /* // ?????????????????????!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Modele.Application.WindowState = 2 // Pas a pas??!! Pourquoi? Set MyRange = ActiveDocument.Content MyRange.Collapse Direction:=wdCollapseEnd ActiveDocument.Tables.Add Range:=MyRange, NumRows:=10, NumColumns:=5 */ /////////////////////////////////////////////////////////// // Recherche du tableau /////////////////////////////////////////////////////////// //Modele.Selection.Find.Execute("<TABL>") //Modele.selection.TypeText("insertion dans le tableau") // Remplissage avec du texte : //Modele.ActiveDocument.Tables(1).Cell(1, 1).InsertAfter //Modele.ActiveDocument.Tables(1).Cell(1, 5).InsertAfter /* // Mise en forme : ModeleActiveDocument.Tables(1).Cell(Row:=1, Column:=1).Range.Font.Italic = True Modele.ActiveDocument.Tables(1).Cell(Row:=1, Column:=1).Range.Font.Bold = True Modele.ActiveDocument.Tables(1).Cell(Row:=1, Column:=1).Range.Font.Underline = False Modele.ActiveDocument.Tables(1).Cell(Row:=1, Column:=1).Range.Font.Color = wdColorWhite Modele.ActiveDocument.Tables(1).Cell(Row:=1, Column:=1).Range.Font.Name = "Arial" Modele.ActiveDocument.Tables(1).Cell(Row:=1, Column:=1).Range.Font.Size = 11 Modele.ActiveDocument.Tables(1).Cell(Row:=1, Column:=1).Range.Shading.BackgroundPatternColorIndex = wdGray50 'grisé // Taille des cellules Modele.ActiveDocument.Tables(1).Cell(, 1).Width = InchesToPoints(2.5) Modele.ActiveDocument.Tables(1).Cell(, 1).Height = InchesToPoints(0.1) */ // // /* Modele.Selection.InsertAfter("zegfr") Modele.Selection.Write("sdfgqegqegeqrgergzergfrzegfzegfr") // Get the Bookmarks Collection OLEobject lole_Bookmarks lole_Bookmarks = lole_OLE.Application.ActiveDocument.Bookmarks // Get the number of bookmarks in the Bookmark Collection. ll_Bookmarks = lole_Bookmarks.Count FOR ll_I = 1 TO ll_Bookmarks ls_BookName = lole_Bookmarks.Item[ ll_I ].Name ls_BookData = lole_Bookmarks.Item[ ll_I ].Range. */ /* OleObject lole_Bookmarks lole_Bookmarks = Resultat.Application.ActiveDocument.Bookmarks long ll_Bookmarks // Get the number of bookmarks in the Bookmark Collection. ll_Bookmarks = lole_Bookmarks.Count MessageBox("Book",string(ll_Bookmarks)) */ /////////////////////////////////////////////////////////// // TRAITEMENT DES INSTRUMENTS // On cherche tous les instruments pour le parc, // la société et la désignation séléctionnée select no_designation into :ll_no_designation from designation where no_societe = :ddlb_societe.Text and no_parc = :ddlb_parc.Text and intitule = :ddlb_designation.Text using sqlca; if sqlca.sqlcode<0 then MessageBox("Erreur génération fichier Word","Erreur dans la récupération de la désgination") rollback using sqlca; goto end_of_script elseif sqlca.sqlcode=100 then // événement inexistant MessageBox("Erreur génération fichier Word","La désgination selectionnée n'a pas été trouvée") rollback using sqlca; elseif sqlca.sqlcode=0 then lds.DataObject= "d_liste_instrument" lds.setTransObject(SQLCA) ll_nb_row = lds.retrieve(ddlb_societe.Text,ddlb_parc.Text,ll_no_designation) // On effectue le tri (organisé) sur le critère selectionné par l'utilisateur if rb_org_marquage.Checked = true then ls_tri = "marquage" elseif rb_org_type.Checked = true then ls_tri = "type" elseif rb_org_constructeur.Checked = true then ls_tri = "constructeur" elseif rb_org_etat.Checked = true then ls_tri = "etat" else ls_tri = "affectation" end if lds.setSort(ls_tri) lds.sort() // On récupère donc tous les instruments rangés selon le critere "organisation" if ll_nb_row < 0 then // Erreur sur le retrieve MessageBox("Erreur","Erreur lors de la récupération des instruments",StopSign!) return -1 elseif ll_nb_row = 0 then MessageBox("Avertissement","Aucun instrument trouvé pour cette désignation") end if // Positionnement sur le tableau Resultat.ActiveDocument.Tables[ll_tab].Select for ll_i = 1 to ll_nb_row // Pour tous les instruments // Récupération des infos de l'instruments ls_marquage = lds.getItemString(ll_i,"marquage") ls_etat = lds.getItemString(ll_i,"etat") If isNull(ls_etat) then ls_etat = "" ls_type = lds.getItemString(ll_i,"type") If isNull(ls_type) then ls_type = "" ls_constructeur = lds.getItemString(ll_i,"constructeur") If isNull(ls_constructeur) then ls_constructeur = "" ls_affectation = lds.getItemString(ll_i,"affectation") If isNull(ls_affectation) then ls_affectation = "" choose case ls_tri case "marquage" ls_tri_orga = ls_marquage case "type" ls_tri_orga = ls_type case "etat" ls_tri_orga = ls_etat case "constructeur" ls_tri_orga = ls_constructeur case "affectation" ls_tri_orga = ls_affectation end choose if ll_i <> 1 then // On teste si la valeur du critère d'oganisation a changé // alors on crée un nouveau tableau if ls_last_critere_orga <> ls_tri_orga then // On ajoute une ligne et on coupe pour le saut de ligne // Création automatique d'un second tableau Resultat.Selection.Tables[1].Rows.Add ll_row++ Resultat.ActiveDocument.Tables[ll_tab].Split(ll_row) // On recopie l'entete du premier tableau Resultat.ActiveDocument.Tables[ll_tab].Select Resultat.Selection.Rows[1].Select Resultat.Selection.Range.Copy // Selection du second tableau ll_tab++ ll_col = 1 ll_row = 2 // On colle l'entete Resultat.ActiveDocument.Tables[ll_tab].Select Resultat.Selection.Rows[1].Select Resultat.Selection.Range.Paste else // Création et positionnement sur une nouvelle ligne Resultat.Selection.Tables[1].Rows.Add ll_row++ ll_col = 1 end if else // Cas du premier instrument // Selection de la première ligne -> Pas d'insertion ll_row = 2 ll_col = 1 end if ls_last_critere_orga = ls_tri_orga //Selection de la premiere cellule Resultat.Selection.Tables[1].Cell[ll_row,ll_col].Select // Ecriture du marquage Resultat.selection.TypeText(ls_marquage) // Sélection de la prochain colonne ll_col++ Resultat.Selection.Tables[1].Cell[ll_row,ll_col].Select // Ecriture du type Resultat.selection.TypeText(ls_type) // Sélection de la prochain colonne ll_col++ Resultat.Selection.Tables[1].Cell[ll_row,ll_col].Select // Ecriture du constructeur Resultat.selection.TypeText(ls_constructeur) // Sélection de la prochain colonne ll_col++ Resultat.Selection.Tables[1].Cell[ll_row,ll_col].Select // Ecriture de l'etat Resultat.selection.TypeText(ls_etat) // Sélection de la prochain colonne ll_col++ Resultat.Selection.Tables[1].Cell[ll_row,ll_col].Select // Ecriture de l'affectation Resultat.selection.TypeText(ls_affectation) // Incrément de la variable "nombre instrument" ll_nb_ins++ next // Affiche l'opération effectuée Resultat.ActiveDocument.Content.Select Resultat.Selection.Find.Execute("<TIFO>") Resultat.selection.TypeText("Inventaire sur la désignation ")// + ddlb_designation.Text ) // Affiche le nb d'instruments traités Resultat.ActiveDocument.Content.Select Resultat.Selection.Find.Execute("<NBI>") Resultat.selection.TypeText(string(ll_nb_ins)) // Affiche la date courante Resultat.ActiveDocument.Content.Select Resultat.Selection.Find.Execute("<DATE>") Resultat.selection.TypeText(string(of_get_currentdate())) // Affiche l'élement de tri Resultat.ActiveDocument.Content.Select Resultat.Selection.Find.Execute("<TRI>") Resultat.selection.TypeText("Marquage") // Affiche l'élement d'organisation Resultat.ActiveDocument.Content.Select Resultat.Selection.Find.Execute("<ORGA>") Resultat.selection.TypeText("Type") //Tri de tous les tableaux for ll_i = 1 to ll_tab // Selection du tableau n°ll_i Resultat.ActiveDocument.Tables[ll_i].Select // On insere une ligne vide, on trie, on supprime la ligne vide // -> Auncune logique mais sinon le tri ne fonctionne pas... Resultat.Selection.Tables[1].Rows.Add Resultat.ActiveDocument.Tables[ll_i].Sort(TRUE) Resultat.Selection.Tables[1].Rows[2].Delete next // Suppression de toutes les balises Resultat.ActiveDocument.Content.Select Resultat.Selection.Find.Execute("<DEBT>") Resultat.selection.delete Resultat.ActiveDocument.Content.Select Resultat.Selection.Find.Execute("<FINT>") Resultat.selection.delete /////////////////////////////////////////////////////////// // Sauvgarde d'un document /////////////////////////////////////////////////////////// Resultat.ActiveDocument.SaveAs(ls_path + "\resultat.doc") end if ELSE // L'ouverture de Word n'a pas fonctionné... MessageBox('Exportation Word',"Ouverture impossible de Word, vérifier la présence du programme sur votre ordinateur",StopSign!) END IF /////////////////////////////////////////////////////////// // Fermeture des documents /////////////////////////////////////////////////////////// //Resultat.DisconnectObject() Resultat.ActiveDocument.Close(0) Resultat.Application.Quit //Modele.Application.Activate() /////////////////////////////////////////////////////////// // Destruction des objets /////////////////////////////////////////////////////////// Destroy Resultat //Destroy Modele Destroy lds return 1 end_of_script: Destroy lds return -1
[edit] [ code=pb ]
Dernière modification par mial (18-04-2007 16:34:29)
Hors ligne
!
Hors ligne
Hors ligne
slt,
Merciiii pour le sujet, c'est vraiment interéssant,et merci aussi pour le bout de code.
J'ai voulu savoir s'il y a une methode pour acceder à une position dans une ligne, en effet, j'ai un formulaire avec des lignes descriptif puis dans chaque ligne, à la fin ou au millieu, une postion à remplir par les information que je collecte à partir de ma base de données.
De plus, est ce que vous pouvez me fournir un bout de code.
Merci d'avance.
Hors ligne
Bonjour,
kkarmi a écrit:
J'ai voulu savoir s'il y a une methode pour acceder à une position dans une ligne, en effet, j'ai un formulaire avec des lignes descriptif puis dans chaque ligne, à la fin ou au millieu, une postion à remplir par les information que je collecte à partir de ma base de données.
En gros tu veux faire une fusion, tu peux regarder ici : http://pbadonf.fr/forum/viewtopic.php?id=7
Hors ligne
bonjour,
Merci pour votre réponse. J'ai résolu le problème, en effet, on peut inserer au niveau de la position à remplir un <code>(n'importe quel nom), puis on peut remplir avec le text "exemple du text" en exécutant ce bout de code,
obj_word.Selection.Find.Execute("<code>") obj_word.selection.TypeText("exemple du text")
J'ai une autre question:
J'ai une image à inserer dans mon document word en utilisant:
String ls_pic OLEObject obj_word, obj_doc ls_pic = 'C:\SomePicture.bmp' obj_word = CREATE OLEObject obj_word.ConnectToNewObject( 'word.application' ) obj_doc = obj_word.Documents.Add( ) obj_doc.Shapes.AddPicture( ls_pic )
sa marche pas, powerbuilder me retourne "Name not found calling external object AddPicture" erreur R0032 de PB.
Est que vous pouvez m'aider pour résoudre ce problème?
Merci d'avance.
Vous pouvez me contacter sur mon mail:kkarmi@vermeg.com
Hors ligne
Bonjour,
De plus, merci de signaler la version de PB et de Word utilisée (La syntaxe a évolué entre Office 2003 et Office 2007)
Hors ligne
Bonjour,
merci pour votre réponse rapide c'est vraiment urgent.
Office 2007.
Hors ligne
Version PB:10.5
Et office 2007
Hors ligne
Bonjour,
Dans la documentation visual basic de word, on peut lire qu'il faut ajouter une zone de dessin avant de pouvoir insérer une image donc :
obj_doc.Shapes.AddCanvas(100, 75, 200, 300) obj_doc.Shapes.AddPicture( ls_pic )
J'ai fait l'essai sous PB 11.5 / Word 2010 cela fonctionne sans problème.
Hors ligne
merciiiii bq, sa marche enfin, mais j'ai un sousis, je veux placer cette image à une position spécifique dans le doc, y a t'il une solution?
Hors ligne
Un petit effort, s'il te plait, les paramètres de AddCanvas ne seraient t-ils pas des coordonnées de la zone de dessin dans la page !
Hors ligne
bonjour,
ls_pic ="d:\work\img.emf" obj_word = CREATE OLEObject obj_word.ConnectToNewObject( "word.application" ) obj_word.Application.Documents.open("d:\work\model3.doc",WRITE!) //model3 est un formulaire à remplir depuis power builder avec une insrtion d'une image à une endroit specifique //pour inserer l'image obj_doc = obj_word.Documents.Add( ) obj_doc.Shapes.AddCanvas(100, 75, 200, 300) obj_doc.Shapes.AddPicture( ls_pic ) //remplir le formulaire obj_word.Selection.Find.Execute("<CLIENT>") obj_word.selection.TypeText("BDF") obj_word.Selection.Find.Execute("<date>") obj_word.selection.TypeText("12/04/2011") obj_word.Selection.Find.Execute("<Indice>") obj_word.selection.TypeText("bench")
au cours du débogage, le remplissage du formulaire sa marche si je consilte mon rapport, mai si je termine mon débogage, j'aurai toujour model3 inchangé!!!!?pourqoi?
l'image ne s'ajoute toujour pas, mai si je fais obj_doc.SaveAs("d:\work\resultat.doc") j'aurai l'image seul dans resultat!
bref,mes soucis sont:
-pourqu j'aurai pas le remplissage de mon document à la fin de mon opération?
-pourquoi l'image ne s'ajoute tjr pas, sauf si j'enregistre dans un document à part!
Hors ligne
Hors ligne
Pages: 1