LO/Aoo interaction avec des applications MacOS et Windows

Discussions sur les projets et applications développés en liaison avec une suite bureautique libre.

Modérateur : Vilains modOOs

Avatar de l’utilisateur
ddorange
Membre hOOnoraire
Membre hOOnoraire
Messages : 120
Inscription : 23 déc. 2015 19:49
Localisation : Annecy
Contact :

LO/Aoo interaction avec des applications MacOS et Windows

Message par ddorange »

Si vous souhaitez depuis LO/AOO piloter des applications sous Windows voyez le sujet 2
Si vous souhaitez depuis MS Word piloter LO/AOO sous MacOS voyez le sujet 3
Si vous souhaitez depuis MS Word piloter LO/AOO, sous Windows voyez le sujet 4


Sujet 1 : Comment piloter, sous MacOS, des applications depuis LO/Aoo

C'est possible sous MacOSX pour les applications "scriptables".

Voici un dossier
Piloter_depuis_LO_Mac.zip
(67.91 Kio) Téléchargé 32 fois
qui contient cinq fichiers :
- Piloter_depuis_LO.odt, Document_macros.docm et Classeur_macros.xlsm doivent être dans le même dossier,
- PiloterW.scpt et dmaths_W.icns doivent être dans /Users/%USER%/Library/Application Scripts/com.microsoft.Word
La transposition pour OOo ne devrait pas poser de problème.

Comme il n'est pas possible de lancer, avec AppleScript une macro Word avec paramètre, le problème est contourné en créant des variables dans le document actif de Word. Par contre, il est possible de lancer une macro Excel avec paramètres.

L'enchaînement ci-dessous permet de lancer des fonctions dans MS Word ou Excel ET de récupérer les valeurs de retour.

On utilise principalement deux macros basic :

Code : Tout sélectionner

Function RunVBMacroMac(MonAppli As String, MacroName As String, Optional mesParametres As String) As Variant
	If MonAppli = "Excel" Then
		Script = "tell application ""Microsoft Excel"" to run VB macro """ & MacroName & """"
		If Not IsMissing(mesParametres) Then
			mesParam = Split(mesParametres, "$")
			For I = 0 To Ubound(mesParam)
				Script =  Script & " arg" & Cstr(I+1) & " """ & mesParam(I) & """"
			Next I
		Endif
	 ElseIf MonAppli = "Word" Then
	 	Script = "tell application ""Microsoft Word""" & Chr(10)
	 	If Not IsMissing(mesParametres) Then
			mesParam = Split(mesParametres, "$")
			For I = 0 To Ubound(mesParam)
				Script =  Script & "	tell active document to delete variable ""Var" & Cstr(I+1) & """"  & Chr(10)
				Script =  Script & "	tell active document to make new variable at it with properties {name:""Var" & Cstr(I+1) _
				& """, variable value:""" & mesParam(I) & """}" & Chr(10)
			Next I
		Endif
	 	Script = Script & "	run VB macro macro name """ & MacroName & """" & Chr(10) _
	 	& "	tell active document to get variable value of variable ""SortieWord""" & Chr(10) _  
	 	& "end tell"
	 End If
	 RunVBMacroMac = Run_Applescript(script)
End Function


Function Run_Applescript(monScript As String, Optional maFonction As String, Optional mesParametres As String, Optional bBoolean As Boolean) As Variant
	Dim iNbreDonnees As Integer
	Dim data() As Variant
	Dim Resul As Variant
	If IsMissing(bBoolean) Then bBoolean = False
	If monScript = "Word" Then monScript = "/Users/" & environ("USER") & "/Library/Application Scripts/com.microsoft.Word/PiloterW.scpt"
	If monScript = "Excel" Then  monScript = "/Users/" & environ("USER") & "/Library/Application Scripts/com.microsoft.Excel/PiloterX.scpt"
	If  IsMissing(maFonction) And IsMissing(mesParametres) Then
		iNbreDonnees = 0
		data = Array(monScript)
	ElseIf (Not IsMissing(maFonction) And IsMissing(mesParametres)) Then
		iNbreDonnees = 1
		Redim data(iNbreDonnees)
		data(0)= monScript
		data(1)= maFonction
	ElseIf (IsMissing(maFonction) And Not IsMissing(mesParametres)) Then
		mesParam = Split(mesParametres, "$")
		iNbreDonnees = Ubound(mesParam) + 1
		Redim data(iNbreDonnees)
		data(0) = monScript
		For I = 1 To Ubound(data)
			data(I) = mesParam(I-1)
		Next I
	Else
		mesParam = Split(mesParametres, "$")
		iNbreDonnees = Ubound(mesParam) + 2
		Redim data(iNbreDonnees)
		data(0) = monScript
		data(1)= maFonction
		For I = 2 To Ubound(data)
			data(I) = mesParam(I-2)
		Next I
	Endif
	Resul = SimpleScript("run_applescript", data)
	If bBoolean Then
		Run_Applescript = CBool(Resul)
	Else
		Run_Applescript = Resul
	Endif
End Function
qui conduisent à l'exécution d'un script Python situé dans Piloter_depuis_LO.odt

Code : Tout sélectionner

def run_applescript(script, *args, **kwargs):
    import os, subprocess
    cmd = ['/usr/bin/osascript', '-l', kwargs.get('lang', 'AppleScript')]
    if os.path.exists(script):
        cmd += [script]
    else:
        cmd += ['-e', script]
    cmd.extend(args)
    try:
        return str(subprocess.check_output(cmd, **kwargs))[2:-3]
    except:
        None
 
ce qui déclenche alors :
- en direct un applescript comme

Code : Tout sélectionner

"tell application ""Microsoft Word"" to get version"
- ou un script contenu dans le fichier PiloterW.scpt comme

Code : Tout sélectionner

on run argv
	set MyFonction to item 1 of argv
	if MyFonction = "NbreDocsWord" then NbreDocsWord()
end run

on NbreDocsWord()
	if Is_Running("Microsoft Word") then
		set nbredoc to 1
		repeat while exists document of window nbredoc of application "Microsoft Word"
			set nbredoc to nbredoc + 1
		end repeat
		set nbredoc to nbredoc - 1
	else
		set nbredoc to 0
	end if
	return nbredoc
end NbreDocsWord
pour trouver le nombre de documents Word ouverts.
Dernière modification par ddorange le 16 avr. 2023 17:04, modifié 37 fois.
LibreOffice 7.5 et OpenOffice 4.1.14 sous Ubuntu 22.10, Windows 7, Windows 10, MacOs Monterey
Avatar de l’utilisateur
ddorange
Membre hOOnoraire
Membre hOOnoraire
Messages : 120
Inscription : 23 déc. 2015 19:49
Localisation : Annecy
Contact :

LO/Aoo interaction avec applications MacOS et Windows

Message par ddorange »

Si vous souhaitez piloter, sous MacOS, des applications depuis LO/Aoo voyez le sujet 1.
Si vous souhaitez depuis MS Word piloter LO/AOO, sous MacOS voyez le sujet 3
Si vous souhaitez depuis MS Word piloter LO/AOO, sous Windows voyez le sujet 4


Sujet 2 : Comment piloter, sous Windows, des applications depuis LO/Aoo

Nous utilisons l'API de Windows

Voici un dossier
Piloter_depuis_LO_Win.zip
(52 Kio) Téléchargé 24 fois
qui contient quatre fichiers :
- Piloter_depuis_LO.odt, Document_macros.docm, Classeur_macros.xlsm et PiloterW.vbs qui doivent être dans le même dossier,
La transposition pour OOo ne devrait pas poser de problème.

On utilise principalement deux macros basic qui permettent de lancer des fonctions dans MS Word ou Excel ET de récupérer les valeurs de retour, comme :

Code : Tout sélectionner

