IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Python-Docx et la tableau - Comment mettre en place des styles particuler dans chaque cellule d'un tableau


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de dedalios
    Homme Profil pro
    concepteur d'application
    Inscrit en
    Février 2008
    Messages
    495
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : concepteur d'application
    Secteur : Santé

    Informations forums :
    Inscription : Février 2008
    Messages : 495
    Par défaut Python-Docx et la tableau - Comment mettre en place des styles particuler dans chaque cellule d'un tableau
    bonjour

    Je cherche a obtenir un document word avec un tableau .
    Avec une alternance de cellule : cellule de titre centré de type "Dark List" ,suivi d'une cellule style "Normale"
    avec du text formater pouvant prendre plusieurs lignes.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
     
    # coding: utf-8
    from docx import Document
    from docx.shared import Inches
    from docx.shared import RGBColor
    from docx.enum.text import WD_COLOR_INDEX
    from docx.shared import Inches ,Pt, RGBColor, Cm
    #from docx.enum.text import WD_ALIGN_PARAGRAPH
     
     
    '''
    Created on 4 janv. 2023
     
    @author: 
     
    '''
     
    def bloc_entete_de_page(document):
     
        section_entete =document.sections[0].header
        paragraph_entete = section_entete.paragraphs[0]
     
        logo  = paragraph_entete.add_run()
     
        #logo.add_picture('image001.png' , width=Cm(4.72), height=  Cm(1.56))
     
        text_run = paragraph_entete.add_run()
     
        text_run.text = "Formulaire AP0152" 
        text_run.font.size  =Pt(16)
        pass
     
    def bloc_1(document):
        info_general = "\n" +  "Ce formulaire permet d’indiquer les caractéristiques " + \
        "\n" +     "Pour toute question sur le remplissage de ce formulaire, merci de saisir une demande d’information "
     
        document.add_heading('', level=0)
        table = document.add_table(rows=5, cols=1)
        table.style="Dark List"
        #able.alignment = WD_ALIGN_PARAGRAPH.CENTER
     
     
     
        hdr_cells = table.rows[0].cells
        hdr_cells = table.rows[0].cells[0].text = "information_ générales"
        hdr_cells = table.rows[1].cells[0].text = info_general
        hdr_cells = table.rows[2].cells[0].text = 'Nous contacter'
        hdr_cells = table.rows[3].cells[0].text = ''
        hdr_cells = table.rows[4].cells[0].text = 'Équipe :  Alpha Omega' + '/n' + 'Adresse :  Alpha_Omega@Montruc.fr'
     
     
     
     
     
    if __name__ == '__main__': 
     
        document = Document()
        bloc_entete_de_page(document)
        bloc_1(document)
     
        document.save("exemple2.docx")

    Je parviens a affecter le style a tous le tableau mais je ne parviens pas a modifier une cellule de façon indépendante des autres.

    un solution pourrait être de créer 1 tableau pour chaque cellule.

    J'aimerai par exemple que l'URL ressorte de façon traditionnelle en bleu.

    Autre point, je me demande si ce module pour word python-docx peut créer des objets tel que des "cases a cocher "... j'en doute.car je n'ai rien trouvé dans la documentation qui soit susceptible de le faire.....

  2. #2
    Membre éclairé Avatar de dedalios
    Homme Profil pro
    concepteur d'application
    Inscrit en
    Février 2008
    Messages
    495
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : concepteur d'application
    Secteur : Santé

    Informations forums :
    Inscription : Février 2008
    Messages : 495
    Par défaut
    voici un autre exemple fonctionnel

    Mais quid des encadrements de tableau ? je n'ai pas encore trouver comme les ajouter.
    • LEs effets tel que la fusion de colonne
    • LEs effets tel que la fusion de ligne




    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    # coding: utf-8  
    from docx import Document
    from docx.shared import Inches ,Pt, RGBColor , Cm
    from docx.enum.text import WD_COLOR_INDEX
     
     
     
    document = Document()
     
    document.add_heading('Titre du document', 0)
     
    p = document.add_paragraph('Un simple paragraphe avec du ')
    p.add_run('texte en gras').bold = True
    p.add_run(' and du texte en itallic ')
    p.add_run('italic.').italic = True
     
    document.add_heading('Entête de Niveau avec niveau possible.', level=1)  
     
     
    document.add_paragraph('''un exmeple de Citation utilisant le paramètre 'Intense Quote' ''', style='Intense Quote')
     
    document.add_paragraph('Une liste de choix : parmètrage de stype List Bullet', style='List Bullet')
    document.add_paragraph('Une liste numerotée avec le 1ier element  ', style='List Number')
    document.add_paragraph('et le second élément de cette liste', style='List Number')
     
    document.add_paragraph('Une image dans le paragrphe') 
    document.add_picture(r'Terre.jpg', width=Inches(1.25))
     
    document.add_page_break()
    document.add_paragraph('Un changement de page') 
    parag = document.add_paragraph()
    run = parag.add_run("Un tableau en police 15 point de couleur rouge en graset souligné")
    run.font.size = Pt(15)
    run.font.color.rgb = RGBColor(255,15,15)
    run.font.bold = True
    run.font.italic = True
    run.font.underline  = True
     
    records = (
        (3, '101', 'Pomme'),
        (7, '422', 'Poire'),
        (4, '631', 'Orange')
    )
     
    table = document.add_table(rows=1, cols=3)
    hdr_cells = table.rows[0].cells
    hdr_cells[0].text = 'Qt'
    hdr_cells[1].text = 'Id'
    hdr_cells[2].text = 'Produit'
    for qty, id, desc in records:
        row_cells = table.add_row().cells
        row_cells[0].text = str(qty)
        row_cells[1].text = id
        row_cells[2].text = desc
     
    document.add_paragraph("Mais pas d'encadrement") 
     
     
    document.save('demo.docx')

    Pas simple d'aller plus loin

  3. #3
    Membre expérimenté
    Homme Profil pro
    Analyse système
    Inscrit en
    Novembre 2008
    Messages
    227
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyse système
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Novembre 2008
    Messages : 227
    Par défaut
    Bonjour,

    As-tu jeté un oeil là : https://www.geeksforgeeks.org/workin...n-docx-module/ ?

  4. #4
    Membre expérimenté
    Homme Profil pro
    Analyse système
    Inscrit en
    Novembre 2008
    Messages
    227
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyse système
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Novembre 2008
    Messages : 227
    Par défaut
    Sinon pour ajouter la grille :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    table = doc.add_table(rows=2, cols=2, style="Table Grid")

  5. #5
    Membre expérimenté
    Homme Profil pro
    Analyse système
    Inscrit en
    Novembre 2008
    Messages
    227
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyse système
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Novembre 2008
    Messages : 227
    Par défaut
    Citation Envoyé par dedalios Voir le message
    bonjour

    Je parviens a affecter le style a tous le tableau mais je ne parviens pas a modifier une cellule de façon indépendante des autres.
    Pour cela il va te falloir jouer dans les paramètres xml du fichier word.
    Tu peux trouver des exemples là : https://mlhive.com/2022/04/working-w...in-python-docx

  6. #6
    Membre éclairé Avatar de dedalios
    Homme Profil pro
    concepteur d'application
    Inscrit en
    Février 2008
    Messages
    495
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : concepteur d'application
    Secteur : Santé

    Informations forums :
    Inscription : Février 2008
    Messages : 495
    Par défaut
    merci pour les informations de cas.
    Le format OXML word n'est pas simple a appréhender.

    par exmple je n'ai rien trouver d'explicite sur la codification des Bouttons à cliquer accessible depuis le mode déboggueur de windpws ou mème les zones de type forms

    J'ai converti mon modèle word en word.xml pour voir s'il est possible de trouver les données de ces tables .
    PAS simple

    extrait de code qui semble définir une zone de bouton cliquable présent dans une table
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     <w:tcPr>
       <w:tcW w:w="6808" w:type="dxa"/>
       <w:vAlign w:val="bottom"/>
     </w:tcPr>

  7. #7
    Membre éclairé Avatar de dedalios
    Homme Profil pro
    concepteur d'application
    Inscrit en
    Février 2008
    Messages
    495
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : concepteur d'application
    Secteur : Santé

    Informations forums :
    Inscription : Février 2008
    Messages : 495
    Par défaut
    voici un 1ier test non concluant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    from docx import Document
     
    from docx.oxml.shared import OxmlElement
    from docx.oxml.ns import qn
     
    def set_cell_margins(cell, **kwargs):
        """
        cell:  actual cell instance you want to modify
        usage:
            set_cell_margins(cell, top=50, start=50, bottom=50, end=50)
     
        provided values are in twentieths of a point (1/1440 of an inch).
        read more here: http://officeopenxml.com/WPtableCellMargins.php
        """
        tc = cell._tc
        tcPr = tc.get_or_add_tcPr()
        tcMar = OxmlElement('w:tcMar')
     
        for m in ["top", "start", "bottom", "end"]:
            if m in kwargs:
                node = OxmlElement("w:{}".format(m))
                node.set(qn('w:w'), str(kwargs.get(m)))
                node.set(qn('w:type'), 'dxa')
                tcMar.append(node)
     
        tcPr.append(tcMar)
     
    def set_cell_bottom(cell):  
        """
          <w:tcPr>
             <w:tcW w:w="6808" w:type="dxa"/>
             <w:vAlign w:val="bottom"/>
           </w:tcPr>
        """
     
     
        tc = cell._tc
        tcPr = tc.get_or_add_tcPr()
        bouton = OxmlElement('w:tcW')
        #bouton.append(OxmlElement('w:w="6808'))
        bouton.append(OxmlElement('w:type="dxa"'))
        bouton.append(OxmlElement('w:vAlign'))
        bouton.append(OxmlElement('w:val="bottom"'))
        print(bouton)
        return bouton
     
    # create document
    doc = Document()
     
    # add grid table
    table = doc.add_table(rows=2, cols=2, style="Table Grid")    
     
     
    # access second row's cells
    data_row = table.add_row().cells
     
    set_cell_margins(data_row[0], top=100, start=100, bottom=100, end=50)
     
    # add headings
    data_row[0].text = "Usman"
    data_row[1].text = "76"
     
    table2 = doc.add_table(rows=4, cols=4, ) 
     
     
    data_row_2 = table2.add_row().cells
    set_cell_margins(data_row_2[0], top=250, start=250, bottom=75, end=75)
     
    data_row_2[0].text = "Alter"
    data_row_2[1].text = "Mars"
     
     
    table3 = doc.add_table(rows=1, cols=1, ) 
    data_row_3 = table3.add_row().cells
     
    set_cell_bottom(data_row_3[0] ) 
     
    # save to file
    doc.save("images-table.docx")


    voici le résulta

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Traceback (most recent call last):
      File "\\projet\Base\Cell-margin.py", line 76, in <module>
        set_cell_bottom(data_row_3[0] ) 
      File "\\projet\Base\Base\Cell-margin.py", line 41, in set_cell_bottom
        bouton.append(OxmlElement('w:type="dxa"'))
      File "\\projet\Environnement_python\env_db\lib\site-packages\docx\oxml\__init__.py", line 58, in OxmlElement
        return oxml_parser.makeelement(
      File "src\lxml\parser.pxi", line 1021, in lxml.etree._BaseParser.makeelement
      File "src\lxml\apihelpers.pxi", line 101, in lxml.etree._makeElement
      File "src\lxml\apihelpers.pxi", line 1754, in lxml.etree._tagValidOrRaise
    ValueError: Invalid tag name 'type="dxa"'

  8. #8
    Membre éclairé Avatar de dedalios
    Homme Profil pro
    concepteur d'application
    Inscrit en
    Février 2008
    Messages
    495
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : concepteur d'application
    Secteur : Santé

    Informations forums :
    Inscription : Février 2008
    Messages : 495
    Par défaut
    voici un exemple de checkbutton() qui ne semble plus fonctionner depuis la version python-docx .8.10 dommage.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    # coding: utf-8
    '''
    Created on 30 janv. 2023
     
    @author: 
    '''
     
     
    import docx
     
     
     
    if __name__ == '__main__':
        doc= docx.Document()
        doc.add_paragraph('Ceci est une checkbox ou case à cocher :')
        checkbox = doc.add_paragraph().add_run().add_checkbutton()
     
        doc.save("case_a_cocher.docx")
        pass

  9. #9
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 062
    Par défaut
    Bonjour,

    Peut-être voir du côté des solutions XML du module Docx pour créer ta checkbox ?

  10. #10
    Membre éclairé Avatar de dedalios
    Homme Profil pro
    concepteur d'application
    Inscrit en
    Février 2008
    Messages
    495
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : concepteur d'application
    Secteur : Santé

    Informations forums :
    Inscription : Février 2008
    Messages : 495
    Par défaut
    voici un autre exemple qui echoue

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    from docx import Document
    doc = Document()
    # ajout d'un champ simple
    field = doc.fields.add_field("FORMFIELDTEXT \\s 1", "Text1")
    field.calc_on_exit = True
    # ajout d'une formule liée au champ
    doc.fields.add_formula("=Text1+10", "11")
    doc.save("example.docx")
    field = doc.fields.add_field("FORMFIELDTEXT \\s 1", "Text1")
    AttributeError: 'Document' object has no attribute 'fields'

    oui OXML pourrait être une solution mais je n'ai pas encore trouver de cas d'exemple fonctionnel même en java.

    ne serait ce que pour définir un objet xml word..... je n'ai pas encore trouver d'exemple portant sur les objets FORMFIELDTEXT et/ou CHECKBOX

  11. #11
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 062
    Par défaut
    Après un peu de recherches,

    Je vois deux parties importantes

    1. Travailler avec XML et Microsoft pour la partie Docx -> CheckBox
    2. Le code source docx avec la partie oxml et ce qui permet de créer un objet Docx -> code OxmlElement


    À partir de là (pas testé) j'en déduis la création de l'objet CheckBox de cette manière,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    from docx.oxml import OxmlElement
    checkbox = OxmlElement('w:checkBox')
    À tester !

  12. #12
    Membre éclairé Avatar de dedalios
    Homme Profil pro
    concepteur d'application
    Inscrit en
    Février 2008
    Messages
    495
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : concepteur d'application
    Secteur : Santé

    Informations forums :
    Inscription : Février 2008
    Messages : 495
    Par défaut
    voici un essai malheureusement infructueux le tableau est bien présent mais vide de tous checkbox

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    from docx.oxml.ns import qn
    from docx import Document
    from docx.text.run import Run
    from docx.oxml import OxmlElement
    def add_checkbox(cell):
        run = cell.paragraphs[0].add_run()
        fldChar = OxmlElement('w:fldChar')
        fldChar.set(qn('w:fldCharType'), 'begin')
        run._r.append(fldChar)
        checkbox = OxmlElement('w:checkbox')
        fldChar = OxmlElement('w:fldChar')
        fldChar.set(qn('w:fldCharType'), 'separate')
        checkbox.append(fldChar)
        fldChar = OxmlElement('w:fldChar')
        fldChar.set(qn('w:fldCharType'), 'end')
        checkbox.append(fldChar)
        run._r.append(checkbox)
     
     
     
     
     
    def create_table_with_checkboxes(num_rows, num_cols):
        document = Document()
        table = document.add_table(rows=num_rows, cols=num_cols)
        for row in table.rows:
            for cell in row.cells:
                cell.text = "Example text"
                add_checkbox(cell)
        return document
     
     
    doc = create_table_with_checkboxes(3, 3)
    doc.save("table_with_checkboxes.docx")

  13. #13
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 062
    Par défaut
    Citation Envoyé par dedalios Voir le message
    voici un essai malheureusement infructueux le tableau est bien présent mais vide de tous checkbox

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    from docx.oxml.ns import qn
    from docx import Document
    from docx.text.run import Run
    from docx.oxml import OxmlElement
    def add_checkbox(cell):
        run = cell.paragraphs[0].add_run()
        fldChar = OxmlElement('w:fldChar')
        fldChar.set(qn('w:fldCharType'), 'begin')
        run._r.append(fldChar)
        checkbox = OxmlElement('w:checkbox')
        fldChar = OxmlElement('w:fldChar')
        fldChar.set(qn('w:fldCharType'), 'separate')
        checkbox.append(fldChar)
        fldChar = OxmlElement('w:fldChar')
        fldChar.set(qn('w:fldCharType'), 'end')
        checkbox.append(fldChar)
        run._r.append(checkbox)
     
     
     
     
     
    def create_table_with_checkboxes(num_rows, num_cols):
        document = Document()
        table = document.add_table(rows=num_rows, cols=num_cols)
        for row in table.rows:
            for cell in row.cells:
                cell.text = "Example text"
                add_checkbox(cell)
        return document
     
     
    doc = create_table_with_checkboxes(3, 3)
    doc.save("table_with_checkboxes.docx")
    et en créant un checkbox seul ?

  14. #14
    Membre actif
    Homme Profil pro
    Animateur Numérique
    Inscrit en
    Février 2013
    Messages
    143
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Animateur Numérique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Février 2013
    Messages : 143
    Par défaut
    Salut,

    Citation Envoyé par dedalios Voir le message

    Autre point, je me demande si ce module pour word python-docx peut créer des objets tel que des "cases a cocher "... j'en doute.car je n'ai rien trouvé dans la documentation qui soit susceptible de le faire.....
    Tu peux t'inspirer du code de cette discussion

  15. #15
    Membre éclairé Avatar de dedalios
    Homme Profil pro
    concepteur d'application
    Inscrit en
    Février 2008
    Messages
    495
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : concepteur d'application
    Secteur : Santé

    Informations forums :
    Inscription : Février 2008
    Messages : 495
    Par défaut
    Je suis d accord rien dans python-docx ne semble permettre d utiliser de commande de type checkbox, formfieldtext

  16. #16
    Membre éclairé Avatar de dedalios
    Homme Profil pro
    concepteur d'application
    Inscrit en
    Février 2008
    Messages
    495
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : concepteur d'application
    Secteur : Santé

    Informations forums :
    Inscription : Février 2008
    Messages : 495
    Par défaut
    exemple N°1

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    from docx.oxml import OxmlElement
    from docx.oxml.ns import qn
    from docx import Document
     
     
    def add_checkbox(cell):
        checkbox = OxmlElement('w:checkbox')
        checkbox.set(qn('w:checked'), '0')
        cell._element.xpath('.//w:vMerge')[0].addprevious(checkbox)
     
    doc = Document()
    table = doc.add_table(rows=1, cols=1)
    cell = table.cell(0, 0)
    add_checkbox(cell)
     
     
    doc.save("table_with_checkboxes1.docx"

    Aprés avoir définie la fonction add_checkbox à l'aide de OxmlElement
    je définit son attribut w:checked à 0 pour indiquer que la case à cocher n'est pas coché.
    L'élément de type checkbox est ajouté à la cellule en utilisant addprevious sur l'élément w:vMerge de la cellule.

    voici ce qui retour python lors de l'execution

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      cell._element.xpath('.//w:vMerge')[0].addprevious(checkbox) pour IndexError: list index out of range
    pour lui la liste retournée est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    vide  cell._element.xpath('.//w:vMerge')
    ce qui veut dire que l'élément n'existe pas.

    Nouvelle solution : prendre en compte cette liste vide


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    from docx.oxml import OxmlElement
    from docx.oxml.ns import qn
    from docx import Document
     
     
    def add_checkbox(cell):
        checkbox = OxmlElement('w:checkbox')
        checkbox.set(qn('w:checked'), '0')
        v_merge_elements = cell._element.xpath('.//w:vMerge')
        if v_merge_elements:
            v_merge_elements[0].addprevious(checkbox)
        else:
            cell._element.append(checkbox)
     
     
    doc = Document()
    table = doc.add_table(rows=1, cols=1)
    cell = table.cell(0, 0)
    add_checkbox(cell)
     
     
    doc.save("table_with_checkboxes2.docx")
    Ce code vérifie d'abord si des éléments w:vMerge sont présents en utilisant xpath, et si ce n'est pas le cas, il ajoute simplement le checkbox à la fin de l'élément de la cellule en utilisant append.
    on a bien un document avec un tableau mais celui-ci est vide de tous elements


    autre exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    from docx.oxml import OxmlElement
    from docx.oxml.ns import qn
    from docx import Document
     
    def create_table_with_checkboxes(document,num_rows, num_cols):
     
        table = document.add_table(rows=num_rows, cols=num_cols)
     
        for row in table.rows:
            for cell in row.cells:
                cell.text = "Example text"
                add_checkbox(cell)
     
        return document
     
    doc = Document()
    table = doc.add_table(rows=1, cols=1)
    create_table_with_checkboxes(doc,0, 0)
     
    doc.save("table_with_checkboxes2.docx")
    Le fichier creer contient une table totalement vide le texte ajouter n'est pas présetn

  17. #17
    Membre actif
    Homme Profil pro
    Animateur Numérique
    Inscrit en
    Février 2013
    Messages
    143
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Animateur Numérique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Février 2013
    Messages : 143
    Par défaut
    Je pense que tu n'as pas été voir mon lien (ci-dessus) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
     
    import docx
    import random
     
    def addCheckbox(para, box_id, name):
        run = para.add_run()
        tag = run._r
        fld = docx.oxml.shared.OxmlElement('w:fldChar')
        fld.set(docx.oxml.ns.qn('w:fldCharType'), 'begin')
     
        ffData = docx.oxml.shared.OxmlElement('w:ffData')
        e = docx.oxml.shared.OxmlElement('w:name')
        e.set(docx.oxml.ns.qn('w:val'), 'Check1')
        ffData.append(e)
        ffData.append(docx.oxml.shared.OxmlElement('w:enabled'))
        e = docx.oxml.shared.OxmlElement('w:calcOnExit')
        e.set(docx.oxml.ns.qn('w:val'), '0')
        ffData.append(e)
        e = docx.oxml.shared.OxmlElement('w:checkBox')
        e.append(docx.oxml.shared.OxmlElement('w:sizeAuto'))
        ee = docx.oxml.shared.OxmlElement('w:default')
        ee.set(docx.oxml.ns.qn('w:val'), '0')
        e.append(ee)
        ffData.append(e)
     
        fld.append(ffData)
        tag.append(fld)
     
        run2 = para.add_run()
        tag2 = run2._r
        start = docx.oxml.shared.OxmlElement('w:bookmarkStart')
        start.set(docx.oxml.ns.qn('w:id'), str(box_id))
        start.set(docx.oxml.ns.qn('w:name'), name)
        tag2.append(start)
     
        run3 = para.add_run()
        tag3 = run3._r
        instr = docx.oxml.OxmlElement('w:instrText')
        instr.text = 'FORMCHECKBOX'
        tag3.append(instr)
     
        run4 = para.add_run()
        tag4 = run4._r
        fld2 = docx.oxml.shared.OxmlElement('w:fldChar')
        fld2.set(docx.oxml.ns.qn('w:fldCharType'), 'end')
        tag4.append(fld2)
     
        run5 = para.add_run()
        tag5 = run5._r
        end = docx.oxml.shared.OxmlElement('w:bookmarkEnd')
        end.set(docx.oxml.ns.qn('w:id'), str(box_id))
        end.set(docx.oxml.ns.qn('w:name'), name)
        tag5.append(end)
     
    if __name__ == '__main__':
        document = docx.Document()
        document.add_heading('Document Title', 0)
        p1 = document.add_paragraph('A paragraph with a checkbox ')
        addCheckbox(p1, random.randint(16*1024, 32*1024), 'justinwashere')
        document.save('demo.docx')

  18. #18
    Membre éclairé Avatar de dedalios
    Homme Profil pro
    concepteur d'application
    Inscrit en
    Février 2008
    Messages
    495
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : concepteur d'application
    Secteur : Santé

    Informations forums :
    Inscription : Février 2008
    Messages : 495
    Par défaut
    Bonjour
    Merci pour ce derniere exemple qui est fonctionnel.
    Je vais voir s'il est possible de s'en inspirer.

    A priori il reprendre les principes du XML l'on trouve sur le lien proposé par fred1599 Travailler avec XML et Microsoft pour la partie Docx -> CheckBox

    checkBox (Propriétés du champ de formulaire de case à cocher)
    <w:ffData>
    <w:checkBox>
    <w:size w:val="20" />
    <w:checked w:val="true" />
    </w:checkBox>
    </w:ffData>


    Cet élément spécifie un ensemble de propriétés qui doivent être associées au champ de formulaire de case à cocher parent FORMCHECKBOX dans le document. Si le champ parent du formulaire n'est pas une case à cocher (c'est-à-dire que son code de champ n'a pas la valeur FORMCHECKBOX ), ces propriétés peuvent être ignorées.

  19. #19
    Membre éclairé Avatar de dedalios
    Homme Profil pro
    concepteur d'application
    Inscrit en
    Février 2008
    Messages
    495
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : concepteur d'application
    Secteur : Santé

    Informations forums :
    Inscription : Février 2008
    Messages : 495
    Par défaut autre difficulte
    Dans ce code je cherche a obtenir dans word un formulaire de texte prérempli avec un titre et un contenu.

    la commande
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
       fftag.set(qn('w:val'), f'CustomFormField_{title}')
    affiche bien dans word le tire "Nom" mais pour ce qui concerne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
         fftextfield.set(qn('w:value'), default_value)
    rien n'apparait dans word .... une zone est bien présente mais mais elle est vide .


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
     
    # coding: utf-8
     
    from docx import Document
    from docx.oxml import OxmlElement
    from docx.oxml.ns import qn
     
    def add_form_fields(document, form_fields):
        """
        Ajoute des champs de formulaire de texte au document à partir d'un dictionnaire
        de la forme {titre: valeur_par_défaut}.
        """
        for title, default_value in form_fields.items():
            # Créer un élément de formulaire
            formfield = OxmlElement('w:sdt')
            ffpr = OxmlElement('w:sdtPr')
            fftag = OxmlElement('w:tag')
            fftag.set(qn('w:val'), f'CustomFormField_{title}')
            ffpr.append(fftag)
            formfield.append(ffpr)
     
            # Ajouter un champ de texte
            fftext = OxmlElement('w:sdtContent')
            fftextfield = OxmlElement('w:textInput')
            fftextfield.set(qn('w:type'), 'text')
            fftextfield.set(qn('w:maxLength'), '50')
            fftextfield.set(qn('w:value'), default_value) # utilise la propriété "value" au lieu de "default"
            fftext.append(fftextfield)
            formfield.append(fftext)
     
            # Ajouter le champ de formulaire au document
            paragraph = document.add_paragraph()
            paragraph.add_run(title + ': ').bold = True
            paragraph._p.append(formfield)
     
    # Exemple d'utilisation :
    document = Document()
    form_fields = { 'Nom': 'max'}
    add_form_fields(document, form_fields)
    document.save('formulairemax.docx')

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 0
    Dernier message: 22/03/2020, 00h23
  2. Comment mettre en place des tâches cron
    Par ca_mido dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 1
    Dernier message: 28/01/2008, 14h54
  3. Réponses: 6
    Dernier message: 24/12/2007, 00h43

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo