Étape 6: C++ Automation d’Excel...
TCLogger2Excel a commencé comme une application de ligne de commande de Windows, mais a été convertie en une application de base de la boîte de dialogue MFC afin d’ajouter la boîte de dialogue qui définit les valeurs par défaut dans la section variables de chaque feuille de calcul Excel. L’avantage de l’utilisation de MFC, c’est que c’est facile ! Il n’est pas une bibliothèque d’interface utilisateur parfaite, mais il est très facile à utiliser. Je vais pas couvrir le code MFC dans ce Instructable mais plutôt mettra l’accent sur l’explication des principales parties du code qui peuvent être utiles lors de l’écriture des autres programmes. Le premier exemple en est comment automatiser Excel de C++.
Tout d’abord quelques mots sur ces deux choix ici, C++ et Excel.
Excel a été choisi parce que c’est un outil puissant pour manipuler et afficher des données. Graphiques Excel faire nos courbes Poussée et pression visuellement compréhensible. Les formules d’Excel l’un & n mathématiques de la couverture de l’onglet qui dépasse de loin mon niveau de confort. En prenant le TC enregistreur de données enregistrées et plaçant dans Excel, l’utilisateur peut maintenant manipuler et effectuer d’innombrables calculs et opérations.
C++ est en revanche mon langage de programmation de choix ! Je ne vais pas vous ennuyer avec un long monologue sur ses vertus ou les fautes des autres langages de programmation. Je dirai simplement que comme un programmeur professionnel pendant plusieurs décennies, et sur de nombreuses plates-formes, C++ fournit le plus de pouvoir à la plus grande commodité. Avec elle que je peux non seulement générer du code natif optimisé, mais avec C++ modernes, je peux utiliser les puissantes fonctions de la bibliothèque Standard C++ qui rivalisent avec ceux de n’importe quel autre langage de programmation, en termes de puissance, clarté et facilité d’utilisation.
Automatisation d’Excel à partir de C++
COM Automation, il est facile automatiser Microsoft Excel. Pour commencer, vous devez importer les bibliothèques de types Excel comme indiqué ci-dessous (à partir de ExcelAutomation.cpp) :
Cela entraîne le compilateur à générer des fichiers d’en-tête (EXCEL.tlh et MSO.tlh) et les fichiers de mise en œuvre (EXCEL.tli et MSO.tli) qui simplifient l’utilisation des objets d’automatisation COM nous allons utiliser. Si vous ouvrez les fichiers .tlh, vous y trouverez une foule de renseignements qui vous seront utiles lors de l’exécution des tâches variées.
Ensuite, nous devons créer une instance de l’objet application Excel. Le code suivant provient de la fonction CreateExcelSpreadsheet dans ExcelAutomation.cpp...
Le premier bloc met en place l’environnement COM et à l’aide de la classe de scope_exit de N4189, il déchire vers le bas quand aShutdown est hors de portée à la fin de la fonction :
Le bloc suivant verra si le registre sur cet ordinateur possède une entrée pour Excel. Il n’est pas une garantie que Excel est installé, mais c’est un bon début :
Maintenant, nous créons une instance de l’objet Excel :
Avec cette configuration en place, que nous pouvons maintenant créer des feuilles de calcul, remplir des cellules, créer des graphiques, et beaucoup plus. Pour illustrer cela nous sera ensuite rendre l’application visible, créez un classeur et agrandissez la fenêtre de l’application.
pXLBook est l’objet de classeur Excel, que nous allons utiliser le reste du programme.
La fonction (mal nommée) ProduceExcelWorkbook en ExcelAutomation.cpp fonctionnera toujours avec la feuille de calcul Excel actif :
Nous pouvons donner la feuille de calcul à un nom de code comme ceci :
Il est important de noter que l’Excel avec un nom se terminant par Ptr comme Excel::_WorksheetPtr sont des objets C++ RAII semblables à ceux offerts par N4189. _bstr_t est également un objet RAII. En bref, cela signifie que la mémoire derrière ces objets sera automatiquement libérée lorsque la variable laisse place, même si cela arrive à cause d’une exception. (Cette dernière est un concept que beaucoup de programmeurs C/C++ oublie ! Il est très important d’utiliser RAII ou pour s’assurer objet nettoyage lorsqu’une exception se déroule ! Si vous verrouillez un CRITICAL_SECTION par exemple à l’aide de EnterCriticalSection mais ne parviennent pas à LeaveCriticalSection lorsqu’une exception provoque votre code pour vous détendre--peut-être même une exception quelque part dans une bibliothèque vous appelez, vous fuira la serrure et il sera presque impossible à détecter même sous le débogueur. Vous vous retrouverez avec un blocage qui n’a aucun sens ! Utilisez des objets RAII ! La seule alternative est d’utiliser des blocs try/finally pour chaque ressource!)
Plus tard lorsque nous avons besoin d’une nouvelle feuille de calcul le code suivant crée :
Avec une feuille de calcul active, les données peuvent être placées dans une cellule à l’aide d’une fonction comme celle de ExcelAutomation.cpp :
Notez qu’une "plage de cellules" (pDataRange) est créée et ensuite assignée une valeur de chaîne. Vous pouvez également préparer un SAFEARRAY de données pour affecter à une plage de cellules. Pour voir comment cela se fait regarder de ExcelAutomation.cpp lignes 270-397.
ExcelAutomation.cpp montre également comment ajouter un graphique à une feuille de calcul (2 différents exemples), personnaliser les étiquettes de graphique, ajouter une courbe de tendance, les cellules de couleur et changer les tailles de police d’étiquette.
Un dernier Conseil... Si vous créez une macro dans Excel et puis modifiez, vous verrez le code de base visuel qui est très facile de convertir en C++ en utilisant les exemples fournis dans ExcelAutomation.cpp.