Rem permet de lancer la macro sNomMacro avec ou sans parametre
Rem bWVisible pour Word visible
Function LancerMacroWord(sNomMacro As String, Optional sCheminDocMacro As String, Optional sParam As String, Optional bWVisible As Boolean)
	Dim iCompteur as Integer
	Dim name As String, value As String
	Dim myWS As Object
	
	If IsMissing(bWVisible) Then bWVisible = False
	If IsMissing(sParam) Then sParam = ""
	If IsMissing(sCheminDocMacro) Then sCheminDocMacro = ""	
	iCompteur = 0
	
	On Error Goto Tempo:
	
	Set myWS = CreateObject("WScript.Shell")
	name = "HKEY_CURRENT_USER\Software\Microsoft\Office\16.0\Word\Security\VBAWarnings"
	If RegKeyExists(name) Then value = myWS.RegRead(name)
	myWS.RegWrite name, "1", "REG_DWORD"
	
	Set oWord = CreateObject("Word.Application")
	oWord.Visible = bWVisible
	oWord.WindowState = 1 'wdWindowStateMaximize
	
	If Len(sCheminDocMacro) > 0 Then  Rem macros dans sCheminDocMacro sinon macro dans un template
		Set oDoc = oWord.Documents.Open(sCheminDocMacro & ".docm")
	Endif
	
	oWord.Activate
		
	If Len(sParam) > 0 Then
		LancerMacroWord = oWord.Run (sNomMacro, sParam)
	Else
		LancerMacroWord = oWord.Run (sNomMacro)
	Endif
	
	If Len(value) > 0 Then myWS.RegWrite name, value, "REG_DWORD"
	 
	Wait 500

	Exit Function
	
	Tempo:
	iCompteur = iCompteur + 1
	Wait 50
	If iCompteur > 20 Then
		oWord.Quit
		Print iCompteur
		Exit Function
	Else 
		Resume
	End if
End Function
Le fichier PiloterW.vbs permet de déterminer si MS Word est lancée ainsi que le nombre de documents ouverts sans qu'apparaisse la console Windows.
Dernière modification par ddorange le 16 avr. 2023 17:05, modifié 17 fois.
LibreOffice 7.5 et OpenOffice 4.1.14 sous Ubuntu 22.10, Windows 7, Windows 10, MacOs Monterey
Avatar de l’utilisateur
ddorange
Membre hOOnoraire
Membre hOOnoraire
Messages : 120
Inscription : 23 déc. 2015 19:49
Localisation : Annecy
Contact :

LO/Aoo interaction avec des applications MacOS et Window

Message par ddorange »

Si vous souhaitez piloter, sous MacOS, des applications depuis LO/Aoo voyez le sujet 1
Si vous souhaitez piloter, sous Windows, des applications depuis LO/AOO voyez le sujet 2
Si vous souhaitez depuis MS Word piloter LO/AOO, sous Windows voyez le sujet 4


Sujet 3 : Comment depuis MS Word piloter LO/AOO sous MacOS

Voici un dossier
Piloter_depuis_Office_Mac.zip
(86.68 Kio) Téléchargé 35 fois
qui contient quatre fichiers :
- Piloter_depuis_Office.docm le fichier principal,
- PiloterLOByOffice.oxt une extension contenant les macros pour les tests,
- PiloterW.scpt qui doit être dans /Users/%USER%/Library/Application Scripts/com.microsoft.Word
- RunBasicMacro.py qui doit être dans /Users/%USER%/Library/Application Support/LibreOffice/4/user/Scripts/python
La transposition pour OOo ne devrait pas poser de problème.

La fonction :

Code : Tout sélectionner

#If Mac Then
Function runScriptMac(sLaMacro As String, sLesParametres As String, bAvecSortie As Boolean, Optional bGetBoolean As Boolean) As Variant
    If IsMissing(bGetBoolean) Then bGetBoolean = False
            Rem prise en charge DummyArray
            If bAvecSortie Then
                    If Len(sLesParametres) = 0 Then sLesParametres = "True"
                    sLeParametre = sLaMacro & "$" & sLesParametres
                    RunMyScript = AppleScriptTask("PiloterW.scpt", "LanceMacroViaPython", sLeParametre)
                    On Error Resume Next
                    If bGetBoolean Then
                            runScriptMac = CBool(RunMyScript)
                    Else
                            runScriptMac = RunMyScript
                    End If
                    On Error GoTo 0
            Else
                    sLaMacro = sLaMacro & "(" & sLesParametres & ")"
                    RunMyScript = AppleScriptTask("PiloterW.scpt", "LanceMacro", sLaMacro)
            End If
    End Function
