[Résolu][Python]Créer des fonctions tableur personnalisées

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 !
xr13
NOOuvel adepte
NOOuvel adepte
Messages : 24
Inscription : 03 oct. 2017 18:01

[Résolu][Python]Créer des fonctions tableur personnalisées

Message par xr13 »

Bonjour,
Pour faire simple, est-il possible de reproduire le mécanisme de création de nouvelles fonctions en Python comme on le fait naturellement en VBA et qui soit directement accessible dans le tableur ?
Visiblement cela peut se faire sous Excel : h**p://ericremoreynolds.github.io/excel ... uickstart/
D'avance merci
Xavier

La modération vous a écrit: Liens externes prohibés.

Dernière modification par xr13 le 04 oct. 2017 16:04, modifié 3 fois.
Libre office 6.2.5.2 sous Ubuntu 18.04
Avatar de l’utilisateur
Jurassic Pork
PassiOOnné
PassiOOnné
Messages : 626
Inscription : 09 août 2017 22:15

Re: [Calc] Python & fonction

Message par Jurassic Pork »

hello,
il y a au moins deux solutions :
- Créer un add-in. Pour cela consulter l'excellent tutoriel d'Hubert Lambert ici
- Utiliser un "wrapper" en basic qui va relier la fonction écrite en python à du basic qui peut définir des fonctions personnelles pour calc.
Pour la deuxième solution voici un exemple qui crée une nouvelle fonction qui inverse la chaîne de caractères contenue dans une cellule.
1 - Tout d'abord je conseille fortement d'installer l'extension d'Hubert Lambert apso_v1.1.0.oxt qui se trouve ici.
2 - Créer la fonction Reverse en python :
a - Cliquer sur Menu Outils/Macros/Gérer les scripts python (il faut que l'extension apsos soit installée pour avoir ce menu)
b - Dans la fenêtre qui s'ouvre, sélectionner Mes Macros et cliquer sur le bouton Menu et choisir Nouveau Module.
c - L'appeler MesFonctionsPerso et cliquer sur le bouton OK.
d - Le module est alors disponible dans Mes Macros.
e - Le sélectionner et cliquer sur le bouton Menu.
f - Cliquer sur Modifier, le fichier python MesFonctionsPerso.py s'ouvre alors dans l'éditeur choisi pour l'extension apsos.
Si vous n'avez pas encore désigné un éditeur python pour apsos :
1 - Menu Outils/Gestionnaire des extensions. Sélectionner Apsos et cliquer sur le bouton Options.
2 - Dans la fenêtre qui s'ouvre, cliquer sur le bouton Choisir et donner le chemin de votre éditeur python favori (moi j'utilise Geany )

g - Dans votre éditeur coller ce code :

Code : Tout sélectionner

def Reverse(LaChaine):
    return LaChaine[::-1]
h - Enregister le fichier.

3 - Maintenant que la fonction en python est définie, il faut s'attaquer à la partie "Basic"
4 - Dans Menu Outils/Macros/Gérer les Macros Sélectionner LibreOffice Basic... ou OpenOffice Basic...
5 - Dans la fenêtre qui s'ouvre, sélectionner Mes Macros et cliquer sur le bouton Gérer.
6 - Cliquer sur le bouton Nouveau et taper MesFonctionsPerso comme nom du module.
7 - L'éditer et remplacer le contenu du module par celui-ci :

Code : Tout sélectionner

REM  *****  BASIC  *****
REM Keep a global reference to the ScriptProvider, since this stuff may be called many times:
Global g_MasterScriptProvider
REM Specify location of Python script, providing cell functions:
Const URL_Main = "vnd.sun.star.script:MesFonctionsPerso.py$"
REM &location=user pour les macros personnelles
Const URL_Args = "?language=Python&location=user"

Function getMasterScriptProvider()
   if NOT isObject(g_MasterScriptProvider) then
      oMasterScriptProviderFactory = createUnoService("com.sun.star.script.provider.MasterScriptProviderFactory")
      g_MasterScriptProvider = oMasterScriptProviderFactory.createScriptProvider("")
   endif
   getMasterScriptProvider = g_MasterScriptProvider
End Function

Function GetScript(NomFonction)
   sURL = URL_Main & NomFonction & URL_Args
   oMSP = getMasterScriptProvider()
   GetScript = oMSP.getScript(sURL)
end Function

function Reverse(LaChaine)
   script = GetScript("Reverse")
REM Pour éviter les erreurs de type on force la variable LaChaine en chaîne
   Reverse = script.invoke(Array(CStr(LaChaine)), Array(), Array())
end function
8 - Enregister. Quitter L.O ou O.O et relancer.
9 - Voilà si je n'ai pas raconté de bêtises et si vous n'avez pas fait d'erreur la fonction Reverse devrait être alors disponible dans calc :
Fonction Python - LibreOffice Calc.png
Vous pourrez ajouter aussi d'autres nouvelles fonctions en éditant les modules python et Basic MesFonctionsPerso.

