Aspose.Words – Générez des rapports dans Dataverse

Vous devez générer des rapports en PDF dans le cadre de votre travail? Alors vous allez adorer Aspose.Words. Voici comment créer vos rapports avec cet outil abordable et facile à utiliser.

Dans cet article, je vous explique comment générer des rapports avec Aspose.Words. Il s’agit d’un outil efficace pour présenter des données complexes d’une foule de façons. Pourquoi j’adore l’utiliser? Premièrement, parce que la maintenance est facile (un document Word par rapport). Ensuite, parce qu’il génère des documents à une vitesse folle. En effet, dans l’architecture proposée, ça ne prend que quelques secondes. J’ai utilisé Aspose.Words pour un projet web, mais ici, je vous explique comment l’utiliser facilement dans Dataverse ou Dynamics 365.

Aspose-Word - Architecture de base
Architecture de base

Malheureusement, on ne peut pas intégrer la bibliothèque Aspose directement. Pourquoi? Parce qu’on ne peut pas fusionner deux bibliothèques (bibliothèque de plug-ins et celles requises pour Aspose, par exemple). Ça fonctionnerait… mais Microsoft ne le prendrait pas en charge. Alors, que faire? Regardez l'image montrant l'architecture de base, ci-dessus. Comme vous voyez, on peut créer une fonction Azure et l’alimenter avec des données qui ressortiront sous forme de rapport.

Aspose.Words : Un exemple simple

Besoin d’exemples concrets? À partir d’un exemple de données, j’ai pensé vous montrer ce que je peux faire dans mon propre environnement. Tout d’abord, je clique sur « Obtenir le PDF » (« Get PDF ») pour enregistrer le document sur le disque.

Mon environnement Dataverse

Dans l’exemple ci-dessous, j’utilise un document Word avec une table. Ainsi, pour chaque compte, les contacts sont présentés comme des titres de livres.AuteurLivre<<foreach [a in entities]>><<[ _primarycontactid_valueODataCommunityDisplayV1FormattedValue]>><<[a.name]>><</foreach>>Donc, ça ressort comme ça :AuteurLivreYvonne McKay (exemple)Fourth Coffee (exemple)Susanna Stubberod (exemple)Litware, Inc. (exemple)Nancy Anderson (exemple)Adventure Works (exemple)Maria Campbell (exemple)Fabrikam, Inc. (exemple)Sidney Higa (exemple)Blue Yonder Airlines (exemple)Scott Konersmann (exemple)City Power & Light (exemple)Robert Lyon (exemple)Contoso Pharmaceuticals (exemple)Paul Cannon (exemple)Alpine Ski House (exemple)Rene Valdes (exemple)A. Datum Corporation (exemple)Jim Glynn (exemple)Coho Winery (exemple)

Aspose.Words : Un exemple complexe

Maintenant, compliquons un peu les choses… Notre logiciel interne TANDEM, conçu pour des courtiers d’assurance, génère les rapports les plus complexes en une vingtaine de minutes. Ainsi, pour générer les rapports, nous utilisons XPertDoc. Or, bien que ce logiciel soit très efficace pour transformer des données, sa licence coûte cher. De fait, comme sa maintenance et son développement sont exigeants, nous cherchions une autre option.Alors, après deux jours de travail et un petit remodelage dans Aspose.Words… Nous y voilà! En conséquence, le nouveau rapport se génère maintenant en 20 secondes tout au plus (comme c'est la première fois avec la fonction Azure). Mais par la suite, ça ne prendra littéralement que deux secondes.Voici le modèle voulu :

Aspose Word - Exemple complexe

Et voici le modèle Word :<<[Insurers[0]]>><<[Insurers[1]]>><<[Insurers[2]]>>VolumeTauxPrimeTauxPrimePourcentageTauxPrimePourcentage<<foreach [ k in ListQuoteBenefits.Keys]>><<[k]>><<[ name.ListQuoteBenefits [k]?.QuoteDetails[0]?. xrm_volume] :"0.##">><<[ name.ListQuoteBenefits [k]?.QuoteDetails[0]?. PricePerUnit] :"0.##">><<[ name.ListQuoteBenefits [k]?.QuoteDetails[0]?. BaseAmount] :"0.##">><<[ name.ListQuoteBenefits [k]?.QuoteDetails[1]?. PricePerUnit] :"0.##">><<[ name.ListQuoteBenefits [k]?.QuoteDetails[1]?. BaseAmount] :"0.##">><<if [ name.ListQuoteBenefits [k]?.QuoteDetails[0]?. BaseAmount != null && name.ListQuoteBenefits [k]?.QuoteDetails[0]?. BaseAmount  != 0]>><<[name.ListQuoteBenefits [k]?.QuoteDetails[1]?. BaseAmount/ name.ListQuoteBenefits [k]?.QuoteDetails[0]?. BaseAmount*100-100] :"0.##">> %<</if>><<[ name.ListQuoteBenefits [k]?.QuoteDetails[2]?. PricePerUnit] :"0.##">><<[ name.ListQuoteBenefits [k]?.QuoteDetails[2]?. BaseAmount] :"0.##">><<if [ name.ListQuoteBenefits [k]?.QuoteDetails[0]?. BaseAmount != null && name.ListQuoteBenefits [k]?.QuoteDetails[0]?. BaseAmount  != 0]>><<[ name.ListQuoteBenefits [k]?.QuoteDetails[2]?. BaseAmount/ name.ListQuoteBenefits [k]?.QuoteDetails[0]?. BaseAmount*100-100] :"0.##">> %<</if>><</foreach>>Enfin, voici le résultat :

Aspose.Word - résultat d'exemple complexe

Évidemment, avec une version sous licence, on ne voit pas « Aspose » en arrière-plan!

Comment construire un projet Azure?

Maintenant, voyons 5 étapes qui vous permettront de construire le projet.

1. Créez une fonction Azure

D’abord, créez une fonction Azure en suivant ces instructions : https://docs.microsoft.com/en-us/azure/azure-functions/functions-create-your-first-function-visual-studio

2. Déployez la fonction

Ensuite, déployez-la dans Azure et assurez-vous qu’elle fonctionne.

a) Pour ce faire, cliquez à droite sur le projet de la fonction Azure et publiez (Publish).

