Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 30/01/2023, à 09:43

Compte supprimé

[Résolu] Macro python dans Calc : comment utiliser une extension ?

Bonjour,
Pour automatiser un enchaînement de clics et de touches claviers dans un classeur Calc, je tente d'enregistrer une macro, mais cela ne fonctionne pas comme attendu.

Je pense avoir compris comment enregistrer une macro et j'en ai fait quelques unes pour tester la chose et ça fonctionne bien. Mais celle que je voudrais faire se sert d'un point du menu qui utilise une extension en python pour importer des données au format ics et les enregistrer au format csv.
Quand j'édite la macro enregistrée, je vois que tout le début, pour effacer la feuille, est bien noté. Par contre, dès que je sélectionne avec la souris le point de menu de l'extension, plus rien ne s'enregistre.

Après recherche, il se pourrait que ce soit une des limites de la méthode d'enregistrement. L'extension ouvre une boîte de dialogue pour demander l'url du fichier à importer et cela arrête l'enregistrement.
Est-ce bien cela ?

La doc LO a écrit :

Les actions suivante ne sont pas enregistrées :

    L'ouverture d'une fenêtre n'est pas enregistrée.

    Les actions réalisées dans une fenêtre autre que celle dans laquelle l'enregistreur a été démarré ne sont pas enregistrées.

    Le changement de fenêtre n'est pas enregistré.

    Les actions indépendantes du contenu du document ne sont pas enregistrées. Par exemple, les modifications réalisées dans une boîte de dialogue d'options, l'organisateur de macros ou la personnalisation.

Le Github de l'extension :
https://github.com/prometheus42/libreof … -importer/

Le classeur en question :
https://depot.kaz.bzh/f.php?h=1KUv7zB2&d=1

La manipulation prévue dans la feuille :
https://forum.kubuntu-fr.org/viewtopic. … #p22643779

Dernière modification par Compte supprimé (Le 03/02/2023, à 12:15)

#2 Le 30/01/2023, à 12:20

Rafbor

Re : [Résolu] Macro python dans Calc : comment utiliser une extension ?

En effet, cela semble bien être une limitation, on ne peut pas enregistrer l'appel à l'extension par le menu.

La solution serait d'appeler l'extension via une macro en basic, j'ai trouvé un lien qui explique comment faire ici.
C'est à tester.
Pour info, chez moi le fichier import_ical.py s'est installé ici:

/home/raf/.config/libreoffice/4/user/uno_packages/cache/uno_packages/lu144935xi11.tmp_/import_ical.oxt/src

Xubuntu 22.04 - Mes projets sur Github

Hors ligne

#3 Le 30/01/2023, à 12:31

Compte supprimé

Re : [Résolu] Macro python dans Calc : comment utiliser une extension ?

Merci, donc il faut écrire une macro en s'inspirant de :

doc = thiscomponent
    uri = "vnd.sun.star.script:apso.oxt|python|pythonpath|apso_utils.py$console?language=Python&location=user:uno_packages"
    mspf = createUnoService("com.sun.star.script.provider.MasterScriptProviderFactory")
    msp = mspf.createScriptProvider("")
    script = msp.getScript(uri)
    script.invoke(array(), array(), array())

Mais il y a certainement des commandes à placer avant et après. Je peux adapter l'url et coller comme cela ?

Effectivement la commande :

[toto@elitedesk ~]$ python3 /home/toto/.config/libreoffice/4/user/uno_packages/cache/uno_packages/lu16026538qe.tmp_/import_ical.oxt/src/import_ical.py

Lance la macro, demande le chemin vers le calendrier et ouvre un classeur Calc avec les données importées.
Pourra-t-on mettre le chemin dans la macro ?

Dernière modification par Compte supprimé (Le 30/01/2023, à 13:01)

#4 Le 30/01/2023, à 12:41

Rafbor

Re : [Résolu] Macro python dans Calc : comment utiliser une extension ?

Il faut créer une macro et y coller le code dedans, mais aussi il faut remplacer "apso.oxt" par "import_ical.oxt" et lancer la macro.
J'ai pas encore testé.

