[Résolu] [Writer] Appliquer un format style de numérotation

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 !
patricerut
Membre lOOyal
Membre lOOyal
Messages : 27
Inscription : 06 sept. 2022 08:04

[Résolu] [Writer] Appliquer un format style de numérotation

Message par patricerut »

Bonjour à tous,
j'ai beau chercher depuis plusieurs semaines sur ce forum, le forum anglais et ailleurs, je n'ai pas réussi à résoudre mon problème.
Je résume: Je veux rédiger une macro me permettant d'appliquer un formatage de numérotation particulier à un paragraphe, en fonction du niveau.
Au niveau 1, je souhaite obtenir 1.
Au niveau 2, 1.1.
Au niveau 3, 1.1.1.
Au niveau 4, 1.1.1.1.
et ainsi de suite, 2.1, 2.2, 2.2.1
Je sais que la meilleure solution consiste à créer un modèle avec la bonne numérotation et d'appliquer le style au paragraphe désiré, mais je souhaite pouvoir partager mon fichier avec la bonne macro pour facilement obtenir la bonne numérotation, sans passer par les modèles.
Après moultes recherches, je pense que je ne suis pas loin du but, mais je n'obtiens pas le résultat voulu.
Les macros dans le document en pj que j'ai développées, permettent de créer un style de paragraphe ou un style numérique, d'appliquer un style numérique à un style de paragraphe, et la macro destinée à changer les paramètres du style numérique, semble faire le job, si j'en crois Xray, sauf que les éléments du style numérique n'apparaissent pas (suffix et prefix en particulier, mais également les niveaux précédents, j'obtiens toujours 1 seul chiffre en début de paragraphe). J'ai essayé de désactiver la numérotation puis de la réactiver, tout porte à croire que le format numérique est créé avec des paramètres par défaut, et que les modifications apportées, sont temporaires et non appliquées au style définitif. Ci-dessous la macro principale, les autres sont dans le fichier joint, et elles fonctionnent correctement.
C'est pourquoi je fais appel aux experts de ce forum, que je remercie par avance de toute piste qui pourrait me permettre d'avancer.

Code : Tout sélectionner

Sub CreateOrModifyNumberingStyle_Niveau1
    Dim oDoc As Object
    Dim oStyleFamilies As Object
    Dim oNumStyles As Object
    Dim oNumStyle As Object
    Dim oNumberingRules As Object
    Dim oNumRule As Object
    Dim i As Integer

    ' Nom du style de numérotation à créer ou modifier
    Dim styleName As String
    styleNumName = "MonStyleNum"
    styleParaName= "CE_Titre1"

    ' Obtenir le document actuel
    oDoc = ThisComponent

    ' Obtenir la liste des familles de styles
    oStyleFamilies = oDoc.getStyleFamilies()

    ' Obtenir les styles de numérotation
    oNumStyles = oStyleFamilies.getByName("NumberingStyles")

    ' Vérifier si le style de numérotation existe
    ' s'il n'existe pas, le créer
    If NOT oNumStyles.hasByName(styleNumName) Then
    ' Créer un nouveau style de numérotation
    	oNumStyle = oDoc.createInstance("com.sun.star.style.NumberingStyle")
    	oNumStyle.Name = styleName
    ' Ajouter le style au document
    	oNumStyles.insertByName(styleNumName, oNumStyle)
    endif

    ' Récupérer le nouveau style de numérotation
    oNumStyle=oNumStyles.getByName(styleNumName)
    oNumberingRules = oNumStyle.NumberingRules

    ' Configurer les niveaux de numérotation
    oNumRule = oNumberingRules.getByIndex(0)

    ' Initialisation des propriétés
    oNumRule(0).Value = 1       ' Adjust
    oNumRule(1).Value = 2       ' ParentNumbering
    oNumRule(2).Value = "# " ' Prefix
    oNumRule(3).Value = "@ " ' Suffix
    oNumRule(4).Value = 1       ' ListFormat (ou format de liste)
    oNumRule(5).Value = "Niveau1" ' CharStyleName
    oNumRule(6).Value = 1       ' StartWith
    oNumRule(7).Value = 1       ' PositionAndSpaceMode
    oNumRule(8).Value = 0       ' LabelFollowedBy
    oNumRule(9).Value = 2000    ' ListTabStopPosition
    oNumRule(10).Value = -1500  ' FirstLineIndent
    oNumRule(11).Value = 2500   ' IndentAt
    oNumRule(12).Value = 4      ' NumberingType

    ' Mettre à jour la règle
    oNumberingRules.replaceByIndex(0, oNumRule)

    ' Appliquer le style de numérotation aux styles de paragraphe concernés
    Dim oParaStyles As Object
    Dim oParaStyle As Object

    ' Obtenir les styles de paragraphe
    oParaStyles = oStyleFamilies.getByName("ParagraphStyles")

    ' Vérifier si le style de paragraphe existe et le créer si ce n'est pas le cas
    If Not oParaStyles.hasByName(styleParaName) Then
        oParaStyle = oDoc.createInstance("com.sun.star.style.ParagraphStyle")
        oParaStyle.Name = styleParaName
        oParaStyles.insertByName(styleParaName, oParaStyle)
    Else
        oParaStyle = oParaStyles.getByName(styleParaName)
    End If

    ' Définir les propriétés du style de paragraphe
    oParaStyle.NumberingStyleName = styleName
    oParaStyle.NumberingLevel = 1 ' Ajoutez cette ligne pour définir le niveau de numérotation

    ' Appliquer le style de paragraphe au paragraphe courant (niveau 1)
    Dim oText As Object
    Dim oCursor As Object
    Dim oTextRange As Object

    oText = oDoc.Text
    oTextRange = oDoc.CurrentController.Selection.getByIndex(0)
    oCursor = oText.createTextCursorByRange(oTextRange)

    If Not IsEmpty(oCursor) Then
        oCursor.ParaStyleName = styleParaName
    End If

    AppliquerStyleNumAStyleParagraphe (styleNumName, styleParaName) 'Fonctionne
    AppliqueStylePara (styleParaName) 'Fonctionne
    DisableNumberingForCurrentParagraph 'Fonctionne
    EnableNumberingForCurrentParagraph (styleNumName, 1) 'Fonctionne

    MsgBox "Le style de numérotation '" & styleNumName & "' a été créé ou modifié avec succès et appliqué aux styles de paragraphe concernés."
End Sub

Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Dernière modification par patricerut le 05 juin 2024 13:53, modifié 2 fois.
MacBook Air (M1, 2020)-macosx Sonoma 14.1.2 (23B92)
Libreoffice 24.8.4.2
Avatar de l’utilisateur
jeanmimi
Grand Maître de l'OOffice
Grand Maître de l'OOffice
Messages : 17188
Inscription : 03 mars 2006 16:02
Localisation : Venise verte

Re: [Writer] Appliquer un format style numérique

Message par jeanmimi »

Bonjour,
patricerut a écrit : 01 juin 2024 05:07 Je sais que la meilleure solution consiste à créer un modèle avec la bonne numérotation
La numérotation des titres se fait par Outils > Numérotation des chapitres
et ne nécessite pas l'utilisation d'un modèle.
Passer par une Macro pour remplacer cette méthode risque de compliquer l'utilisation du document puisque les langages de programmation ne pourront être interprétés que par les utilisateurs de la même suite bureautique.
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
LibreOffice : Version : 25.2.0.3 (x64)(20 février 2025)
Adoptium JRE ou Oracle JRE (x64), Windows 10, Thunderbird, Firefox
Avatar de l’utilisateur
Dude
IdOOle de la suite
IdOOle de la suite
Messages : 26020
Inscription : 03 mars 2006 07:45
Localisation : 127.0.0.1

Re: [Writer] Appliquer un format style numérique

Message par Dude »

Salut,
patricerut a écrit : 01 juin 2024 05:07mais je souhaite pouvoir partager mon fichier avec la bonne macro pour facilement obtenir la bonne numérotation, sans passer par les modèles.
Bof, comme l'indique jeanmimi, l'envoi d'un document avec macro va nécessiter une autorisation ou un paramétrage de Writer pour s'exécuter.


patricerut a écrit : 01 juin 2024 05:07 j'ai beau chercher depuis plusieurs semaines sur ce forum, le forum anglais et ailleurs, je n'ai pas réussi à résoudre mon problème.
Regarde l'extension AutoChapitre, elle reprend les principes que tu cherches.
patricerut
Membre lOOyal
Membre lOOyal
Messages : 27
Inscription : 06 sept. 2022 08:04

Re: [Writer] Appliquer un format style numérique

Message par patricerut »

merci Jeanmimi et Dude pour ces informations.
Lorsque j'essaye de lancer AutoChapter, je tombe sur une erreur à la ligne
GlobalScope.BasicLibraries.loadLibrary("MRILib")
Erreur d'exécution BASIC.
Une exception s'est produite :
Type: com.sun.star.container.NoSuchElementException
Message: .

Comment charger cette bibliothèque?
MacBook Air (M1, 2020)-macosx Sonoma 14.1.2 (23B92)
Libreoffice 24.8.4.2
Avatar de l’utilisateur
Bidouille
RespOOnsable forum
RespOOnsable forum
Messages : 12690
Inscription : 08 nov. 2005 16:23
Localisation : Brest, France

Re: [Writer] Appliquer un format style numérique

Message par Bidouille »

Bonjour,
patricerut a écrit : 05 juin 2024 12:37 Lorsque j'essaye de lancer AutoChapter, je tombe sur une erreur à la ligne
Erreur corrigée avec la version 1.0.4
patricerut
Membre lOOyal
Membre lOOyal
Messages : 27
Inscription : 06 sept. 2022 08:04

Re: [Writer] Appliquer un format style numérique

Message par patricerut »

Je me réponds à moi-même.
J'ai réussi à installer la librairie MRI.
Merci encore pour vos réponse.
AutoChapter répond exactement à mes besoins.
Je regarde le tuto pour mettre le message comme résolu et je le fais de ce pas!
MacBook Air (M1, 2020)-macosx Sonoma 14.1.2 (23B92)
Libreoffice 24.8.4.2