Ami calmant, J.P
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
LibreOffice 7.6.2.1 et OpenOffice 4.1.15 sous windows 11
LibreOffice 24.2.0 et OpenOffice 4.1.15 sous Ubuntu 20.04
xr13
NOOuvel adepte
NOOuvel adepte
Messages : 24
Inscription : 03 oct. 2017 18:01

Re: [Python]Créer des fonctions tableur personnalisées

Message par xr13 »

Bonjour

Un grand merci pour cette super réponse détaillée. Qui fonctionne nickel !!! C'est le top

On peut imaginer le même mécanisme en intégrant les fonctions dans le document ?
http://www.openoffice.org/udk/python/sc ... framework/

Cordialement
Xavier
Libre office 6.2.5.2 sous Ubuntu 18.04
xr13
NOOuvel adepte
NOOuvel adepte
Messages : 24
Inscription : 03 oct. 2017 18:01

Re: [Python]Créer des fonctions tableur personnalisées

Message par xr13 »

Re

Pour intégrer la macro, on crée le test.ods on y ajoute la macro souhaitée en VBA avec quelques modifications tirées de : https://forum.openoffice.org/en/forum/v ... 45&t=62314

Les modifications par rapport au script précédent sont dans le bloc de déclarations initiales :

Code : Tout sélectionner

'Const URL_Args = "?language=Python&location=user"
Const URL_Args = "?language=Python&location=document"
et puis dans la macro

Code : Tout sélectionner

'oMSP = getMasterScriptProvider()
oMSP = thisComponent.getScriptProvider()
Ensuite (liens externes prohibés, mais cela vient de là... h**p://christopher5106.github.io/office ... acros.html), on place son fichier Python MesFonctions.py dans le répertoire du test.ods
On crée ensuite un fichier IncludeMacros.py avec le code suivant :

Code : Tout sélectionner

#!/usr/bin/python
#-*- Encoding: Utf-8 -*-

import zipfile
import shutil
import os
import sys

print("Delete and create directory with_macro")
shutil.rmtree("with_macro",True)
os.mkdir("with_macro")

filename = "with_macro/"+sys.argv[1]
print("Open file " + sys.argv[1])
shutil.copyfile(sys.argv[1],filename)

doc = zipfile.ZipFile(filename,'a')
doc.write("MesFonctions.py", "Scripts/python/MesFonctions.py")
manifest = []
for line in doc.open('META-INF/manifest.xml'):
  if '</manifest:manifest>' in line.decode('utf-8'):
    for path in ['Scripts/','Scripts/python/','Scripts/python/MesFonctions.py']:
      manifest.append(' <manifest:file-entry manifest:media-type="application/binary" manifest:full-path="%s"/>' % path)
  manifest.append(line.decode('utf-8'))

doc.writestr('META-INF/manifest.xml', ''.join(manifest))
doc.close()
print("File created: "+filename)
Puis on lance la commande :

Code : Tout sélectionner

python IncludeMacros.py test.ods
qui crée dans un sous répertoire le [btest.ods[/b] avec le code python inclus.

Il reste à ouvrir le test.ods avec macros et l'utiliser

Xavier
Libre office 6.2.5.2 sous Ubuntu 18.04
Avatar de l’utilisateur
LibreOfficiant
Membre lOOyal
Membre lOOyal
Messages : 40
Inscription : 03 janv. 2017 13:54

Re: [Résolu][Python]Créer des fonctions tableur personnalisé

Message par LibreOfficiant »

De façon générale l'appel de routines écrites dans tout langage supporté par *Office depuis tout langage supporté par *Office est réalisable. L'appel de routines Basic depuis Python en est une illustration.
libO 5.4 64bit, (PortableApps: libO 6.0, aOO 4.1, OOo 3.2 32bit) sur Win7/Win10 x64 | aOO 4.1.x et libO 5.4.x sur Mint 18 Sarah et OSX 10.9 Mavericks x64
Boîte à Outils Python: Geany, PyCharm et bien sûr APSO, MRI..
https://wiki.documentfoundation.org/Mac ... n_Guide/fr
Avatar de l’utilisateur
Hubert Lambert
SuppOOrter
SuppOOrter
Messages : 1214
Inscription : 06 avr. 2016 07:26

Re: [Python]Créer des fonctions tableur personnalisées

Message par Hubert Lambert »

Bonjour,
xr13 a écrit :On crée ensuite un fichier IncludeMacros.py avec le code suivant :
Désolé d'arriver à contre-temps sur ce fil marqué comme résolu, mais je souhaitais signaler qu'APSO permet d'incorporer un module python dans un document d'un simple clic :
Image
Cordialement :wink: .
AOOo 4.1.7 sur Win10
AOOo 4.1.x sur Linux Mint
LibreOffice 5.x/6.x sur Linux Mint
--
| « Nos défauts devraient nous donner une qualité : l'indulgence pour les défauts des autres » (Rivarol)