Edit: ça marche pas, même en modifiant l'uri

uri = "vnd.sun.star.script:import_ical.oxt|python|pythonpath|import_ical.py$console?language=Python&location=user:uno_packages"

D'après la doc, il faut donner le nom de la fonction à appeler dans l'uri ($myFunction)

vnd.sun.star.script:myExtension.oxt|myScript|myModule.py$myFunction?language=Python&location=share:uno_packages

je sais pas ce qu'il faut mettre à la place de $console ..

Dernière modification par Rafbor (Le 30/01/2023, à 14:36)


Xubuntu 22.04 - Mes projets sur Github

Hors ligne

#5 Le 30/01/2023, à 13:03

Compte supprimé

Re : [Résolu] Macro python dans Calc : comment utiliser une extension ?

Maintenant, il faut voir que l'enjeu est limité.
J'ai déjà compris pourquoi cela ne s'enregistre pas et en plus j'ai le principe pour lancer une extension dans une macro.
Merci pour cela.

#6 Le 30/01/2023, à 15:30

Rafbor

Re : [Résolu] Macro python dans Calc : comment utiliser une extension ?

Pour Ubuntu 18+ (source) il faut installer un paquet qui remplace l'extension APSO qui refuse de s'installer.

sudo apt install libreoffice-script-provider-python

Après cela on peut exécuter des scripts python, vérifier par le menu Outils->Macros->Gérer les macros il doit y avoir le choix entre Basic et Python.

Je n'ai pas réussi à lancer la macro via l'extension, j'ai donc fait une copie du fichier import_ical.py dans le dossier de scripts python de LO.
Le chemin est:

/home/USER/.config/libreoffice/4/user/Scripts/python

Créer les dossiers s'ils n'existent pas.

et j'ai modifié le fichier import_ical.py en supprimant la fonction main et mettant toutes les déclarations dans la fonction fill_table()
Le chemin vers le fichier ical est pré-renseigné.
Voici le fichier modifié:
Edit: prendre la dernière version au post #10

Maintenant faire Outils->Macros->Exécuter la macro, la bibliothèque import_ical, doit apparaître dans Mes Macros, lancer la macro fill_table
ça doit remplir la feuille.

Dernière modification par Rafbor (Le 31/01/2023, à 18:05)


Xubuntu 22.04 - Mes projets sur Github

Hors ligne

#7 Le 30/01/2023, à 16:43

Rafbor

Re : [Résolu] Macro python dans Calc : comment utiliser une extension ?

Ca fonctionne chez moi en tout cas, maintenant reste à voir si on peut appeler une macro python à partir du basic..

Je ne maîtrise pas du tout python, il peut y avoir des optimisations/corrections à faire dans ce code, par exemple le commentaire sur le pythonpath n'est plus valable, je ne sais pas si c'est un problème, et il faudrait utiliser une variable d'environnement pour le chemin vers le HOME.

il faudrait qu'un spécialiste python y jette un coup d'oeil.

Dernière modification par Rafbor (Le 30/01/2023, à 16:47)


Xubuntu 22.04 - Mes projets sur Github

Hors ligne

#8 Le 30/01/2023, à 17:31

Compte supprimé

Re : [Résolu] Macro python dans Calc : comment utiliser une extension ?

De retour moi aussi. Il fait pas chaud dehors !
Merci pour cela Rafbor smile
Je vais tester. A te lire il semble qu'il ne me reste plus qu'à créer un bouton pour lancer la macro.

Edit :
Je suis sur mon poste Archlinux, il a déjà le paquet pour les macros python.
J'ai fait ce que tu as expliqué et ça fonctionne très bien ! Super.
Je passe au bouton pour la cerise sur la gâteau, puis j'adapte au classeur pour Qid.

Dernière modification par Compte supprimé (Le 30/01/2023, à 17:43)

#9 Le 30/01/2023, à 17:33

Rafbor

Re : [Résolu] Macro python dans Calc : comment utiliser une extension ?

Oui, dès que je termine ma séance de sport, je reprendrai la macro, y'a des fonctions inutiles qu'on peut supprimer.


