[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 !

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

Messagepar xr13 » 03 Oct 2017 19:38

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 : [url]h**p://ericremoreynolds.github.io/excelpython/quickstart/[/url]
D'avance merci
Xavier


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

Dernière édition par xr13 le 04 Oct 2017 17:04, édité 3 fois.
Libre office 5.4.2.2 sous Ubuntu 16.04
xr13
NOOuvel adepte
NOOuvel adepte
 
Message(s) : 13
Inscrit le : 03 Oct 2017 19:01

Re: [Calc] Python & fonction

Messagepar Jurassic Pork » 04 Oct 2017 06:15

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   AgrandirRéduire
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   AgrandirRéduire
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
Fonction Python - LibreOffice Calc.png (16.46 Kio) Consulté 2192 fois


Vous pourrez ajouter aussi d'autres nouvelles fonctions en éditant les modules python et Basic MesFonctionsPerso.

Ami calmant, J.P
LibreOffice 6.1.x sous windows 10 et LibreOffice 6.0.x sous linux - OpenOffice 4.1.5 sous windows 10
Avatar de l’utilisateur
Jurassic Pork
Membre cOOnfirmé
Membre cOOnfirmé
 
Message(s) : 235
Inscrit le : 09 Août 2017 23:15

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

Messagepar xr13 » 04 Oct 2017 11:44

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/scriptingframework/

Cordialement
Xavier
Libre office 5.4.2.2 sous Ubuntu 16.04
xr13
NOOuvel adepte
NOOuvel adepte
 
Message(s) : 13
Inscrit le : 03 Oct 2017 19:01

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

Messagepar xr13 » 04 Oct 2017 17:01

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/viewtopic.php?f=45&t=62314

Les modifications par rapport au script précédent sont dans le bloc de déclarations initiales :
Code : Tout sélectionner   AgrandirRéduire
'Const URL_Args = "?language=Python&location=user"
Const URL_Args = "?language=Python&location=document"

et puis dans la macro
Code : Tout sélectionner   AgrandirRéduire
'oMSP = getMasterScriptProvider()
oMSP = thisComponent.getScriptProvider()


Ensuite (liens externes prohibés, mais cela vient de là... [url]h**p://christopher5106.github.io/office/2015/12/06/openoffice-libreoffice-automate-your-office-tasks-with-python-macros.html[/url]), 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   AgrandirRéduire
#!/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   AgrandirRéduire
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 5.4.2.2 sous Ubuntu 16.04
xr13
NOOuvel adepte
NOOuvel adepte
 
Message(s) : 13
Inscrit le : 03 Oct 2017 19:01

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

Messagepar LibreOfficiant » 19 Oct 2017 14:01

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/Macros/Python_Design_Guide/fr
Avatar de l’utilisateur
LibreOfficiant
Membre lOOyal
Membre lOOyal
 
Message(s) : 39
Inscrit le : 03 Jan 2017 14:54

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

Messagepar Hubert Lambert » 20 Oct 2017 08:17

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)
Avatar de l’utilisateur
Hubert Lambert
SuppOOrter
SuppOOrter
 
Message(s) : 1174
Inscrit le : 06 Avr 2016 08:26


Retour vers Macros et API

Qui est en ligne ?

Utilisateur(s) parcourant ce forum : Google [Bot] et 4 invité(s)