[Résolu][Calc] Envoi par courriel 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 !
Avatar de l’utilisateur
Sbalteur
Membre OOrganisé
Membre OOrganisé
Messages : 55
Inscription : 12 juin 2014 16:01

[Résolu][Calc] Envoi par courriel en PDF

Message par Sbalteur »

Bonjour,

(En espérant avoir respecter toutes les règles du forum...)

Je recherche depuis plusieurs jours une macro permettant d'envoyer de façon automatique un mail avec en pièce jointe un fichier PDF issu d'une sélection d'une plage active.

J'ai ce code qui fonctionne à merveille pour l'envoi du mail mais avec une pièce jointe au format ODS et avec la feuille complète :

Code : Tout sélectionner

Sub SendMel
       Dim oMailer as Object, unClient as Object, monMel as Object
       Dim enCopie(0) as String, annexes(0) as String
       If GetGUIType=1 Then
            oMailer=CreateUnoService("com.sun.star.system.SimpleSystemMail")
         Else
            oMailer=CreateUnoService("com.sun.star.system.SimpleCommandMail")
         End If
       unClient = oMailer.querySimpleMailClient()
       If IsNull(unClient) then
          MsgBox("Client de messagerie non disponible", 16)
          stop
       End If   
       monMel = unClient.createSimpleMailMessage()
       enCopie(0) = "second_destinataire@test.com"
       annexes(0)= ThisComponent.getURL
       with monMel
          'XRAY monMel
          .Recipient = "destinataire@test.com"
          .CcRecipient = enCopie()
          .Originator = "expediteur@test.com"
          .Subject = "Sauvegarde de mon Doc"
          .Attachement = annexes()
       end with
       unClient.sendSimpleMailMessage(monMel,0)'0 necessite l'intervention de l'utilisateur pour envoyer '1 Envoi auto
    End Sub
Quel code changer pour que la pièce jointe soit en format PDF (et si possible en ne sélectionnant qu'une partie de la feuille...)
J'ai essayé d'incorporer ce code

Code : Tout sélectionner

dispatcher.executeDispatch(monDoc, ".uno:SendMailDocAsPDF", "", 0, Array(),)
mais rien n'y fait (je ne dois pas l'insérer au bon endroit...)...

Et deuxième question, comment changer ce code,

Code : Tout sélectionner

.Recipient = "destinataire@test.com"
pour que l'adresse courriel provienne d'une cellule donnée..?

