Pilotage OLE d'Excel

Chapitre parent Chapitre précédent Chapitre suivant

LDSQL incorpore une classe cTableurExcel permettant de piloter Excel en OLE.
Cela suppose bien entendu qu'Excel soit installé sur le poste de travail où LDSQL s'exécute.


La classe fournit un ensemble de méthodes d'usage assez simple pour manipuler un classeur Excel, sans avoir à connaître le modèle objet d'Excel qui est utilisé de façon sous-jacente par la classe.

On peut ainsi enregistrer le résultat d'une requête dans un classeur Excel en formatant les données à sa guise.


Mode d'emploi de la classe cTableurExcel

La première chose à faire est dé déclarer un objet de ce type :


MonTableur est un cTableurExcel


Pour manipuler le classeur proprement dit, on dispose des méthodes suivantes :


// Permet de créer un nouveau classeur (comme lorsqu'on ouvre Excel)
MonTableur:Créer()

// Pour ouvrir un classeur existant
// Le fichier désigné par FichierClasseur doit exister et être un fichier Excel valide (format .xls ou .xlsx)
MonTableur:OuvrirClasseur(FichierClasseur)


// Pour enregistrer le classeur ayant été ouvert initialement
MonTableur:Enregistrer()

// Pour enregistrer un nouveau classeur
// Si FichierClasseur n'est pas indiqué, une fenêtre de sélection est proposée.
MonTableur:EnregistrerSous(FichierClasseur)

MonTableur:FermerClasseur()
MonTableur:Quitter()                // Ferme l'instance d'Excel utilisée en OLE


Au sein du classeur, on peut manipuler différentes feuilles par les méthodes suivantes :


MonTableur:Feuille_Ajouter(NomFeuille)
MonTableur:Feuille_Renommer(AncienNom, NouveauNom)
MonTableur:Feuille_Sélectionner(NomFeuille)
MonTableur:Feuille_SélectionnerParIndice(IndiceFeuille)
MonTableur:Feuille_Supprimer(NomFeuille)


Pour lire ou écrire une valeur :


Valeur = MonTableur:Cellule_Lire(UneCellule)

MonTableur:Cellule_Ecrire(UneCellule, Valeur)


Pour identifier la cellule à lire ou écrire, il faut utiliser la syntaxe habituelle dans Excel, de la forme XN, ou X est une lettre (ou une suite de lettres) représentant la colonne et N est un nombre représentant la ligne.
Exemple : A1,  B10, AB125 ...

Pour convertir un N° de colonne en une lettre ou suite de lettre, la classe propose la méthode LC :
               MonTableur:LC(1) retourne A,  MonTableur:LC(2) retourne B,  MonTableur:LC(27) retourne AA...
Pour écrire une valeur en ligne 5, colonne 4, on peut donc écrire :

MonTableur:Cellule_Ecrire(MonTableur:LC(4)+5, Valeur)

équivalent à

MonTableur:Cellule_Ecrire("D5", Valeur)


On peut effectuer des Copier/Coller :


MonTableur:Cellule_Copier(UneCellule)

MonTableur:Cellule_Couper(UneCellule)
MonTableur:Cellule_Coller(UneCellule)


Pour se positionner sur uen cellule, ou sélectionner une plage de cellules :


MonTableur:Cellule_Sélectionner(Sélection)


Pour identifier l'étendue de la sélection, on renseignera dans le paramètre Sélection une étendue sous la forme CelluleDébut:CelluleFin, CelluleDébut et CelluleFin référençant une cellule avec la syntaxe XN précisée ci-dessus.
Exemple : A1:C1  ou  A2:C999

Pour sélectionner une ligne ou une colonne, on référencera simplement le numéro de la ligne ou la lettre de la colonne concernée. On peut aussi sélectionner plusieurs lignes ou colonnes  : 1:3 pour sélectionner les lignes 1 à 3,  A:C pour sélectionner les 3 premières colonnes.


Pour mettre en forme une cellule ou une plage de cellules, on peut faire appel aux méthodes suivantes :


MonTableur:Cellule_Format(Format, Sélection)

MonTableur:Cellule_Police(Sélection, "Calibri", 10, Vrai, Vrai, Faux, Blanc, BleuClair)

MonTableur:Cellule_Graisse(Vrai, Faux, Vrai)

MonTableur:Cellule_AlignementHorizontal(Sélection, 2, 1)

MonTableur:Cellule_AlignementVertical(Sélection, 2)

MonTableur:Ligne_Hauteur(Ligne,30)

MonTableur:Colonne_Largeur(Colonne,100)