#End If
permet de lancer des applescripts contenus dans PiloterW.scpt qui pilotent les macros de LibreOffice via le script Python RunBasicMacro.py ET de récupérer les valeurs de retour :

Code : Tout sélectionner

on LanceMacroViaPython(Parametre)
	if not Is_Running("soffice") then tell application "LibreOffice" to launch
	ReduitToutSaufWord()
	set NomUtilisateur to system attribute "USER"
	set MonScriptPython to "/Users/" & NomUtilisateur & "/Library/Application Support/LibreOffice/4/user/Scripts/python/RunBasicMacro.py"
	set MonExecPython to "/Applications/LibreOffice.app/Contents/Resources/python"
	set {sLaMacro, sParametre} to SplitString(Parametre, "$")
	set monChemin to MonExecPython & " " & quoted form of MonScriptPython & " " & quoted form of sLaMacro & " " & quoted form of sParametre
	do shell script (monChemin)
end LanceMacroViaPython

on LanceMacro(Parametre)
	tell application "LibreOffice" to launch
	set monChemin to quoted form of ("/Applications/LibreOffice.app/Contents/Resources/../MacOS/soffice") & " --invisible  macro:///" & quoted form of Parametre
	do shell script (monChemin)
end LanceMacro

on SplitString(TheBigString, fieldSeparator)
	tell AppleScript
		set oldTID to text item delimiters
		set text item delimiters to fieldSeparator
		set theItems to text items of TheBigString
		set text item delimiters to oldTID
	end tell
	return theItems
end SplitString
Les tests s'effectuent en lançant les macros du fichier Piloter_depuis_Office.docm.
Dernière modification par ddorange le 12 avr. 2023 06:49, modifié 20 fois.
LibreOffice 7.5 et OpenOffice 4.1.14 sous Ubuntu 22.10, Windows 7, Windows 10, MacOs Monterey
Avatar de l’utilisateur
ddorange
Membre hOOnoraire
Membre hOOnoraire
Messages : 120
Inscription : 23 déc. 2015 19:49
Localisation : Annecy
Contact :

LO/Aoo interaction avec des applications MacOS et Windows

Message par ddorange »

Si vous souhaitez piloter, sous MacOS, des applications depuis LO/Aoo voyez le sujet 1
Si vous souhaitez piloter, sous Windows, des applications depuis LO/AOO voyez le sujet 2
Si vous souhaitez depuis MS Word piloter LO/AOO, sous MacOS voyez le sujet 3


Sujet 4 : Comment depuis MS Word piloter LO/AOO sous Windows

On utilise l'excellent outil VBA_OOo_v11fr développé par Bernard Marcelly que l'on peut télécharger sur son site personnel.

Voici un dossier
Piloter_depuis_Office_Win.zip
(76.13 Kio) Téléchargé 26 fois
qui contient deux fichiers :
- Piloter_depuis_Office.docm le fichier principal, contenant les routines de VBA_OOo_v11fr, permet de faire les tests,
- PiloterLOByOffice.oxt une extension contenant les macros nécessaires.
La transposition pour OOo ne devrait pas poser de problème.
LibreOffice 7.5 et OpenOffice 4.1.14 sous Ubuntu 22.10, Windows 7, Windows 10, MacOs Monterey
Avatar de l’utilisateur
ddorange
Membre hOOnoraire
Membre hOOnoraire
Messages : 120
Inscription : 23 déc. 2015 19:49
Localisation : Annecy
Contact :

Re: LO/Aoo interaction avec des applications MacOS et Windows

Message par ddorange »

Bonjour à tous,
J'ai mis à jour ce tutoriel datant de 2020.
Je laisse le soin aux modérateurs de juger si cela peut devenir un Suprême de Code.
LibreOffice 7.5 et OpenOffice 4.1.14 sous Ubuntu 22.10, Windows 7, Windows 10, MacOs Monterey
Répondre