Je vous remercie d'avance... j'écume les forums et wiki depuis de nombreux jours sans résultats... :(

Ci joint mon fichier .ods.

Bien Cordialement.
Pièces jointes
envoicourrielPDF.ods
(9.49 Kio) Téléchargé 135 fois
Dernière modification par Sbalteur le 05 déc. 2015 14:52, modifié 2 fois.
Libre Office 3.6.5.2 sous WINDOWS 10 - MAJ proscrites par mon employeur...
Avatar de l’utilisateur
Dude
Grand Maître de l'OOffice
Grand Maître de l'OOffice
Messages : 23378
Inscription : 03 mars 2006 09:45
Localisation : 127.0.0.1
Contact :

Re: [Calc] Envoi par mail en PDF

Message par Dude »

Salut,
Sbalteur a écrit :j'écume les forums et wiki depuis de nombreux jours sans résultats...
En faisant une recherche sur "courriel" et non "mail" qui est une allée arborée en français, on trouve la même question posée il y a quelques mois :
[Résolu][Calc] Export en PDF et envoi par courriel
Avatar de l’utilisateur
Sbalteur
Membre OOrganisé
Membre OOrganisé
Messages : 55
Inscription : 12 juin 2014 16:01

Re: [Calc] Envoi par mail en PDF

Message par Sbalteur »

Bonjour,

Merci pour votre réponse.

Je viens d'étudier les informations que vous m'avez fournies, néanmoins le code proposé (ainsi que le suprême) ne fonctionne pas pour ma version de Libre Office...

Il me faudrait simplement une macro toute simple pour envoyer un courriel sans avoir à passer par le menu Fichier (Lorsque j'utilise l'enregistreur de macro, à son lancement la macro se stoppe sur le menu).

En vous remerciant d'avance.

Cordialement.
Libre Office 3.6.5.2 sous WINDOWS 10 - MAJ proscrites par mon employeur...
Avatar de l’utilisateur
Dude
Grand Maître de l'OOffice
Grand Maître de l'OOffice
Messages : 23378
Inscription : 03 mars 2006 09:45
Localisation : 127.0.0.1
Contact :

Re: [Calc] Envoi par mail en PDF

Message par Dude »

Sbalteur a écrit :néanmoins le code proposé (ainsi que le suprême) ne fonctionne pas pour ma version de Libre Office...
Pour les versions antédiluviennes, il reste à coder une macro en Python.
Sbalteur a écrit :Il me faudrait simplement une macro toute simple
Déjà expliqué plusieurs fois, une "macro simple" est un oxymore. :lol:
Avatar de l’utilisateur
luky-luke
InconditiOOnnel
InconditiOOnnel
Messages : 936
Inscription : 27 nov. 2010 02:17
Localisation : gâtine deux-sèvrienne

Re: [Calc] Envoi par courriel en PDF

Message par luky-luke »

Bonjour

Une macro simple :lol: pour enregistrer et envoyer une sélection au format PDF.
Courriel_Export_Selection.ods
(15.43 Kio) Téléchargé 299 fois
Un peu plus d'explication dans les suprêmes de code
Cordialement
Luke
AOO 4.1.3 et LibO 5.3.7.2 Ubuntu 16.04 LTS et Debian 9
Xray ne tient pas lieu de tout, mais une pratique sans Xray ne vaut pas grand chose
Avatar de l’utilisateur
Sbalteur
Membre OOrganisé
Membre OOrganisé
Messages : 55
Inscription : 12 juin 2014 16:01

Re: [Calc] Envoi par courriel en PDF

Message par Sbalteur »

Bonjour,

Un grand "Thanks" (Merci pour les anti anglophones) à tous les deux !

Voila une semaine que je bidouille le code avec des résultats mitigés... les nuits ne sont pas assez longues...

Sans abuser, pour me permettre de finaliser le code, comment ne sélectionner qu'un seul onglet à envoyer prédéfini dans le code de la macro au lieu du classeur complet ? (Du style j'ai autant de boutons que d'onglets...).

Bien Cordialement.
Libre Office 3.6.5.2 sous WINDOWS 10 - MAJ proscrites par mon employeur...
Avatar de l’utilisateur
luky-luke
InconditiOOnnel
InconditiOOnnel
Messages : 936
Inscription : 27 nov. 2010 02:17
Localisation : gâtine deux-sèvrienne

Re: [Calc] Envoi par courriel en PDF

Message par luky-luke »

Bonjour
Sbalteur a écrit :comment ne sélectionner qu'un seul onglet à envoyer prédéfini dans le code de la macro
En modifiant la macro Main dans l'onglet SendMail.

Code : Tout sélectionner

Sub Main
Dim UrlDoc
Dim Recipient(), Subject, Body
Dim Rep, ReMsgBox As integer
Dim oDoc as object, IndexFeuille As integer

IndexFeuille = InputBox("Veuillez spécifier le numéro de feuille")

'URL et nom du fichier au format pdf.
	Rep = split(ThisComponent.URL, "/") 'on divise
	Rep(Ubound(Rep)) = "TestExportPDF.pdf" 'un nouveau nom et l'extension
	UrlDoc = ConvertToUrl(join(Rep,"/") ' assemblage pour une adresse complete
	
	Zone_Impress(IndexFeuille) 'Definie la zone d'impression et la feuille

'--- Spécifie le filtre de conversion ---	
dim ArgsProprietes(2) as new com.sun.star.beans.PropertyValue	
	ArgsProprietes(0).Name = "FilterName"
	ArgsProprietes(0).Value = "calc_pdf_Export"
	ArgsProprietes(1).Name = "CompressMode"
	ArgsProprietes(1).Value = 1
'--- exporte au format PDF ---
ThisComponent.storeToUrl( UrlDoc , ArgsProprietes())

	Delete_Impress(IndexFeuille) 'Supprime la zone d'impression
	
	Recipient = Destinataire
	Subject = Objet
	Body = CorpsDeTexte
	
	ReMsgBox = MsgBox("Envoyer par courrier la pièce jointe ? ",36,"Sauvegarde PDF")
	If ReMsgBox = 6 Then ' oui
		SendMail(Recipient, Subject, Body, UrlDoc)
		print " Courrier envoyé "
	Else ' non
		Print "Fichier PDF enregistré"
	End if
	
End Sub
Et en modifiant les deux macro suivante dans l'onglet Utils

Code : Tout sélectionner

sub Zone_Impress(IndexFeuille)
rem ----------------------------------------------------------------------
rem define variables
dim document   as object
dim dispatcher as object
rem ----------------------------------------------------------------------
rem get access to the document
document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
rem ----------------------------------------------------------------------
dim args1(1) as new com.sun.star.beans.PropertyValue
args1(0).Name = "Nr"
args1(0).Value = IndexFeuille
dispatcher.executeDispatch(document, ".uno:JumpToTable", "", 0, args1())
rem ----------------------------------------------------------------------
dim args2(0) as new com.sun.star.beans.PropertyValue
args2(0).Name = "ToPoint"
args2(0).Value = "$B$13:$H$25"

dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args2())

rem ----------------------------------------------------------------------
dispatcher.executeDispatch(document, ".uno:DefinePrintArea", "", 0, Array())

End sub

Sub Delete_Impress(IndexFeuille)
rem ----------------------------------------------------------------------
rem define variables
dim document   as object
dim dispatcher as object
rem ----------------------------------------------------------------------
rem get access to the document
document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
rem ----------------------------------------------------------------------
dim args1(0) as new com.sun.star.beans.PropertyValue
args1(0).Name = "Nr"
args1(0).Value = IndexFeuille
dispatcher.executeDispatch(document, ".uno:JumpToTable", "", 0, args1())
rem ----------------------------------------------------------------------
dim args2(0) as new com.sun.star.beans.PropertyValue
args2(0).Name = "ToPoint"
args2(0).Value = "$B$13:$H$25"

dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args2())

