Rapports faciles en C / C ++

Si vous développez en C / C ++ un logiciel pour les opérateurs (administrateurs) d'hôpitaux, de magasins, de services de location de scooters gyroscopiques, de services de réparation de téléphones portables, vous avez probablement dû faire face à la tâche de créer des rapports afin de les imprimer sur une imprimante, ou au moins en PDF. Il existe de nombreux packages tiers pour Embarcadero RAD Studio qui vous permettent de le faire. Tels que FastReport, QuickReport, Crystal Reports, etc. Mais à mon avis, tous ces packages nécessitent une compréhension approfondie de leur mécanisme et de leur interface. Il faut beaucoup de temps pour les étudier et, surtout, le code pour générer le rapport le plus simple comprendra un grand nombre de lignes. Lorsque j'ai rencontré pour la première fois la tâche de générer des rapports sous C / C ++, j'ai commencé avec FastReport et j'ai réalisé que je n'aimais absolument pas cet outil.

En ce moment même, une merveilleuse pensée m'est venue à l'esprit: à quel point ce serait cool de prendre un simple fichier EXCEL, d'y ajouter des informations statiques et de le formater selon vos besoins. Le programme n'ouvrira que ce fichier, le remplira de données dynamiques et l'enregistrera ou l'enverra pour l'imprimer! Cela a servi de point de départ à mon étude du mécanisme OLE pour travailler avec des fichiers MS Office à partir de programmes développés dans Embarcadero RAD Studio.

Au cours de mon activité, j'ai réussi à approfondir le sujet et je peux maintenant affirmer avec confiance que tous les outils fournis par MS Office et OLE couvrent tous mes besoins en matière de rapports. Eh bien, si c'est le cas, alors probablement pour d'autres développeurs, ce serait un outil autonome, simple et pratique. Par conséquent, il a été décidé d'écrire une DLL et d'y inclure une liste de toutes les fonctions MS Excel couramment utilisées que vous rencontrez lors de la création de documents Excel. C'est très pratique, car pour créer un rapport, vous n'avez pas besoin d'étudier un tas de manuels ou OLE. Il suffit de charger la DLL et ses fonctions. Eh bien, beaucoup sont capables de travailler avec des DLL.

Voici le site du projet lui-même .

Sur le site du projet, le mécanisme de travail avec les DLL est décrit de manière suffisamment détaillée; il existe un exemple et une description de toutes les fonctions.

La DLL est fournie sans fichier d'en-tête et sans bibliothèque LIB statique. Ainsi, la DLL doit être connectée dynamiquement à l'aide de la fonction LoadLibrary. L'archive ZIP avec la bibliothèque comprend les fichiers suivants:

  • " light_report.dll " - la bibliothèque DLL elle-même;
  • " DLLTest.cpp " - un exemple d'utilisation de la bibliothèque;
  • " LPDLL.h " - le fichier d'en-tête pour un exemple d'utilisation de la bibliothèque (ce n'est pas le fichier d'en-tête de la DLL);
  • " Report.xlsx " - document MS EXCEL pour un exemple d'utilisation de la bibliothèque.

Le fichier d'en-tête de l'exemple d'utilisation de la bibliothèque LPDLL.h contient les déclarations suivantes:

  • énumérations utilisées comme arguments pour les fonctions DLL;
  • types de fonctions DLL;
  • Instances de fonction DLL
  • Descripteur de téléchargement de DLL (" HINSTANCE DLL_Handle; ");
  • la fonction LoadLightReportDLL , qui charge dynamiquement la DLL et toutes ses fonctions;
  • Fonction FreeLightReportDLL qui décharge la DLL.

Le fichier LPDLL.h contient déjà tout ce dont vous avez besoin pour travailler avec la DLL et ses fonctions. Mais vous pouvez aussi l'éditer ou n'en prendre que le plus nécessaire à votre projet.

Imaginez que vous venez de connecter le fichier d'en-tête «LPDLL.h» à votre projet.

