[Résolu][Python] Étendre une plage nommée dans Calc

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
PierreDeQuébec
NOOuvel adepte
NOOuvel adepte
Messages : 17
Inscription : 27 mai 2015 09:48

[Résolu][Python] Étendre une plage nommée dans Calc

Message par PierreDeQuébec »

Bonjour,

J'ai un module avec le code suivant :

Code : Tout sélectionner

# /usr/bin/python3
# coding: utf8
from __future__ import unicode_literals

# Routines de support pour du code Python relatif à Calc dans LibreOffice.

import sys
import os
import uno


from com.sun.star.uno import RuntimeException

def createUnoService(service, ctx):
    return ctx.ServiceManager.createInstanceWithContext(service, ctx)

def NumberOfLine(Sheet):
    """Compte le nombre de ligne ayant un contenu non vide en dessous de la cellule active. """
    Cursor = Sheet.createCursor()
    Cursor.gotoEndOfUsedArea(True)
    return Cursor.Rows.Count


def SetNewRangeToNamedRange(doc, nameOfRange, newRange):
    """Redéfini une plage nommée existante. Fournir en entrée le nom de la plage et la nouvelle étendue de la plage."""
    oNamedRanges = doc.NamedRanges
    oNamedRange = oNamedRanges.getByName(nameOfRange)
    oNamedRange.setContent(newRange.AbsoluteName)
    return
La function "NumberOfLine" fonctionne bien. Mais la fonction SetNewRangeToNamedRange me retourne le message d'erreur suivant:

Code : Tout sélectionner

com.sun.star.uno.RuntimeException: Error during invoking function TestPython in module file:///home/maison/.config/libreoffice/4/user/Scripts/python/Tests/TestPython.py (<class 'TypeError'>: SetNewRangeToNamedRange() takes 2 positional arguments but 3 were given
  File "/opt/libreoffice6.3/program/pythonscript.py", line 920, in invoke
    ret = self.func( *args )
  File "/home/maison/.config/libreoffice/4/user/Scripts/python/Tests/TestPython.py", line 62, in TestPython
    SetNewRangeToNamedRange(doc, maPlageNom, maPlage)
)
L'appel se fait avec le code suivant :

Code : Tout sélectionner

    #Définir la plage nommée Test.
    maPlageNom = "Test"
    DébutColonne = 0
    FinColonne = 0
    DébutLigne = 0
    FinLigne = t - 1
    maPlage = FeuilleTest.getCellRangeByPosition(DébutColonne, DébutLigne, FinColonne, FinLigne)
    SetNewRangeToNamedRange(doc, maPlageNom, maPlage)
Précision : La routine est déclenchée par un bouton dans la feuille Test. J'utilise IDE_Utils pour établir la connexion entre le fichier calc et le script python.

Toutes mes recherches sur le web aboutissent à un problème de définition de classe. Mais, SetNewRangeToNamedRange est une fonction, pas une classe. Là, je ne comprends pas!

Merci.
Dernière modification par PierreDeQuébec le 16 oct. 2019 00:28, modifié 1 fois.
LibreOffice version: 6.3.1.2, version téléchargée sur Kubuntu 19.04 Disco Dingo. Locale: fr_CA
Noyau 5.0.0-31-generic. Système 64 bits
Avatar de l’utilisateur
Jean-Louis Cadeillan
GourOOu
GourOOu
Messages : 5749
Inscription : 02 janv. 2009 23:56

Re: [Python] : takes 2 positional arguments but 3 were give

Message par Jean-Louis Cadeillan »

Bonjour,
Je ne comprends pas pourquoi tu mets doc en premier argument :

Code : Tout sélectionner

SetNewRangeToNamedRange(doc, nameOfRange, newRange)
et non pas :

Code : Tout sélectionner

SetNewRangeToNamedRange(nameOfRange, newRange)
vu que :
Fournir en entrée le nom de la plage et la nouvelle étendue de la plage.
Cordialement,
Jean-Louis
LibO 7.6.6.3 (x64 avec Java 1.8.0_401) et AOO 4.1.15 (avec Java x32 1.8.0_381), Windows 7 Édition Intégrale 64 SP1
Avatar de l’utilisateur
Hubert Lambert
SuppOOrter
SuppOOrter
Messages : 1214
Inscription : 06 avr. 2016 07:26

Re: [Python] : takes 2 positional arguments but 3 were give

Message par Hubert Lambert »

Bonjour,

Vérifie également le chemin de la macro associée au bouton : tu as peut-être la même fonction définie dans un autre module, voire dans le document lui-même.
Cordialement.
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
PierreDeQuébec
NOOuvel adepte
NOOuvel adepte
Messages : 17
Inscription : 27 mai 2015 09:48

Re: [Python] : takes 2 positional arguments but 3 were give

Message par PierreDeQuébec »

Bonjour,

Merci pour vos réponses.

@Jean-Louis Cadeillan
Initialement, je ne passais pas doc en argument. J'avais alors le message suivant :

Code : Tout sélectionner

com.sun.star.uno.RuntimeException: Error during invoking function TestPython in module file:///home/maison/.config/libreoffice/4/user/Scripts/python/Tests/TestPython.py (<class 'NameError'>: name 'doc' is not defined
  File "/opt/libreoffice6.3/program/pythonscript.py", line 920, in invoke
    ret = self.func( *args )
  File "/home/maison/.config/libreoffice/4/user/Scripts/python/Tests/TestPython.py", line 62, in TestPython
    SetNewRangeToNamedRange(maPlageNom, maPlage)
  File "/home/maison/.config/libreoffice/4/user/Scripts/python/pythonpath/calc.py", line 31, in SetNewRangeToNamedRange
    """Redéfini une plage nommée existante. Fournir en entrée le nom de la plage et la nouvelle étendue de la plage."""
)
C'est pour cela que j'ai tenté de passer doc en argument. Pourtant, doc est une variable globale dans mon fichier. Par ailleurs, le message d'erreur est curieux. Il se termine avec la chaîne descriptive de la fonction.