Xubuntu 22.04 - Mes projets sur Github

Hors ligne

#10 Le 30/01/2023, à 18:34

Rafbor

Re : [Résolu] Macro python dans Calc : comment utiliser une extension ?

J'ai tenté quelques modifs en supprimant ce qui est inutile et en récupérant le HOME utilisateur, pas besoin d’adapter le chemin vers le fichier ics. Le script est plus léger.

#! /usr/bin/env python3
#
# extension d'origine: https://github.com/prometheus42/libreoffice-ical-importer
# modifié par @Rafbor
#
from arrow.arrow import Arrow
from datetime import timedelta
from ics import Calendar
from ics.grammar.parse import ParseError

import os
import uno
import unohelper
from com.sun.star.util import DateTime
from com.sun.star.util import Time
from com.sun.star.lang import Locale
from com.sun.star.uno import RuntimeException
from com.sun.star.task import XJobExecutor


# appel depuis événement clic-droit sur une feuille, un paramètre est envoyé
def fill_table_cd(obj):
    fill_table()

# lancement direct de la macro
def fill_table():
    """Fills the first worksheet with data from an iCalendar file.
    
    All events from a given iCalendar file are imported. Every column
    represents a attribute from the file and has a corrsponding header. The
    cells will be configured with a number format depending on the type of data
    of that column (datetime, timedelta, string, etc.)."""
    
    filename = os.path.expanduser('~') + "/.local/share/evolution/calendar/system/calendar.ics" 
    ctx = uno.getComponentContext()
    smgr = ctx.getServiceManager()
    DESK = 'com.sun.star.frame.Desktop'
    desktop = smgr.createInstanceWithContext(DESK , ctx)
    doc = desktop.getCurrentComponent()
    sheet = doc.Sheets[0] # 1er onglet
    # write attributes into table header
    attr = ['name', 'begin', 'end', 'duration', 'uid', 'description', 'created',
            'last_modified', 'location', 'url', 'transparent', 'alarms',
            'attendees', 'categories', 'status', 'organizer', 'classification']
    for column, name in enumerate(attr):
        cell = sheet.getCellByPosition(column, 0)
        cell.String = name
    # iterate over all events and add data to table
    for row, e in enumerate(read_ical_file(filename)):
        for column, name in enumerate(attr):
            cell = sheet.getCellByPosition(column, row+1)
            fill_cell_with_data(doc, getattr(e, name), cell)
    # mark all columns and set them to optimal width
    selection = sheet.getCellRangeByPosition(0, 1, len(attr)-1, 1)
    for c in selection.Columns:
        c.OptimalWidth = True


def read_ical_file(filename):
    """Reads an iCalendar file and returns all events from that file."""
    with open(filename, 'r') as calendar_file:
        c = Calendar(calendar_file.read())
    return c.events


def fill_cell_with_data(doc, data, cell):
    """Fills a single cell with given data.
    
    Before the data is stored in the cell of an worksheet, the type of the data
    is checked. All necessary conversion and type casts are done before the
    value of the cell is set."""
    NumberFormat = doc.getNumberFormats()
    LocalSettings = Locale()
    LocalSettings.Language = 'fr'
    if not data:
        cell.String = ''
    elif type(data) == str:
        cell.String =  data
    elif type(data) == Arrow:
        # write datetime into cell
        cell.String = data.format('DD.MM.YYYY HH:mm:ss')
        # set number format for cell
        FormatString = 'TT.MM.JJJJ HH:MM:SS'
        NumberFormatID = NumberFormat.queryKey(FormatString, LocalSettings, True)
        # check whether a value was found for the requested format (-1 == no value)
        if NumberFormatID == -1:  
            NumberFormatID = NumberFormat.addNew(FormatString, LocalSettings)
        cell.NumberFormat = NumberFormatID
    elif type(data) == timedelta:
        # write datetime into cell
        cell.String = str(data)
        # set number format for cell
        FormatString = 'HH:MM:SS'
        NumberFormatID = NumberFormat.queryKey(FormatString, LocalSettings, True)
        # check whether a value was found for the requested format (-1 == no value)
        if NumberFormatID == -1:  
            NumberFormatID = NumberFormat.addNew(FormatString, LocalSettings)
        cell.NumberFormat = NumberFormatID
    elif type(data) == set:
        cell.String = ', '.join([x for x in data])
    else:
        print('Unsupported type: {}'.format(type(data)))
        # return data without conversion to trigger an exception
        return data

