[Tuto] Excel : manipulation des graphes via COM

Espace contenant des tutoriels divers concernant AutoIt.
Règles du forum
.

Tutoriel "La programmation avec Autoit" : https://openclassrooms.com/fr/courses/1 ... vec-autoit
Répondre
Avatar du membre
SrBelial
Niveau 7
Niveau 7
Messages : 335
Enregistré le : jeu. 22 juil. 2010 11:29
Localisation : 81 et 31
Status : Hors ligne

[Tuto] Excel : manipulation des graphes via COM

#1

Message par SrBelial »

Bonjour ....

Premier point : ce tuto fait suite à celui de 20100 ... si vous ne l'avez pas suivi et ne savez pas encore manipuler un minimum excel en utilisant AutoIT et les objets COM, alors rendez-vous ici

Tout d'abord l'exemple que nous allons décortiquer ensemble !
(cet exemple fonctionne avec le fichier fourni dans ce post (Journal1.txt) que vous pouvez générer vous même sur votre machine avec vos données et tout.
(pour plus d'infos cherchez comment faire fonctionner l'outil de microsoft "perfmon.msc", disponible depuis une fenêtre CMD ou depuis la commande "exécuter" du menu démarrer de windows)
=========================================================================
=== EXEMPLE
=========================================================================

Code : Tout sélectionner

;~ ================================================================================
;~ ===__________________________________VARS____________________________________===
;~ ================================================================================

Global $src
Global $dest

Global $oExcel = ObjCreate("Excel.Application")
Global $tab[5], $dateheure, $debit, $ram, $cpu, $tmp[3], $lineIndex = 2, $ligne = "666"

;~ ================================================================================
;~ ===_________________________________ENTRY_POINT______________________________===
;~ ================================================================================

generateXLSFile("Journal1.txt")

;~ ================================================================================
;~ ===_________________________________FUNCTIONS________________________________===
;~ ================================================================================

Func generateXLSFile($journalFile)

    $src = FileOpen($journalFile)

    Local $progress = 0
    ProgressOn("Traitement Journaux de surveillance Serveur", _
            "Traitement des données de performance du serveur")

    With $oExcel
        .Visible = 1
        .WorkBooks.Add
    EndWith

    WinSetState("[CLASS:XLMAIN]", "", @SW_MINIMIZE)

    $oExcel.ActiveSheet.Name = "Journal Performances Serveur"
    $oExcel.ActiveSheet.Cells(2, 2) = "Heure"
    $oExcel.ActiveSheet.Cells(2, 3) = "Ecriture (ko/s)"
    $oExcel.ActiveSheet.Cells(2, 4) = "Lecture (ko/s)"
    $oExcel.ActiveSheet.Cells(2, 5) = "Débit réseau (ko/s)"
    $oExcel.ActiveSheet.Cells(2, 6) = "RAM Disponible (Mo)"
    $oExcel.ActiveSheet.Cells(2, 7) = "CPU Usage (%)"

    $ligne = FileReadLine($src)

    While StringLen($ligne) > 0

        $lineIndex += 1
        $ligne = FileReadLine($src)
        $tab = StringSplit($ligne, Chr(9))

        ConsoleWrite($ligne & @CRLF)

        If $tab[0] == 6 Then

            $progress += 0.05
            ProgressSet($progress)

            $dateheure = $tab[1]

            $ddwrite = $tab[2]
            $ddread = $tab[3]
            $debit = $tab[4]

            $ram = $tab[5]
            $cpu = $tab[6]

            $dateheure = StringReplace($dateheure, ".", ",")

            $oExcel.ActiveSheet.Cells($lineIndex, 2) = $dateheure
            $oExcel.ActiveSheet.Cells($lineIndex, 3) = StringReplace($ddwrite, ",", ".") / (1024)
            $oExcel.ActiveSheet.Cells($lineIndex, 4) = StringReplace($ddread, ",", ".") / (1024)
            $oExcel.ActiveSheet.Cells($lineIndex, 5) = StringReplace($debit, ",", ".") / (1024)
            $oExcel.ActiveSheet.Cells($lineIndex, 6) = StringReplace($ram, ",", ".")
            $oExcel.ActiveSheet.Cells($lineIndex, 7) = StringReplace($cpu, ",", ".")

        EndIf
    WEnd

;~  Ci dessus, la partie génération du tableau contenant les données ....
;~  je ne détaillerai pas .... cherchez le tuto correspondant
;~  (le lien est dispo au début de ce message)
;~
;~  Ci dessous la partie génération des graphiques excel, que je vais tenter de vous décortiquer proprement
;~

    $oExcel.ActiveWorkBook.Charts.Add
    $oExcel.ActiveWorkBook.Charts.Add
    $oExcel.ActiveWorkBook.Charts.Add
    $oExcel.ActiveWorkBook.Charts.Add

    $oExcel.ActiveWorkBook.Charts(1).SetElement(2)
    $oExcel.ActiveWorkBook.Charts(1).ChartTitle.Text = "Activité du disque dur"
    $oExcel.ActiveWorkBook.Charts(1).ChartType = 4
    $oExcel.ActiveWorkBook.Charts(1).SeriesCollection(3).delete
    $oExcel.ActiveWorkBook.Charts(1).SeriesCollection(3).delete
    $oExcel.ActiveWorkBook.Charts(1).SeriesCollection(3).delete
    $oExcel.ActiveWorkBook.Charts(1).Legend.Position = -4160

    $oExcel.ActiveWorkBook.Charts(2).ChartType = 4
    $oExcel.ActiveWorkBook.Charts(2).SeriesCollection(1).delete
    $oExcel.ActiveWorkBook.Charts(2).SeriesCollection(1).delete
    $oExcel.ActiveWorkBook.Charts(2).SeriesCollection(2).delete
    $oExcel.ActiveWorkBook.Charts(2).SeriesCollection(2).delete
    $oExcel.ActiveWorkBook.Charts(2).Legend.Position = -4160

    $oExcel.ActiveWorkBook.Charts(3).ChartType = 4
    $oExcel.ActiveWorkBook.Charts(3).SeriesCollection(1).delete
    $oExcel.ActiveWorkBook.Charts(3).SeriesCollection(1).delete
    $oExcel.ActiveWorkBook.Charts(3).SeriesCollection(1).delete
    $oExcel.ActiveWorkBook.Charts(3).SeriesCollection(2).delete
    $oExcel.ActiveWorkBook.Charts(3).Legend.Position = -4160

    $oExcel.ActiveWorkBook.Charts(4).ChartType = 4
    $oExcel.ActiveWorkBook.Charts(4).SeriesCollection(1).delete
    $oExcel.ActiveWorkBook.Charts(4).SeriesCollection(1).delete
    $oExcel.ActiveWorkBook.Charts(4).SeriesCollection(1).delete
    $oExcel.ActiveWorkBook.Charts(4).SeriesCollection(1).delete
    $oExcel.ActiveWorkBook.Charts(4).Legend.Position = -4160


    $dest = @WorkingDir & "\CHARTS.xls"
    Local $xlNormal = 1
    $oExcel.Application.DisplayAlerts = 0
    $oExcel.Application.ScreenUpdating = 0
    $oExcel.ActiveWorkBook.SaveAs($dest, $xlNormal, Default, Default, Default, Default, 2, 1)
    $oExcel.Quit

    FileClose($journalFile)

EndFunc
 
Et c'est paaartiiii !
...Décortiquons, décortiquons ... :

Que se passe-t'il dans notre petit scriptounet ?
* hé bien première chose : on rempli une feuille ... je ne détaille pas, j'ai utilisé le tuto cité plus haut dans le post pour apprendre comment faire pour remplir une feuille, modifier des données, etc ... je vous laisse donc étudier ça !

* on entre enfin dans le vif du sujet : créons des graphiques !
Comme vous le voyez la création d'un graphique se fait par un appel à
$oExcel.ActiveWorkBook.Charts.Add ... Pas de secret, ça créé un graphique !
En l'occurence nous en créons 4 ici ... qui s'ajouteront sous la forme de feuilles supplémentaires

* Je vous l'explique car le script s'exécutant trop vite vous ne savez pas la cuisine qui se fait dans ce fichier excel :
lorsque vous créez des graphiques par ce biais, excel rempli automatiquement avec les données de feuille active que nous avions précédemment ... pour peu qu'elle soit correctement remplie, avec les cellules au bon format et tout et tout ...

* Du coup nous on veut pas toutes les séries sur tous les graphiques (pour une question de lisibilité déjà, puis pour une question de différence d'échelle aussi !). Comment faire ? En supprimant une ou plusieurs séries !
explication : il s'agit d'appeller $oExcel.ActiveWorkBook.Charts(1).SeriesCollection(3).delete
Le premier chiffre (1) est l'indice du graphique sur lequel nous agissons (de 1 à 4 donc puisque 4 graphiques)
Le second (3) est l'indice de la série que nous voulons supprimer (du coup la 4eme colonne du tableau que nous avons rempli, la première étant l'axe des abscisses)
En faisant cela nous supprimons la 3eme série du graphique, qui en comporte encore 3 du coup ....

ATTENTION SUBTILITE :
Héhé je vois les petits malins arriver : bouh spa optimisé ton truk, ta 3 foua la pelle a la mème comande !
bah oui, parce que on supprime la 3eme série ... ça décale tout ce qui était placé après ! Pas de série vide dans un graphe excel, la série 4 devient 3, 5 devient 4, etc ...

Si vous avez un plantage de script il y a des chances que vous soyez en train d'essayer de supprimer une série qui n'existe pas ! (du coup pensez à vous demander combien de série me reste-t'il ? à chaque fois ... si il en reste 2 on ne peut supprimer que la 1 ou la 2, pas la 3 !)

* Au fait, on a zappé un truc !
Non non, c'est pas zappé, j'y viens tout juste ! Alors sur nos graphes ou on a plus qu'une série on remarque que c'est hyper cool : le titre se met tout seul ! Mais que faire pour le premier graphe, avec deux séries ? pas de titre ?
Bah on peut en ajouter un de la façon suivante :
$oExcel.ActiveWorkBook.Charts(1).ChartTitle.Text = "Activité du disque dur"

* Et si on veut modifier le style de graphique ? Nan parce que c'est sympa le truc par défaut mais moi y me faut personnaliser ça un peu ...
Alors écoute ça jeune ! Tu ne connais pas encore la vie mais tu vas découvrir un truc surpuissant introuvable sur le net .... que le SrBelial t'as déniché lui même dans son petit pc de blaireau geek ....
Commençons par la ligne servant à modifier le style de graphique :
$oExcel.ActiveWorkBook.Charts(4).ChartType = 4
Bon rien de sorcier ... on attaque le Chart qu'on veut, on modifie la propriété ChartType qui comme son nom l'indique .... représente le style de Chart ... hé mais ! Wait ... What ?? WTF is this F***ing 4 number at zi end of zi line ??? (attends ... quoi ? b***el c'est quoi ce p$$$ain de nombre 4 à la fin de la ligne ?)

hé bé voila, la toute puissance de SrB s'exprime :
Excel règle ses petits détails avec ce qu'on appelle un enum ... en gros c'est une sorte de liste de valeurs pouvant servir à faire des choix ... pour simplifier bah un enum c'est comme si on donne une valeur numérique à des noms de choix (ou inversement pour les tordus ou les puristes...au choix).
Et donc le problème c'est que ces enums (qui ressemble à msoSortOrderAscending ou xlLabelPositionCenter par exemple) bah autoit il a un peu du mal ... presque injouable le truc ... du coup bah on cherche dans le fichier que j'ai joint à ce post (OFFICE_EXCEL_ENUMS.TXT) avec un CTRL+F parce que c'est plusieurs milliers de lignes que je suis allé trier (pour de vrai !) ... et une foi qu'on a trouvé l'énum qu'on cherche, bah en face y a sa valeur numérique ... là en l'occurence 4 c'est pour "xlLine = 4", ligne 2208 de mon fichier magique ... on constate qu'il est placé dans un gros énum appelé XlChartType ... ça tombe plutot bien hein !
(je vous explique après comment on devine quel enum rechercher)

* Bon une fois ceci passé, on se dit qu'on le reverra pas souvent .... bah si !
$oExcel.ActiveWorkBook.Charts(4).Legend.Position = -4160
Et toc ! Bah là c'est pareil ... on cherche ... bah ... jle trouve plus (désolé ça tombe à plat du coup, je sais plus d'ou je le sors lui :( )
essayez voir avec "msoElementLegendTop = 102" au cas ou ... :?:
bon passons ... !

* Petite astuce subtile numéro 2 :
J'ouvre mon fichier Excel tout juste créé et ... pas cool il est verrouillé en écriture ou un truc du genre ... impossible de modifier un graphique !
bah je sais pas pourquoi mais il existe une manip pour déverouiller ... sous Excel 2007 ça se fait comme ceci :
"onglet révision" cliquer sur "partager le classeur" décocher la case "permettre une utilisation ... patati patata ..."
valider mode exclusif et c'est bon !

* Maintenant bon sang de bois comment t'on fait pour trouver quelles commandes utiliser pour manipuler ce graphe ???
Alors pareil : je détaille pour excel 2007 parce que c'est la version que j'ai ... si qqn peut traduire en 97-2003 ... !
=> Clic sur "Affichage" puis sur "Macros>Enregistrer une macro" ... on valide, peu importe le nom et tout ça,
on effectue les changement qu'on aimerait automatiser (par exemple on modifie le style de graphique, on mets des batons ou un camenbert), On re-va sur Macros>Arrêter l'enregistrement
Après, re sur macro>Afficher les macros, on sélectionne laquelle on veut, on clique sur le bouton modifier ... et là tadaaaaam : on a le code en VBA ! reste plus qu'a transformouiller la syntaxe pour que ça ressemble un peu plus à l'autoit, si on a un enum on cherche dans mon fichier magique la valeur correspondant ! et après on teste une dizaine de fois parce que ça marche jamais du premier coup ... -___-"
je peux vous le dire maintenant, j'en ai ch*é pour trouver le peu que j'ai fait !

la prochaine fois je vous parlerai des styles à appliquer aux cellules excel, c'est sympa aussi !
Fichiers joints
OFFICE_EXCEL_ENUMS.TXT
Comment trouver la valeur d'un enum donné ...
(87.77 Kio) Téléchargé 749 fois
Journal1.txt
Journal de surveillance système : Exemple
(9.25 Kio) Téléchargé 741 fois
.-SrB-. The One
  • NON ! AutoIt n'est PAS un langage réservé à la réalisation de bots !
  • OUI ! AutoIt est un langage à part entière !
  • Dans SciTE sélectionnez 1 mot puis F1
  • Don't want english doc ?? go to documentation française !! >>ICI<<
[/size]
Habibsbib
Niveau 7
Niveau 7
Messages : 393
Enregistré le : dim. 30 août 2009 13:49
Localisation : Euh...Verticale, entre le siège et l'écran...
Status : Hors ligne

Re: [Tuto] Excel : manipulation des graphes via COM

#2

Message par Habibsbib »

Super tutoriel :)
Avatar du membre
SrBelial
Niveau 7
Niveau 7
Messages : 335
Enregistré le : jeu. 22 juil. 2010 11:29
Localisation : 81 et 31
Status : Hors ligne

Re: [Tuto] Excel : manipulation des graphes via COM

#3

Message par SrBelial »

merci ^__^
j'ai pas pu y consacrer autant de temps que j'aurais voulu, mais je serai sans doute amener à le compléter un peu ... j'espère !
.-SrB-. The One
  • NON ! AutoIt n'est PAS un langage réservé à la réalisation de bots !
  • OUI ! AutoIt est un langage à part entière !
  • Dans SciTE sélectionnez 1 mot puis F1
  • Don't want english doc ?? go to documentation française !! >>ICI<<
[/size]
Avatar du membre
Jerome
Niveau 9
Niveau 9
Messages : 661
Enregistré le : mar. 07 avr. 2009 08:35
Localisation : Picardie
Status : Hors ligne

Re: [Tuto] Excel : manipulation des graphes via COM

#4

Message par Jerome »

Merci pour se tuto, sa m'aide pas mal :)



Jérôme
Répondre