Ensuite, dans le projet lui-même, il vous suffit de:

1) Déclarez un descripteur variable à votre rapport:

Variant report; 

2) Chargez dynamiquement la DLL et toutes ses fonctions:

 if(!LoadLightReportDLL("C:\\LightReport\\light_report.dll"))return; 

3) Ensuite, dans la construction try-catch, ouvrez le modèle de rapport préparé (fichier MS Excel):

 report=OpenReport("C:\\LightReport\\Report.xlsx",0); 

4) Ajoutez des données au rapport:

 WriteCell(report, "Sheet1", 9, 1, "Hello world!"); 

...
5) Enregistrez le fichier ou imprimez:

 Save(report); SaveAs(report, "C:\\LightReport\\Report copy.xlsx"); ExportToPDF(report, "C:\\LightReport\\Report.pdf", false); PrintOut(report); 

6) Fermez le fichier:

 CloseReport(report); 

7) Déchargez la bibliothèque DLL:

 FreeLightReportDLL(); 

Et c'est tout! Rien de plus! Il n'y a qu'une seule mise en garde, mais même cela, il n'apparaît que lors du débogage. Dans une application qui fonctionne, tout fonctionnera bien. Je veux dire une situation dans laquelle il y a une sorte d'erreur lors de l'utilisation d'un rapport. Le fait est que le mécanisme OLE pour travailler avec des documents implique uniquement de lever des exceptions lorsque des erreurs se produisent. C'est pourquoi lorsque vous travaillez avec des fonctions DLL, vous devez utiliser la construction try-catch. Dans le bloc catch, vous devez fermer le rapport sans enregistrer:

 catch(...){CloseReport(report);} 
.
Lors du débogage, lorsqu'une erreur se produit, vous pouvez arrêter le programme. Dans ce cas, le processus MS Excel restera en cours d'exécution et il sera possible de le fermer uniquement via le gestionnaire de tâches. Par conséquent, lors du débogage de l'application plusieurs fois, plusieurs instances du processus MS Excel peuvent être lancées, selon la fréquence à laquelle vous suspendez le programme lorsqu'une erreur se produit, sans attendre que le code s'exécute dans catch. Cela doit être surveillé.

Dans la version, si une erreur se produit, le code spécifié dans le bloc catch fonctionnera certainement, le rapport se fermera et le processus MS Excel sera terminé. Aucun processus MS Excel suspendu dans le système ne sera observé. Mais ils essaient toujours d'écrire du code sans erreur, donc j'espère que vous n'avez pas cette situation dans une application en cours d'exécution.

Enfin, vous devez ajouter:

  1. La DLL utilise des types de données indépendants de la plate-forme, tels que non signé court , non signé long et char . C'est compréhensible pourquoi.
  2. L'exemple est écrit dans l'environnement Embarcadero Builder C ++ 10. Par conséquent, tout le code correspond à cet environnement et, peut-être, vous devrez apporter quelques modifications à l'exemple de code pour que tout fonctionne dans votre environnement.
  3. Le goulot d'étranglement de cette DLL est l'utilisation du descripteur de fichier de rapport au format Variant . Il s'agit d'un format assez spécifique et je pense qu'il peut être difficile d'utiliser la bibliothèque en dehors d'Embarcadero RAD Studio. Honnêtement, je n'ai pas vérifié.

Par conséquent, pour l'avenir, il est prévu de regrouper toutes les fonctionnalités dans une classe et de masquer ce format Variant à l'intérieur de la classe afin que seuls les formats C / C ++ généralement acceptés soient fournis à l'utilisateur. Je n'ai jamais essayé d'emballer des classes dans des DLL, j'ai lu que des difficultés surgiraient nécessairement avec cela. Néanmoins, nous comprendrons! En attendant, merci de votre attention, je serai très heureux si cet article et la DLL aident quelqu'un.

Lien vers le projet .

Source: https://habr.com/ru/post/fr456102/


All Articles