Ecrire du texte dans une feuille de calcul à partir d’un script Python

openoff

Utiliser un script par exemple pour générer un tableau de bord enrichi en jouant sur les propriétés des chaînes de caractère.

Note I : les différentes propriétés des chaînes de caractère ont déjà été répertoriées sur ce site dans le dictionnaire (taper char dans la fonction recherche)

Note II : Il est nécessaire au préalable que l’application OpenOffice soit à l’écoute du port 2002.

taper cette commande sous linux dans le terminal avant l’exécution du script ci-dessous :

?Download socket
1
soffice "-accept=socket,host=localhost,port=2002;urp;StarOffice.ServiceManager"

Exemple de script python :

1) Ouverture d’une feuille de calcul

2) Ecriture d’un texte et de formules dans la feuille

?Download format_text
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
#!/usr/bin/python
# -*- coding: utf-8 -*-
# placed in public domain by лобев
 
from basic_ops import* # tout importer
 
class format_text:
    def __init__(self, sheet):
        self.sheet = sheet
        # test de formules
        self.test_formulas()
        # test de valeurs
        self.test_values()
        # test du texte
        self.test_text()        
        # test de la mise en forme
        self.test_appearance()
 
    def test_formulas(self):
        # Ecriture d'un nombre dans la cellule (B, 3)
        self.sheet.getCellByPosition(1,2).setFormula("=B2*19.6%")
        # Ecriture d'un nombre dans la cellule (B, 3)
        self.sheet.getCellByPosition(1,3).setFormula("=SUM(B2+B3)")        
 
    def test_values(self):
        # Ecriture d'un nombre dans la cellule (B, 2)
        self.sheet.getCellByPosition(1,1).setValue("36582,04")
 
    def test_text(self):
        # Ecriture du texte dans la cellule (A, 1)
        self.sheet.getCellByPosition(0,0).setString("Tableau de bord")
        # Ecriture du texte dans la cellule (A, 2)
        self.sheet.getCellByPosition(0,1).setString("CAHT")
        # Ecriture du texte dans la cellule (A, 3)
        self.sheet.getCellByPosition(0,2).setString("TVA")  
        # Ecriture du texte dans la cellule (A, 4)
        self.sheet.getCellByPosition(0,3).setString("CATTC")   
 
    def test_appearance(self):
        a=1 # A SUIVRE
 
 
# -----------------------------------------------------------------------
if __name__ == "__main__":   
    path = "test.ods"
    # ouverture d'un classeur openoffice existant
    calc = UnoClient().open_document(path)
    # récupération de la première feuille de calcul
    sh = calc.getSheets().getByIndex(0)
    # transmission de l'objet feuille du classeur à la classe format_text
    test = format_text(sh)

Résultat dans la feuille de calcul test (texte sans formatage) :

test-sans-formattage

Le texte inscrit-ci dessus n’est pas formaté. En effet, la fonction def test_appearance n’est pas servie. Le code détaillé plus bas permet de compléter en effectuant les opérations suivantes :

  • fusion des deux premières cellules horizontales
  • mise en gras du texte dans la nouvelle cellule
  • centrage du texte
  • format des nombres en arrêtant à la deuxième décimale et espace des milliers
1
2
3
4
5
6
7
8
9
10
11
12
13
def test_appearance(self):
        firstCells = self.sheet.getCellRangeByPosition(0, 0, 1, 0)
        # fusion des deux cellules du haut
        firstCells.merge(True)
        # centrer le texte des deux cellules du haut
        struct = firstCells.getPropertyValue('HoriJustify')
        struct.value = TEXT_ALIGN_CENTER
        firstCells.setPropertyValue('HoriJustify', struct)
        # texte en gras
        firstCells.setPropertyValue('CharWeight', FONT_WEIGHT_BOLD)
        # format des nombres
        numCells = self.sheet.getCellRangeByPosition(1, 1, 1, 3)
        numCells.NumberFormat = 4 # correspond au formatage '# ###,00'

Résultat dans la feuille de calcul test (texte avec formatage) :

test-avec-formattage

 

Le module basic_ops (mes excuses Jo ;-), il ne fait pas partie de theano, c’est juste un oubli de ma part ) :

 

?Download basic_ops
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
#!/usr/bin/python
# -*- coding: utf-8 -*-
# modified and replaced in public domain by лобев
import uno
import os
 
# opérations générales sur un document OpenOffice
class UnoClient:
    def __init__(self):
        # récupération du composant de contexte à partir duquel seront créés les autres composants uno
        localContext = uno.getComponentContext()
        # création du composant résolution d'adresse à partir du composant de contexte
        resolver = localContext.ServiceManager.createInstanceWithContext\
            ("com.sun.star.bridge.UnoUrlResolver", localContext)
        # résolution de l'adresse du gestionnaire de service d'OpenOffice 
        # (configuration d'OpenOffice en mode serveur, port 2002 par défaut en principe)
        self.smgr = resolver.resolve("uno:socket,host=localhost,port=2002;urp;StarOffice.ServiceManager")
        # ...
        remoteContext = self.smgr.getPropertyValue("DefaultContext")
        # instanciation d'un composant qui supporte le service spécifié à factory 
        # (par exemple 'scalc' pour la création d'une feuille de calcul
        self.desktop = self.smgr.createInstanceWithContext("com.sun.star.frame.Desktop", remoteContext)        
 
    def create_document(self, app):
        # directive complète de fabrication (url)
        url = "private:factory/{0}".format(app)
        # retour du composant document
        return self.desktop.loadComponentFromURL(url, "_blank", 0, ())
 
    def open_document(self, path):
        # UNO ne supporte que les chemins d'accès absolus
        url = uno.systemPathToFileUrl(os.path.abspath(path))
        # retour du composant document
        return self.desktop.loadComponentFromURL(url, "_blank", 0, ())        
 
 
# -----------------------------------------------------------------------
if __name__ == "__main__":   
    path = "test.ods"
    # création d'un classeur openoffice
    # calc = UnoClient().create_document('scalc')
    # ouverture d'un classeur openoffice existant
    calc = UnoClient().open_document(path)