Tout à l'air de fonctionner maintenant !

Dernière modification par Rafbor (Le 31/01/2023, à 10:56)


Xubuntu 22.04 - Mes projets sur Github

Hors ligne

#11 Le 30/01/2023, à 20:02

Compte supprimé

Re : [Résolu] Macro python dans Calc : comment utiliser une extension ?

Oui big_smile
J'ai testé deux fois sur un classeur vierge : c'est bon.

Il faut que je regarde pourquoi ça ne réagit pas sur le Qid.ods.Niveau de sécurité des macros dans "Options"

Dernière modification par Compte supprimé (Le 30/01/2023, à 20:10)

#12 Le 30/01/2023, à 20:18

Rafbor

Re : [Résolu] Macro python dans Calc : comment utiliser une extension ?

Super !
J'ai changé un petit truc

LocalSettings.Language = 'de'

passé à la langue de Molière

LocalSettings.Language = 'fr'

Au fait dans ton fichier Activité, il y a déjà une colonne "Duration" ramenée par la macro, t'as pas besoin de créer une colonne "Durée".


Xubuntu 22.04 - Mes projets sur Github

Hors ligne

#13 Le 31/01/2023, à 08:17

Compte supprimé

Re : [Résolu] Macro python dans Calc : comment utiliser une extension ?

Je l'ai fait parce que la donnée est au format texte et on ne peut donc pas faire les cumuls dans le rapport.
Il est certainement possible de faire mieux.

D'autre part, le top serait de placer le bouton d'activation sur la feuille du tableau dynamique vu qu'à l'usage on n'a besoin que de cette feuille. Mais la macro importe les données dans la feuille sur laquelle est activée.
Est-il possible de dire à la macro d'importer dans la feuille 1 [Importation] et non la 3 [Rapport] où elle se trouve ?

Et enfin, pour éviter de créer une autre macro, celle-ci peut-elle cliquer droit sur l'une des cellules du tableau et choisir "Actualiser". ?

J'ai commencé la reprise du N°186, je finirai en intégrant la version finale de la macro, selon ce qu'elle peut faire.
J'arrête pour la journée.

Dernière modification par Compte supprimé (Le 31/01/2023, à 10:10)

#14 Le 31/01/2023, à 10:27

Rafbor

Re : [Résolu] Macro python dans Calc : comment utiliser une extension ?

J'ai modifié la macro, elle écrit maintenant sur le 1er onglet, peu importe le nom de l'onglet.

Et enfin, pour éviter de créer une autre macro, celle-ci peut-elle cliquer droit sur l'une des cellules du tableau et choisir "Actualiser". ?

J'ai essayé en affectant la macro au clic-droit dans la feuille Rapport (faire clic-droit sur le nom de la feuille->Evénements de la feuille), mais ça envoi un paramètre à la macro et ça plante.
Pour que ça marche, il faut ajouter un paramètre bidon obj

Du coup, j'ai rajouté un point d'entrée dans la macro, tu as 2 possibilités d'appel:
1 - appel direct de la macro par le menu exécuter macro ou via un bouton: fill_table
2 - appel via l'événement clic-droit sur la feuille rapport: fill_table_cd

Dernière modification par Rafbor (Le 31/01/2023, à 10:58)


Xubuntu 22.04 - Mes projets sur Github

Hors ligne

#15 Le 31/01/2023, à 19:09

Compte supprimé

Re : [Résolu] Macro python dans Calc : comment utiliser une extension ?

Merci pour cette amélioration.
Le lancement de la macro importe bien dans la feuille 1. Je vais la lancer, non par un bouton, mais à l'ouverture de la feuille "Rapport", c'est encore plus simple et on n'oubliera pas.

