Après windows pour les nuls, voici PB pour les bons (ou presque).

Le forum (ô combien francophone) des utilisateurs de Powerbuilder.

Recherche rapide

Annonce

Certaines rubriques, dont des cours, sont uniquement visibles par les membres du forum ^^.
Dans la rubrique Liens & Références, vous avez accès à un sommaire de téléchargement, profitez-en !
Il existe maintenant un nouveau TOPIC "Votre CV en Ligne" accessible uniquement par demande.

#1 18-04-2007 16:33:27

mial  
White & The Farmerz Gang
Lieu: Nancy
Date d'inscription: 09-02-2007
Messages: 113
Pépites: 4,366
Banque: 18,191,568,319,324

[SOURCE] Echange avec un document word par OLE

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.

Code: pb

///////////////////////////////////////////////////////////
// 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] http://pbadonf.fr/forum/img/puntoolbar/smooth/bt_pre.png [ code=pb ]

Dernière modification par mial (18-04-2007 16:34:29)

Hors ligne

 

#2 18-04-2007 18:38:50

erasorz  
Admin
Lieu: Babylone
Date d'inscription: 23-11-2006
Messages: 5121
Pépites: 97,197
Banque: 2,147,483,647

Re: [SOURCE] Echange avec un document word par OLE

!


N'envoyez jamais un humain faire le travail d'un programme.

Hors ligne

 

#3 19-04-2007 08:00:15

shahin  
Modérateur
Award: bf
Lieu: val de marne
Date d'inscription: 26-09-2006
Messages: 938
Pépites: 8,675,050,269
Banque: 16,218,225,127,617

Re: [SOURCE] Echange avec un document word par OLE


never let people work on more than one thing at once.

Hors ligne

 

#4 31-03-2011 16:10:45

kkarmi  
Membre Geek
Date d'inscription: 02-03-2011
Messages: 29
Pépites: 119
Banque: 0

Re: [SOURCE] Echange avec un document word par OLE

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

 

#5 01-04-2011 07:53:48

erasorz  
Admin
Lieu: Babylone
Date d'inscription: 23-11-2006
Messages: 5121
Pépites: 97,197
Banque: 2,147,483,647

Re: [SOURCE] Echange avec un document word par OLE

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


N'envoyez jamais un humain faire le travail d'un programme.

Hors ligne

 

#6 05-04-2011 09:46:56

kkarmi  
Membre Geek
Date d'inscription: 02-03-2011
Messages: 29
Pépites: 119
Banque: 0

Re: [SOURCE] Echange avec un document word par OLE

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,

Code: pb

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:

Code: pb

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

 

#7 05-04-2011 09:56:02

foon  
N2iGeek + MangasGeek = foon
Award: bf
Lieu: Bonchamp-Lès-Laval
Date d'inscription: 28-02-2007
Messages: 2486
Pépites: 85
Banque: 9,223,372,036,854,776,000

Re: [SOURCE] Echange avec un document word par OLE

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)


Seuls ceux qui ne font rien ne font jamais d'erreurs
http://www.nerdtests.com/images/badge/163124fb7fb459a3.gif

Hors ligne

 

#8 05-04-2011 09:58:35

kkarmi  
Membre Geek
Date d'inscription: 02-03-2011
Messages: 29
Pépites: 119
Banque: 0

Re: [SOURCE] Echange avec un document word par OLE

Bonjour,
merci pour votre réponse rapide c'est vraiment urgent.
Office 2007.

Hors ligne

 

#9 05-04-2011 10:01:31

kkarmi  
Membre Geek
Date d'inscription: 02-03-2011
Messages: 29
Pépites: 119
Banque: 0

Re: [SOURCE] Echange avec un document word par OLE

Version PB:10.5
Et office 2007

Hors ligne

 

#10 05-04-2011 10:53:58

buck  
Modérateur
Lieu: Dijon
Date d'inscription: 31-07-2008
Messages: 747
Pépites: 1,028,843
Banque: 171,170,849,654

Re: [SOURCE] Echange avec un document word par OLE

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 :

Code: pb

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

 

#11 05-04-2011 11:18:53

kkarmi  
Membre Geek
Date d'inscription: 02-03-2011
Messages: 29
Pépites: 119
Banque: 0

Re: [SOURCE] Echange avec un document word par OLE

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

 

#12 05-04-2011 13:24:26

buck  
Modérateur
Lieu: Dijon
Date d'inscription: 31-07-2008
Messages: 747
Pépites: 1,028,843
Banque: 171,170,849,654

Re: [SOURCE] Echange avec un document word par OLE

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

 

#13 06-04-2011 11:22:31

kkarmi  
Membre Geek
Date d'inscription: 02-03-2011
Messages: 29
Pépites: 119
Banque: 0

Re: [SOURCE] Echange avec un document word par OLE

bonjour,

Code: pb

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

 

#14 06-04-2011 12:32:54

foon  
N2iGeek + MangasGeek = foon
Award: bf
Lieu: Bonchamp-Lès-Laval
Date d'inscription: 28-02-2007
Messages: 2486
Pépites: 85
Banque: 9,223,372,036,854,776,000

Re: [SOURCE] Echange avec un document word par OLE


Seuls ceux qui ne font rien ne font jamais d'erreurs
http://www.nerdtests.com/images/badge/163124fb7fb459a3.gif

Hors ligne

 

Pied de page des forums

Propulsé par FluxBB 1.2.22