publier à Azure

Comment publier?

b) Dans les options, assurez-vous de rester dans le forfait Consommation. Comme vous pouvez voir, le forfait Premium ne comprend pas de redémarrage à froid. Pour un projet comme celui-là, un redémarrage à froid prend environ 18 secondes.

3. Ajoutez Aspose.Words

Puis, ajoutez le package Aspose.Words à partir du NuGet.

a) Pour ce faire, cliquez à droite et sélectionnez Gérer les packages NuGet.

manage-nuget-packages

Allez au gestionnaire de package NuGet.

b) Quand c’est fait, trouvez Aspose.Words pour l’ajouter.

Ajoutez Aspose. Words

Bien entendu, vous ne verrez pas l'option « Désinstaller » Aspose.Words comme sur cette image. À la place, vous verrez plutôt « Installer » (je l'avais déjà installé).

4. Mettez les modèles Word dans une classe stockée

Pour ma part, j’ai décidé de mettre les modèles Word dans une classe stockée comme une chaîne Base64. Vous pouvez lire tous les modèles en passant par un processus itératif comme celui-ci et les encoder ainsi :

5. Utilisez une requête POST

Il faut dire que je n’ai pas utilisé une requête GET parce que l’URL ne semble pas pouvoir dépasser 2048 caractères. Donc, j’ai opté pour une requête POST. Ainsi, il n’y a aucune limite parce qu’on peut utiliser le corps du document comme modèle. Toutefois, il faut configurer la fonction Azure pour qu’elle accepte les CORS (demandes cross-origin).

Dans le portail Azure, vous pouvez donc effectuer les deux actions suivantes :

a) D'abord, ajoutez l’URL Dataverse dans l’origine CORS. Pour obtenir l’URL, rendez-vous au centre d’administration de la Power Platform (microsoft.com).

b) Puis, ouvrez la fonction dans le portail Azure et placez l’URL Dataverse parmi les origines autorisées.

Et voilà!

Comment construire un projet Dataverse?

Maintenant, passons à la solution Dataverse, qui partage le projet du modèle. Ici, deux options s'offrent à vous :

1. La méthode AJAX

On peut faire une requête POST par la méthode AJAX. Toutefois, les résultats vont s’afficher dans la zone de requête plutôt que sur une page web. Cela dit, les résultats de la requête AJAX peuvent être transférés vers la fonction Jscript Dataverse hors zone et téléchargés sur le disque. Ainsi, le rapport est sauvegardé.Remplacez createpdfusingasposeword par le nom de votre fonction Azure. Ensuite, à l’endroit à partir duquel votre fonction est appelée (formulaire ou liste d’enregistrements), mettez jQuery. Ainsi, le $.ajax sera disponible.

2. Ou l'utilisation d'un plug-in

On peut aussi utiliser un plug-in, soit une bibliothèque Dataverse. En effet, une fonction Jscript peut déclencher une action pour obtenir les données JSON et les envoyer vers la fonction Azure. L’action peut être déclenchée par une entité, une liste des entités ou même sans aucun contexte. Sa commande peut être d’obtenir toutes les entités d’un certain type (ex. liste de comptes et contacts principaux). De fait, on ne peut pas mettre NewtonSoft. Alors, on devra donc utiliser le JsonSerializer. Pour nos besoins, c’est suffisant.Aussi, il faut redéfinir tous nos modèles. Pourquoi? Parce que dans la fonction Azure, on ne peut pas utiliser les types XRM SDK. Cela dit, ce n’est pas très compliqué.Voici un exemple simple :Maintenant, la fonction Azure va prendre le modèle JSON. Puis, avec les données et le document Word correspondant, elle va créer une sortie PDF et la retourner vers le Dataverse.Pour l’utilisateur, ça a l’air assez simple :

Bref...

Voilà maintenant trois mois que je travaille chaque jour avec Aspose.Words. Mon verdict? Pour générer des rapports à partir de modèles de données déjà utilisés dans des sites web, c’est formidable! En effet, on peut facilement l’utiliser pour générer des rapports dans le Dataverse et utiliser une fonction Azure. Autres avantages? La licence ne coûte pas trop cher et la sortie se génère rapidement.Mais surtout, c'est un outil simple à utiliser, qui peut vous sauver un temps considérable. Alors bonne découverte!Cet article est une initiative de notre expert Jean-François Fortin.

Du même auteur

Comment connecter Dynamics 365 à Azure pour enregistrer les erreurs? Inversion de contrôle dans Dynamics 365

Vous aimeriez en savoir plus?

Notre équipe peut vous accompagner avec des conseils personnalisés, des formations ou de nouvelles solutions adaptées à vos besoins. Optimisez l’utilisation de vos technologies et vos processus quotidiens: contactez l’un(e) de nos expert(e)s.