La description est ici.
https://forum.kubuntu-fr.org/viewtopic. … #p22645273

Si tu peux la regarder, tu diras ce qu'il faut améliorer. Ensuite je créerai un nouveau sujet pour plus de clarté et en citant les contributeurs.

Dernière modification par Compte supprimé (Le 31/01/2023, à 20:05)

#16 Le 01/02/2023, à 08:46

Compte supprimé

Re : [Résolu] Macro python dans Calc : comment utiliser une extension ?

Si je crée un nouveau sujet pour expliquer cela, personne ne pourra en modifier le contenu, on repartira sur un fil qui pourrait devenir indigeste.

Et si on en faisait une page de type "tuto" dans la doc ? Pour voir ce que ça donnerait, je me suis créé une page personnelle dans laquelle j'ai mis le début du modèle de tuto proposé dans la documentation.
Regarde si ça te convient. Si tu peux y intervenir pour modifier. Si oui, J'y mettrai le texte du N°215 et tu pourras l'améliorer. On pourrait aussi envisager les solutions avec ta macro et en utilsant l'extension avec n'importe quel agenda. Cette page pourra ensuite être remplacée par un tuto dans la doc.
https://doc.ubuntu-fr.org/utilisateurs/tamarou

#17 Le 01/02/2023, à 09:26

Rafbor

Re : [Résolu] Macro python dans Calc : comment utiliser une extension ?

Bonne idée la page tuto. C'est ok, je peux modifier ta page.
Je pourrai adapter la macro pour qu'elle aille chercher le fichier à importer dans un chemin qu'on indiquera directement dans le fichier Calc, au lieu de le figer.


Xubuntu 22.04 - Mes projets sur Github

Hors ligne

#18 Le 01/02/2023, à 09:29

Compte supprimé

Re : [Résolu] Macro python dans Calc : comment utiliser une extension ?

Alors on y va cool

Mais il faut voir comment on structure cela tongue

Donc, avec ta dernière amélioration, on peut faire
1/ solution la plus simple et automatisée comme déjà décrit pour Qid.
mais il faut mettre la nouvelle version de ta macro et ajouter en paramètre le chemin vers le fichier ics d'Agenda.

2/ adaptation à n'importe quel agenda.

et aussi ... ???

Il faudra trouver un hébergement plus perenne que le chaton actuel. Il est limité à un mois tongue

Dernière modification par Compte supprimé (Le 01/02/2023, à 11:17)

#19 Le 01/02/2023, à 16:04

Rafbor

Re : [Résolu] Macro python dans Calc : comment utiliser une extension ?

Le fichier Calc est toujours avec la date de G2 au lieu de B2, je corrige dans ma version.

Je mets le chemin du fichier à importer dans la cellule G1 de la feuille 3, comme ça on peut aller chercher un export fait à partir d'un autre agenda. J'ai testé avec Google Agenda, ça marche. Si G1 n'est pas renseigné, le script prend par défaut le fichier de Gnome Agenda.

J'aime pas avoir le lancement de la macro sur l'activation de la feuille 3, si tu te balades dans le fichier, à chaque fois que tu retournes sur la feuille 3 ça lance la macro.
Soit je mets un bouton pour la lancer, soit on l'affecte au clic-droit, comme ça en faisant actualiser le tableau, ça lance d'abord la macro.
J'attends vos avis.


Xubuntu 22.04 - Mes projets sur Github

Hors ligne

#20 Le 01/02/2023, à 16:07

Compte supprimé

Re : [Résolu] Macro python dans Calc : comment utiliser une extension ?

si tu te balades dans le fichier, à chaque fois que tu retournes sur la feuille 3 ça lance la macro.

J'avais pas vu cela. Ok pour moi de passer au clic droit.
J'attendais de trouver un meilleur hébergement pour recharger le fichier calc. Merci c'est mieux ainsi.

Tu as publié ta dernière version de la macro avec la case g1 pour indiquer le fichier ics ?
Je vais décaler de quelques lignes vers le bas le tableau, pour ne pas risquer de chevaucher avec g1.