rem ----------------------------------------------------------------------
dispatcher.executeDispatch(document, ".uno:DeletePrintArea", "", 0, Array())

end sub
Une boite de dialogue (InputBox) s'ouvre et demande le numéro de feuille. L'argument est ensuite utilisé par les deux macros qui ajoutent ou supprime une zone d'impréssion. Si les zones d’Impression sont déjà définies feuille par feuille (Format > Zones d'impression), il est alors inutile de les déclarer dans les deux macro Zone_Impress(IndexFeuille) et Delete_Impress(IndexFeuille)

Cordialement
Luke
AOO 4.1.3 et LibO 5.3.7.2 Ubuntu 16.04 LTS et Debian 9
Xray ne tient pas lieu de tout, mais une pratique sans Xray ne vaut pas grand chose
Avatar de l’utilisateur
Sbalteur
Membre OOrganisé
Membre OOrganisé
Messages : 55
Inscription : 12 juin 2014 16:01

Re: [Calc] Envoi par courriel en PDF

Message par Sbalteur »

Et bien... merci encore..! Franchement c'est enrichissant de pouvoir compter sur des pros.!!
J'essayerai ce soir à la maison car il ne fonctionne pas avec la version de Libre Office que j'utilise ici :(

Par contre j'ai le même soucis ici avec cette macro, le fichier .ods joint au courriel est le classeur entier alors que je souhaite sélectionner la feuille 2 ou la feuille 3 (Si je dois ouvrir un autre fil, veuillez me pardonner...) :

Code : Tout sélectionner

     Sub export_feuille2
       Dim oMailer as Object, unClient as Object, export_feuille2 as Object, oFeuille As Object
       Dim enCopie(0) as String, annexes(0) as String
       If GetGUIType=1 Then
            oMailer=CreateUnoService("com.sun.star.system.SimpleSystemMail")
         Else
            oMailer=CreateUnoService("com.sun.star.system.SimpleCommandMail")
         End If
       unClient = oMailer.querySimpleMailClient()
       If IsNull(unClient) then
          MsgBox("Client de messagerie non disponible", 16)
          stop
       End If   
       export_feuille2 = unClient.createSimpleMailMessage()
       oFeuille = ThisComponent.Sheets.GetByName("feuille2")
       enCopie(0) = "courriel1@moi.fr, courriel2@moi.fr"
       annexes(0)= ThisComponent.getURL
       with export_feuille2
           .Recipient = oFeuille.GetCellRangeByName("C3").String
           .CcRecipient = enCopie()
           .Subject = "Sujet de test"
           .Attachement = annexes()
       end with
       unClient.sendSimpleMailMessage(export_feuille2,0)'0 necessite l'intervention de l'utilisateur pour envoyer '1 Envoi auto
    End Sub
En fait il faudrait que le fichier attaché .ods ne comporte que la feuille sélectionnée...

Encore merci pour votre patience...

Cordialement.
Libre Office 3.6.5.2 sous WINDOWS 10 - MAJ proscrites par mon employeur...
Avatar de l’utilisateur
luky-luke
InconditiOOnnel
InconditiOOnnel
Messages : 936
Inscription : 27 nov. 2010 02:17
Localisation : gâtine deux-sèvrienne

Re: [Calc] Envoi par courriel en PDF

Message par luky-luke »

Bonjour
Sbalteur a écrit :En fait il faudrait que le fichier attaché .ods ne comporte que la feuille sélectionnée...
Il faut donner à la variable annexes(0) une adresse URL. Ce qui donne pour la feuille2 :
ConvertToUrl(ThisComponent.getURL & "#Feuille2"
Et .Recipient c'est le destinataire du courrier.

Code : Tout sélectionner

           annexes(0)= ConvertToUrl(ThisComponent.getURL & "#feuille2")
           with export_feuille2
               .Recipient = "LeDestinataire@MonFAI.fr"
               .CcRecipient = enCopie()
               .Subject = "Sujet de test"
               .Attachement = annexes()
           end with
Cordialement
Luke
AOO 4.1.3 et LibO 5.3.7.2 Ubuntu 16.04 LTS et Debian 9
Xray ne tient pas lieu de tout, mais une pratique sans Xray ne vaut pas grand chose
Avatar de l’utilisateur
Sbalteur
Membre OOrganisé
Membre OOrganisé
Messages : 55
Inscription : 12 juin 2014 16:01

Re: [Calc] Envoi par courriel en PDF

Message par Sbalteur »

Encore merci...

Je viens de faire la modification et cela me met un message d'erreur :
Erreur d'éxécution BASIC.
Une exception s'est produite :
Type: com.sun.star.lang.IllegalArgumentException
Message: Invalid attachment file URL.

:(

Je n'y comprends plus rien...

Cordialement.
Libre Office 3.6.5.2 sous WINDOWS 10 - MAJ proscrites par mon employeur...
Avatar de l’utilisateur
luky-luke
InconditiOOnnel
InconditiOOnnel
Messages : 936
Inscription : 27 nov. 2010 02:17
Localisation : gâtine deux-sèvrienne

Re: [Calc] Envoi par courriel en PDF

Message par luky-luke »

Bonjour

Je ne reproduis pas ce que tu décris. Avec quel version AOo ou LibO tu travail ?
Je te rappelle que le sujet du message est envoi par courriel en PDF, et là tu veux envoyer une feuille du document. Si ta demande est d'envoyer la feuille deux (au format PDF) en pièce jointe. Le fichier joint dans mon message précédent et qui utilise le service
com.sun.star.mail.MailServiceProvider
à été testé avec AOo4.4.1 et LibO4.4.6. Il fonctionne à la maison et réponds à ta question si tu respecte les impératifs de configuration de ton courrielleur dans le module SendMail

Code : Tout sélectionner

'Configuration des parametres compte courrier
Const smtpPassword$ = "MonMotDePasse"
Const UserName$ = "MonNomD'utilisateur"
Const Useradress$ = "MonAdresse@moi.fr"
Const ServerName$ = "smtp.moi.fr"
Const ServerPort = 25 'le cas le plus général
Const ServerSecure$ = "SSL"'"Insecure" 'ou "STARTTSL"
Dude a écrit :une "macro simple" est un oxymore. :lol:
Cordialement
Luke
AOO 4.1.3 et LibO 5.3.7.2 Ubuntu 16.04 LTS et Debian 9
Xray ne tient pas lieu de tout, mais une pratique sans Xray ne vaut pas grand chose
Avatar de l’utilisateur
Sbalteur
Membre OOrganisé
Membre OOrganisé
Messages : 55
Inscription : 12 juin 2014 16:01

Re: [Calc] Envoi par courriel en PDF

Message par Sbalteur »

Bonjour,

En fait oui, ma version de Libre Office est la 3.6.5.2 et je n'ai pas de configuration de mon courrielleur...

Avec cette macro cela fonctionne mais pour tout le classeur .ods :

Code : Tout sélectionner

 Sub export_CD
       Dim oMailer as Object, unClient as Object, export_CD as Object, oFeuille As Object
       Dim enCopie(0) as String, annexes(0) as String
       If GetGUIType=1 Then
            oMailer=CreateUnoService("com.sun.star.system.SimpleSystemMail")
         Else
            oMailer=CreateUnoService("com.sun.star.system.SimpleCommandMail")
         End If
       unClient = oMailer.querySimpleMailClient()
       If IsNull(unClient) then
          MsgBox("Client de messagerie non disponible", 16)
          stop
       End If   
       CD = unClient.createSimpleMailMessage()
       oFeuille = ThisComponent.Sheets.GetByName("MENU")
       enCopie(0) = "courriel1@moi.fr, courriel2@moi.fr"
       annexes(0)= ThisComponent.getURL
       with CD
           .Recipient = oFeuille.GetCellRangeByName("C3").String
           .CcRecipient = enCopie()
           .Subject = "Test sujet"
           .Attachement = annexes()
       end with
       unClient.sendSimpleMailMessage(CD,0)'0 necessite l'intervention de l'utilisateur pour envoyer '1 Envoi auto
    End Sub
Je joinsmon fichier test, le courriel est bien initialisé mais l'ensemble du classeur est attaché...

Merci.

Cordialement.
Pièces jointes
Export_ods.ods
(18.68 Kio) Téléchargé 153 fois
Libre Office 3.6.5.2 sous WINDOWS 10 - MAJ proscrites par mon employeur...
Avatar de l’utilisateur
Dude
Grand Maître de l'OOffice
Grand Maître de l'OOffice
Messages : 23378
Inscription : 03 mars 2006 09:45
Localisation : 127.0.0.1
Contact :

Re: [Calc] Envoi par courriel en PDF

Message par Dude »

Sbalteur a écrit :le courriel est bien initialisé mais l'ensemble du classeur est attaché...
Logique, la macro fait ce que tu lui demandes :

Code : Tout sélectionner

annexes(0)= ThisComponent.getURL
Avec cette ligne, tu mets l'URL de ton document en PJ.
Avatar de l’utilisateur
Sbalteur
Membre OOrganisé
Membre OOrganisé
Messages : 55
Inscription : 12 juin 2014 16:01

Re: [Calc] Envoi par courriel en PDF

Message par Sbalteur »

Oui mais quand je mets le code de luky-luke :

Code : Tout sélectionner

annexes(0) = ConvertToUrl(ThisComponent.getURL & "#feuille2")
Cela ne fonctionne pas et me retourne l'erreur... :(

Comment puis je faire... j'ai tout essayé...
Libre Office 3.6.5.2 sous WINDOWS 10 - MAJ proscrites par mon employeur...
Avatar de l’utilisateur
Dude
Grand Maître de l'OOffice
Grand Maître de l'OOffice
Messages : 23378
Inscription : 03 mars 2006 09:45
Localisation : 127.0.0.1
Contact :

Re: [Calc] Envoi par courriel en PDF

Message par Dude »

Code : Tout sélectionner

annexes(0) = ConvertToUrl(ThisComponent.getURL & "#feuille2")
Est-ce que tu essayes au moins de comprendre le code fourni ?
Tu passes l'URL du classeur complet suivie d'une option visant à l'ouvrir sur la feuille 2.
Je ne suis pas sûr que le courrielleur comprenne ce que tu cherches à faire.
De toute façon, ce type de lien ne fonctionne pas pour le destinataire.
Pour le prouver, essaye par exemple d'ouvrir cette URL sous Windows par le menu Démarrer > Exécuter.

Comme solution, je ne vois que la fabrication d'un classeur uniquement composé de la feuille.
Tu as ce suprême qui montre comment faire un copier / coller d'une plage dans un nouveau classeur.
Il te suffira de passer l'URL de ce dernier.
Avatar de l’utilisateur
Sbalteur
Membre OOrganisé
Membre OOrganisé
Messages : 55
Inscription : 12 juin 2014 16:01

Re: [Calc] Envoi par courriel en PDF

Message par Sbalteur »

Merci très sincèrement à tous les deux pour le temps consacré à mon problème..! 8)

Je viens enfin de trouver la solution avec l'ensemble de vos propositions... la tache a été longue et ardue mais je suis soulagé !
(J'ai partagé mon projet en plusieurs classeurs)

Encore merci beaucoup.

Bien Cordialement.
Libre Office 3.6.5.2 sous WINDOWS 10 - MAJ proscrites par mon employeur...
Verrouillé