[Writer] Modifier un ODT depuis Calc puis générer en PDF

Discussions et questions sur tout ce qui concerne la programmation tous langages et tous modules confondus.

Modérateur : Vilains modOOs

Règles du forum
:alerte: Balisage obligatoire dans cette section !
Aidez-nous à vous aider au mieux en balisant correctement votre question : reportez-vous sur les règles de cette section avant de poster !
arwy
Fraîchement OOthentifié
Messages : 4
Inscription : 27 oct. 2024 09:35

[Writer] Modifier un ODT depuis Calc puis générer en PDF

Message par arwy »

Bonjour à tous,

Pour commencer, je précise de suite que je n'ai aucune connaissance en codage/macro ou autre.
Je souhaiterais pouvoir générer des courriers automatiquement à partir d'un modèle sous Writer et de champs à modifier ( signets) renseignés sur ma feuille Calc.
Jusque là, j'ai réussi à glaner une macro qui me permet de faire le travail.

En revanche, au lieu de voir se lancer l'application Writer quand je lance la macro, je souhaiterais que mon courrier soit directement généré en PDF et que mon modèle de courrier sous Writer ne subisse aucune modification.
Pourriez-vous m'aider à agrémenter ma macro pour pouvoir faire cela ?

( Petite précision : je souhaiterais que mon pdf soit automatiquement enregistré sous un chemin spécifique ( pas d'ouverture de boite de dialogue pour choisir le dossier de destination afin de diminuer le nombre de clic ) , qu'il soit renommé selon le texte inscrit dans une cellule spécifique et qu'il s'ouvre directement lors du lancement de la macro).

J'ai tenté en vain plusieurs solutions.

Je vous mets en pièce jointe mes fichiers Calc et Writer.

Je vous remercie à l'avance de l'aide que vous pourrez m'accorder.

Bonne journée.
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
LibreOffice version 7.2.7.2M7(x64)
Windows 10
Avatar de l’utilisateur
Bidouille
RespOOnsable forum
RespOOnsable forum
Messages : 12457
Inscription : 08 nov. 2005 16:23
Localisation : Caen, France

Re: Modifier un document odt depuis Calc puis générer en PDF

Message par Bidouille »

Bonjour et bienvenue,

Votre question a été logiquement déplacée dans la section Macros.
Pensez à lire le descriptif de la page d'accueil pour poster au bon endroit la prochaine fois.
J'ai corrigé le titre afin qu'il soit conforme (cf. bandeau rouge au dessus).
arwy a écrit : 27 oct. 2024 10:58Jusque là, j'ai réussi à glaner une macro qui me permet de faire le travail.
Veuillez donner le lien où vous avez trouvée cette macro.
Et publiez à la suite son code en l'encadrant comme ceci :

Code : Tout sélectionner

code de la macro
arwy
Fraîchement OOthentifié
Messages : 4
Inscription : 27 oct. 2024 09:35

Re: [Writer] Modifier un ODT depuis Calc puis générer en PDF

Message par arwy »

Merci pour les modifications apportées à mon titre.

Le lien à partir duquel j'ai puisé le code que j'utilise provient de ce forum :
viewtopic.php?p=304853#p304853

Je l'ai légèrement modifié afin qu'il ne soit plus nécessaire de sélectionner une ligne sur Calc.
Voici ce que ça donne :

Code : Tout sélectionner

 Sub EditionDevis()
  Dim oCalc As Object 
  Dim oFeuille, oCell As Object 
  
  Dim sSuivi, sDestinataire, sTelephone, sMontant, sReference, sAdresse, sCivilite As String 
  Dim dDateDemande As Date 
 
  
  oCalc = ThisComponent
  oFeuille = oCalc.getSheets.getByName("Feuille1") 
  

  
  'Récupération des données du client
  sSuivi = oFeuille.getCellRangeByName("B3").String
  sTelephone = oFeuille.getCellRangeByName("B4").String
  sReference = oFeuille.getCellRangeByName("B6").String
  sCivilite = oFeuille.getCellRangeByName("B8").String    	
  sDestinataire = oFeuille.getCellRangeByName("B9").String
  sAdresse = oFeuille.getCellRangeByName("B10").String
  sMontant = oFeuille.getCellRangeByName("B12").String
  
  
  'Création du document basé sur son modèle
  Dim oWriter As Object
  Dim sAdresseDoc As String
  Dim Args() As New com.sun.star.beans.PropertyValue
  sAdresseDoc = ConvertToURL(getDirectory(oCalc.URL) & "WriterTEST.odt")
  oWriter = StarDesktop.LoadComponentFromURL(sAdresseDoc, "_blank", 0, Args() )
  

  
  'Ecriture dans le document
  EcrireAuSignet(oWriter, "date", Date) 'Date du jour
  EcrireAuSignet(oWriter, "suivi", sSuivi)
  EcrireAuSignet(oWriter, "téléphone", sTelephone)
  EcrireAuSignet(oWriter, "référence", sReference)
  EcrireAuSignet(oWriter, "civilité", sCivilite)
  EcrireAuSignet(oWriter, "adresse", sAdresse)
  EcrireAuSignet(oWriter, "destinataire", sDestinataire)
  EcrireAuSignet(oWriter, "montant", sMontant)

End Sub

 
   '_____________________________________________________________________________
 'Atteindre le signet passé en paramètre et écriture
 Sub EcrireAuSignet (odoc As Object, sSignet  As String, sTexte As String)
  Dim oTexte As Object
  Dim oSignet As Object, oCurseur As Object
  oSignet = odoc.Bookmarks.getByName(sSignet)
  oTexte = oSignet.Anchor.Text
  oCurseur = oTexte.createTextCursorByRange(oSignet.Anchor.Start)
  oTexte.insertString( oCurseur, sTexte, false)	
  
 End Sub

Comme précisé dans mon précédent message, je souhaiterais pouvoir générer le résultat en PDF.

Merci à vous !
LibreOffice version 7.2.7.2M7(x64)
Windows 10
Avatar de l’utilisateur
jeanmi2403
SuppOOrter
SuppOOrter
Messages : 1466
Inscription : 18 janv. 2008 09:02
Localisation : Val de Marne

Re: [Writer] Modifier un ODT depuis Calc puis générer en PDF

Message par jeanmi2403 »

Bonjour,
arwy a écrit : 27 oct. 2024 10:58 Pour commencer, je précise de suite que je n'ai aucune connaissance en codage/macro ou autre.
Un peu, quand même ? au vu de ton fichier ....
En revanche, au lieu de voir se lancer l'application Writer quand je lance la macro, je souhaiterais que mon courrier soit directement généré en PDF
Pour ça, il me semble indispensable que le fichier soit ouvert, pour utiliser ensuite la méthode ExportToPDF, comme Dude le préconise dans ce post.
et que mon modèle de courrier sous Writer ne subisse aucune modification.
Eh bien justement, il faudrait que le fichier original soit enregistré comme modèle (extension "ott"), à partir duquel créer un nouveau document.
Ça se fait tout seul en ouvrant le modèle, le fichier créé porte le nom "Sans nom.odt"

Code : Tout sélectionner

  Dim Args() As New com.sun.star.beans.PropertyValue
   sAdresseDoc = ConvertToURL("Monchemin\MonModele.ott")
   oWriter = StarDesktop.LoadComponentFromURL(sAdresseDoc, "_blank", 0, Args() )
Petite précision : je souhaiterais que mon pdf soit automatiquement enregistré sous un chemin spécifique
Tu trouveras ça aussi dans le post cité plus haut.
En cas de difficulté, je peux aider.
Je suppose que le fichier odt n' a pas besoin d'être enregistré ?
Petite remarque : je péfère utiliser des champs plutôt que des repères de texte, c'est plus facile à manipuler...
Cordialement,
Jean-Michel
LibO 24.2 et AoO 4.1.15 sur Windows 11 & Ubuntu 22.04
LibO 24.8 sur OpenSuse & Linux MX
arwy
Fraîchement OOthentifié
Messages : 4
Inscription : 27 oct. 2024 09:35

Re: [Writer] Modifier un ODT depuis Calc puis générer en PDF

Message par arwy »

Merci jeanmi2403 pour ta réponse.

Déjà, pour ce qui est de l'utilisation d'un modèle Writer en extension "ott" au lieu de mon fichier original, c'est nickel.

Ensuite, je me suis basée sur le post dont tu as fait référence pour en tirer une portion de code qui me permet l'extraction en PDF de mon fichier :

Code : Tout sélectionner

Sub EditionDevis()
  Dim oCalc As Object 
  Dim oFeuille As Object 
  
  Dim sSuivi, sDestinataire, sTelephone, sMontant, sReference, sAdresse, sCivilite As String 
  Dim dDateDemande As Date 
  
  oCalc = ThisComponent
  oFeuille = oCalc.getSheets.getByName("Feuille1") 
  

  
  'Récupération des données du client
  sSuivi = oFeuille.getCellRangeByName("B3").String
  sTelephone = oFeuille.getCellRangeByName("B4").String
  sReference = oFeuille.getCellRangeByName("B6").String
  sCivilite = oFeuille.getCellRangeByName("B8").String    	
  sDestinataire = oFeuille.getCellRangeByName("B9").String
  sAdresse = oFeuille.getCellRangeByName("B10").String
  sMontant = oFeuille.getCellRangeByName("B12").String
  
  
  'Création du document basé sur son modèle
  Dim oWriter As Object
  Dim sAdresseDoc As String
  Dim Args() As New com.sun.star.beans.PropertyValue
  sAdresseDoc = ConvertToURL(getDirectory(oCalc.URL) & "modèle1.ott")
  oWriter = StarDesktop.LoadComponentFromURL(sAdresseDoc, "_blank", 0, Args() )
  
   
  
  'Ecriture dans le document
  EcrireAuSignet(oWriter, "date", Date) 'Date du jour
  EcrireAuSignet(oWriter, "suivi", sSuivi)
  EcrireAuSignet(oWriter, "téléphone", sTelephone)
  EcrireAuSignet(oWriter, "référence", sReference)
  EcrireAuSignet(oWriter, "civilité", sCivilite)
  EcrireAuSignet(oWriter, "adresse", sAdresse)
  EcrireAuSignet(oWriter, "destinataire", sDestinataire)
  EcrireAuSignet(oWriter, "montant", sMontant)
  
  
  ' Extraction PDF
  Dim repertoire, extension, url, adressedoc, cellule As String  
  	repertoire = "C:\Users\Public\Documents\"
 	cellule = oFeuille.GetCellRangeByName("B9").String 
  	extension = ".pdf" 
 	url = repertoire + cellule + extension 
  
  Dim propFich(0) as New com.sun.star.beans.PropertyValue 
  	adressedoc = ConvertToUrl(url) 
  	propFich(0).Name = "FilterName" 
 	propFich(0).Value = "calc_pdf_Export" 
	propFich(1).Name = "FilterData"
	propFich(1).Value = filtreProps()
	propFich(2).Name = "URL"
	propFich(2).Value = adressedoc
	propFich(3).Name = "Overwrite"
	propFich(3).Value = true
  
        oWriter.storeToURL(adressedoc, propFich())

End Sub

 
   '_____________________________________________________________________________
 'Atteindre le signet passé en paramètre et écriture
 Sub EcrireAuSignet (odoc As Object, sSignet  As String, sTexte As String)
  Dim oTexte As Object
  Dim oSignet As Object, oCurseur As Object
  oSignet = odoc.Bookmarks.getByName(sSignet)
  oTexte = oSignet.Anchor.Text
  oCurseur = oTexte.createTextCursorByRange(oSignet.Anchor.Start)
  oTexte.insertString( oCurseur, sTexte, false)	
  
 End Sub
Le soucis est que cela me renvoi à un message d'erreur...
2024-10-28 11_18_46-Window.png

Autre question, le fichier que je souhaite exporter en PDF est un fichier odt, généré sous Writer.
De ce fait, je me demande si la commande : propFich(0).Value = "Calc_pdf_Export" est bien appropriée :?:

Merci à vous.
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
LibreOffice version 7.2.7.2M7(x64)
Windows 10
Avatar de l’utilisateur
Dude
IdOOle de la suite
IdOOle de la suite
Messages : 25602
Inscription : 03 mars 2006 07:45
Localisation : 127.0.0.1

Re: [Writer] Modifier un ODT depuis Calc puis générer en PDF

Message par Dude »

Salut,

Index hors de la plage :

Code : Tout sélectionner

Dim propFich(3) as New com.sun.star.beans.PropertyValue
Après c'est sûr qu'avec le filtre "Writer_pdf_Export", ça serait mieux.
Avatar de l’utilisateur
jeanmi2403
SuppOOrter
SuppOOrter
Messages : 1466
Inscription : 18 janv. 2008 09:02
Localisation : Val de Marne

Re: [Writer] Modifier un ODT depuis Calc puis générer en PDF

Message par jeanmi2403 »

Bonjour,
arwy a écrit :Autre question, le fichier que je souhaite exporter en PDF est un fichier odt, généré sous Writer.
De ce fait, je me demande si la commande : propFich(0).Value = "Calc_pdf_Export" est bien appropriée :?:
Exact ! Vu qu'il s'agit d'un fichier Writer, le filtre est Writer_pdf_Export.
Entretemps, j'ai travaillé un peu dessus et je me suis rendu compte qu'il y a besoin de moins de paramètres, et j'utilise l'export direct dans une procédure :

Code : Tout sélectionner

' -------------------------
  'créer le nom du fichier avec le nom du client, 
  sAdressePDF =ConvertToURL ( "i:\TrvOpen\Exemples\" &  oFeuille.getCellRangeByName("B9").String  & ".pdf")
  EcrirePDF (oWriter, sAdressePDF)
'----------------------------
Sub EcrirePDF (oDocument as Object, sAdresseDoc as String)
	oFrame = oDocument.CurrentController.Frame
	dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

   dim args1(1) as new com.sun.star.beans.PropertyValue
	args1(0).Name = "URL"
	args1(0).Value = sAdresseDoc
	args1(1).Name = "FilterName"
	args1(1).Value = "writer_pdf_Export"

	dispatcher.executeDispatch(oFrame, ".uno:ExportDirectToPDF", "", 0, args1())
End Sub
Et, ensuite, une procédure pour afficher le PDF généré :

Code : Tout sélectionner

' Lance l'exécution d'un fichier. Dans le cas d'un document, ouvre l'application associée au type de fichier
Sub AfficherPDF(sAdresse as String)
	oShell = createUnoService("com.sun.star.system.SystemShellExecute")
	oShell.execute(ConvertToURL(sAdresse), "" , 0)
End Sub
Et, pour finir, fermer le fichier ouvert sans le sauvegarder :

Code : Tout sélectionner

  oWriter.close(True)
Bonne journée,
Jean-Michel
LibO 24.2 et AoO 4.1.15 sur Windows 11 & Ubuntu 22.04
LibO 24.8 sur OpenSuse & Linux MX
arwy
Fraîchement OOthentifié
Messages : 4
Inscription : 27 oct. 2024 09:35

Re: [Writer] Modifier un ODT depuis Calc puis générer en PDF

Message par arwy »

Et bien un grand merci !
Tout fonctionne à merveille.

:bravo:

Je m'en vais de ce pas continuer à agrémenter mon formulaire de base.
A très vite je pense !!! :wink:
LibreOffice version 7.2.7.2M7(x64)
Windows 10
Avatar de l’utilisateur
Bidouille
RespOOnsable forum
RespOOnsable forum
Messages : 12457
Inscription : 08 nov. 2005 16:23
Localisation : Caen, France

Re: [Writer] Modifier un ODT depuis Calc puis générer en PDF

Message par Bidouille »

Pour clore votre sujet :
  • Placez-vous sur le premier message de votre fil de discussion
  • En haut à droite de ce message, cliquez sur le bouton du petit crayon pour modifier.
  • Modifiez le titre du message en cochant l'icône Image et en tapant [Résolu] (respectez la mise en forme donnée) comme illustré ci-dessous :

    Image