Dernière modification par Compte supprimé (Le 01/02/2023, à 16:23)

#21 Le 01/02/2023, à 17:00

Rafbor

Re : [Résolu] Macro python dans Calc : comment utiliser une extension ?

Y'a pas d'hébergement intégré dans le wiki ?

J'ai un peu de boulot avec la macro, je me rends compte qu'il faut vider la 1ère feuille avant de lancer la macro car s'il y a moins d'événements à rapatrier ou si on change d'agenda, les anciens événements restent.
Et dans la feuille 2, il faut adapter le nombre de lignes à celui de la 1ère feuille.

Pour déposer les fichiers, l'idéal serait un dépôt comme Github, GilLab ou Framagit, on pourrait y déposer le script et le fichier Calc, et on pourrait tous les mettre à jour.


Xubuntu 22.04 - Mes projets sur Github

Hors ligne

#22 Le 01/02/2023, à 17:04

Compte supprimé

Re : [Résolu] Macro python dans Calc : comment utiliser une extension ?

qu'il faut vider la 1ère feuille

Effectivement c'était dans la description de la manip non automatisée.

Et dans la feuille 2, il faut adapter le nombre de lignes à celui de la 1ère feuille.

C'est ce que j'écrivais plus haut.
J'ai prévu 2000 lignes, ça devrait aller.

Pour déposer les fichiers, l'idéal serait un dépôt comme Github, GilLab ou Framagit,

Tu sais faire cela ? Github j'interviens pour poser des questions, mais pas plus tongue

Dernière modification par Compte supprimé (Le 01/02/2023, à 17:06)

#23 Le 01/02/2023, à 17:22

Rafbor

Re : [Résolu] Macro python dans Calc : comment utiliser une extension ?

Tamarou a écrit :

C'est ce que j'écrivais plus haut.
J'ai prévu 2000 lignes, ça devrait aller.

Je vois pas ou tu avais écrit ça, mais c'est pas important.
Je vais voir si je peux adapter le nombre de lignes avec le code Python.

Pour déposer les fichiers, l'idéal serait un dépôt comme Github, GilLab ou Framagit,

Tu sais faire cela ? Github j'interviens pour poser des questions, mais pas plus tongue

Je peux créer un repository sur mon compte Github, si vous voulez faire des modifs il faudra faire une demande de pull request, mais ça vous oblige à installer Git et à apprendre à l'utiliser. C'est peut être plus simple de tout mettre sur un serveur comme e-Nautia (c'est là que je mets les archives de mes projets).

Je terminerai pas aujourd'hui, je dois sortir. Je reprends dans la soirée et demain.

Édit: je déposerai tout sur mon compte e-nautia.

Dernière modification par Rafbor (Le 01/02/2023, à 17:55)


Xubuntu 22.04 - Mes projets sur Github

Hors ligne

#24 Le 01/02/2023, à 18:17

Compte supprimé

Re : [Résolu] Macro python dans Calc : comment utiliser une extension ?

Édit: je déposerai tout sur mon compte e-nautia.

Ok, je viens d'en créer un mais le tien ira aussi bien, et même mieux car je n'ai pas encore compris toutes les fonctions.
Je regarde comment améliorer le tri sur le mois. La conversion numéro de mois => nom du mois ne permet pas de regrouper en une seule ligne dans le tableau, alors que c'est bon avec des chiffres.
C'est bon , lien provisoire actualisé.

Entre temps j'ai modifié un paramètre sur la carte de l'automatisme de mon portail qui se fermait tout seul depuis l'intervention d'un professionnel. big_smile

Dernière modification par Compte supprimé (Le 01/02/2023, à 18:58)

#25 Le 01/02/2023, à 20:49

Rafbor

Re : [Résolu] Macro python dans Calc : comment utiliser une extension ?

J'ai placé les fichiers sur e-nautia, les liens sont à jour dans le wiki, ainsi que le paragraphe qui décrit l'utilisation.
Ce n'est pas terminé pour la macro, j'ai encore du boulot demain wink


Xubuntu 22.04 - Mes projets sur Github

Hors ligne