@Hubert Lambert
J'ai vérifier en appelant la macro python en passant par le menu. J'ai le même message d'erreur.
LibreOffice version: 6.3.1.2, version téléchargée sur Kubuntu 19.04 Disco Dingo. Locale: fr_CA
Noyau 5.0.0-31-generic. Système 64 bits
Avatar de l’utilisateur
OOotremer971
ManitOOu
ManitOOu
Messages : 2744
Inscription : 16 avr. 2010 13:31

Re: [Python] : takes 2 positional arguments but 3 were give

Message par OOotremer971 »

Bonjour,
PierreDeQuébec a écrit :Pourtant, doc est une variable globale dans mon fichier.
Elle n'est donc connue que des bibliothèques de ton fichier. Et inversement, si elle avait été déclarée dans Mes macros, elle ne serait reconnue que dans les bibliothèques de Mes macros.
C'est ce qu'on peut lire dans la bible.

A+
En principe, toujours à jour des dernières versions dites stables
AOO
LibreOffice
Debian 10 et 11
Avatar de l’utilisateur
Hubert Lambert
SuppOOrter
SuppOOrter
Messages : 1214
Inscription : 06 avr. 2016 07:26

Re: [Python] : takes 2 positional arguments but 3 were give

Message par Hubert Lambert »

Tu fournis des extraits de code qui interdisent à quiconque d'espérer comprendre ce qui fonctionne (où et comment est définie la variable "doc" par exemple ?).
Donne-nous plutôt une version simplifiée mais complète des fonctions concernées, idéalement embarquées dans un document test, de manière à reproduire et à examiner le problème.
Si ça se trouve, tu mettras le doigt sur l'erreur rien qu'en faisant cet exercice :wink: .
Merci.
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
PierreDeQuébec
NOOuvel adepte
NOOuvel adepte
Messages : 17
Inscription : 27 mai 2015 09:48

Re: [Python] : takes 2 positional arguments but 3 were give

Message par PierreDeQuébec »

Pour simplifier, j'ai ramené la fonction SetNewRangeToNamedRange dans le script principal. L'erreur sur doc n’apparaît plus. En faisant cela, il est apparu que la fonction ne traitait pas le cas où la plage nommée n'existe pas à l'appel de la fonction. Cela me permet au moins de déboguer la fonction pour qu'elle couvre le cas d'une plage nouvelle. Lorsque cela sera fait, je reviendrais avec la fonction SetNewRangeToNamedRange dans un module. Pour m'aider, j'ai trouvé un exemple de code en BASIC.

@ Hubert Lambert.
J'ai trouvé l'avertissement suivant XSCRIPTCONTEXT is not provided to imported modules à l'adresse suivante https://help.libreoffice.org/6.3/fr/text/sbasic/python/python_programming.html. Que dois-je comprendre? Je ne puis passer une instance du document actif, calc en l'occurrence, en argument à une fonction se trouvant dans un module?
LibreOffice version: 6.3.1.2, version téléchargée sur Kubuntu 19.04 Disco Dingo. Locale: fr_CA
Noyau 5.0.0-31-generic. Système 64 bits
Avatar de l’utilisateur
Hubert Lambert
SuppOOrter
SuppOOrter
Messages : 1214
Inscription : 06 avr. 2016 07:26

Re: [Python] : takes 2 positional arguments but 3 were give

Message par Hubert Lambert »

PierreDeQuébec a écrit :J'ai trouvé l'avertissement suivant XSCRIPTCONTEXT is not provided to imported modules à l'adresse suivante https://help.libreoffice.org/6.3/fr/text/sbasic/python/python_programming.html. Que dois-je comprendre?
Les "modules importés" sont les modules accessible via l'instruction "import module". La variable globale XSCRIPTCONTEXT n'est pas accessible depuis un module importé, seulement depuis le module de base (celui qui contient la fonction appelée par LibreOffice).
En revanche, rien n'interdit de passer XSCRIPTCONTEXT (où les objets auxquelles il donne accès) à une fonction d'un module importé, comme n'importe quel autre objet...
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
Bidouille
RespOOnsable forum
RespOOnsable forum
Messages : 12221
Inscription : 08 nov. 2005 16:23
Localisation : Caen, France

Re: [Python] : takes 2 positional arguments but 3 were give

Message par Bidouille »

Il serait bon d'avoir un titre en rapport avec le problème exposé.
Et non pas un vague message d'erreur qui plus est, en anglais.
PierreDeQuébec a écrit :Lorsque cela sera fait, je reviendrais avec la fonction SetNewRangeToNamedRange dans un module. Pour m'aider, j'ai trouvé un exemple de code en BASIC.
Préférez décrire ce que vous cherchez à faire et non pas ce que vous obtenez à tort.
Exemple : que doit faire votre fonction ?
Ce qui devient : [Python] Nommer une plage sous Calc

Vous êtes invité à corriger en ce sens.
 Ajout : au 11/11/2019
Bien que le titre ait été modifié, plus aucune nouvelle de l'auteur : on en déduit que le fil est résolu.