Le format attendu par la méthode CelluleFormat peut être : TEXTE, NOMBRE (interprété comme 0,00), DATE (interprété comme JJ/MM/AAAA), HEURE (interprété comme HH:MM:SS), MONETAIRE (interprété comme #,##00 €), POURCENTAGE (interprété comme 0,00%), ou tout autre format reconnu par Excel.


Les paramètres de la méthode CellulePolice sont dans l'ordre : Nom de la police, Taille, Gras, Italique, Souligné, Couleur du texte, Couleur de fond.
Les paramètres Gras, Italique et Souligné sont peuvent prendre les valeurs 0 ou 1, Vrai ou Faux, ou encore -1 pour demander à ce que l'état correspondant de la cellule soit inversé.
Les paramètres Couleur du texte et Couleur de fond attendent une valeur entière représentant une couleur. On peut utiliser une des constantes couleur prédéfinies de Windev ou la fonction Windev RVB().

La méthode Cellule_Graisse s'applique sur la sélection courante ; elle attend 3 paramètres qui sont dans l'ordre Gras, Italique et Souligné. Les valeurs attendues sont les mêmes que dans la méthode Cellule_Police. On peut ne renseigner que les paramètres nécessaires : par exemple, si on souhaite juste mettre en gras, on écrira Cellule_Graisse(Vrai) ; si on souhaite mettre en italique, on écrira Cellule_Graisse(*, Vrai) . Notez l'utilisateur de la valeur * pour les paramètres non renseignés situés à gauche de celui que l'on renseigne.

Le 2ème paramètre de la méthode Cellule_AlignementHorizontal est un entier pouvant prendre les valeurs 1=Gauche, 2=Centre, 3=Droite. Le 3ème paramètre doit être passé à la valeur 1 pour forcer un retour ligne automatique dans la ou les cellules référencées.

Le 2ème paramètre de la méthode Cellule_AlignementVertical est un entier pouvant prendre les valeurs 1=Haut, 2=Centre, 3=Bas.

Pour ce qui est des hauteurs de ligne et largeurs de colonnes, on peut demander un ajustement automatique en spécifiant la valeur -1.


On peut insérer/supprimer/masquer des lignes ou colonnes :

MonTableur:Ligne_Insérer(Ligne)                // N° de ligne en-dessous de laquelle une ligne sera insérée
MonTableur:Ligne_Supprimer(Ligne)                // N° de la ou les lignes à supprimer
MonTableur:Ligne_Masquer(Ligne)                // N° de la ou les lignes à masquer

MonTableur:Colonne_Insérer(Colonne)                // Colonne à droite de laquelle une colonne sera insérée
MonTableur:Colonne_Supprimer(Colonne)
MonTableur:Colonne_Masquer(Colonne)



D'autres méthodes sont disponibles pour

- Ajouter d'un filtre automatique sur les colonnes : MonTableur:Feuille_AutoFiltre()

- Figer des lignes ou des colonnes : MonTableur:Feuille_FigerLesVolets()


Exemples

2 exemples sont fournis pour illustrer ces possibilités :


Pour aller plus loin

La classe cTableurExcel met à disposition l'objet m_xExcel qui est un objet de  type Application object Excel. La plupart des méthodes que l'on va employer vont s'appliquer implicitement au classeur courant ActiveWorkbook de cet objet, qui est un objet de type Workbook, ou à la feuille courante ActiveSheet de ce classeur qui est un objet de type Worksheet.

A partir de cet objet m_xExcel, on peut utiliser toutes les méthodes et propriétés offertes par cet objet lui-même, le ou les classeurs ouverts, la ou les feuilles de ces classeurs, en utilisant la syntaxe OLE.


Quelques exemples :


xls:m_xExcel>>ActiveSheet>>Name    donne le nom de la feuille active

xls:m_xExcel>>Sheets>>Count    donne le nombre de feuilles du classeur


Pour trier le contenu d'un classeur comportant 3 colonnes, dans l'ordre ascendant des colonnes 1 et 2 :


// Constantes Excel (qui ne peuvent être définies en tant que constantes dans un code compilé dynamiquement)

xlSortOnValues est un entier = 0

xlAscending est un entier = 1

xlDescending est un entier = 2

xlYes est un entier = 1

xlNo est un entier = 2


xls est cTableurExcel


xls:OuvrirClasseur(SysRep(srBureau)+"\TestTri.xlsx")


MonTri est un objet OLE dynamique = xls:m_xExcel>>ActiveSheet>>Sort

MonTri>>SortFields>>Clear()

MonTri>>SortFields>>Add(xls:m_xExcel>>Range("A:A"), xlSortOnValues , xlAscending)

MonTri>>SortFields>>Add(xls:m_xExcel>>Range("B:B"), xlSortOnValues , xlAscending)

MonTri>>SetRange(xls:m_xExcel>>Range("A:C"))

MonTri>>Header = xlYes

MonTri>>MatchCase = Faux

MonTri>>Apply()


xls:Enregistrer()

xls:Quitter()




Pour insérer des sous-totaux sur les colonnes C et D en rupture sur la valeur contenue en colonne A :


// Constantes Excel (qui ne peuvent être définies en tant que constantes dans un code compilé dynamiquement)

xlSum est un entier = -4157


xls est cTableurExcel


xls:OuvrirClasseur(SysRep(srBureau)+"\TestSousTotaux.xlsx")


ColonnesASommer est un tableau d'entiers = [3 , 4]


MaSélection est un objet OLE dynamique = xls:m_xExcel>>Range("A:D")

MaSélection>>Subtotal(1, xlSum, ColonnesASommer)


xls:Enregistrer()

xls:Quitter()