Excel Services, Configuration et Développement

Stéphane Eyskens

Ce tutoriel explique ce qu'est Excel Services, ses principaux concepts et illustre via un développement les fonctions personnelles.

- Titre : Excel Services, Configuration et Développement

- Auteur : Stéphane Eyskens

- Parution : 1 mars 2008

- Licence : Copyright ®  Developpez. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

Sommaire

- I. Introduction

- I-A. Matières abordées dans le tutoriel

- I-B. Excel Services en deux mots

- I-C. Par où commencer?

- II. Configuration

- II-A. Le service

- II-B. Le SSP

- III. Exemples pratiques

- III-A. Création d'un fichier Excel simple avec un paramètre

- III-A-1. Publication vers Excel Services

- III-B. Création d'un fichier Excel avec connexion embarquée

- III-B-1. Création et Publication du classeur

- III-C. Création d'un fichier Excel avec connexion provenant d'une bibliothèque

- III-C-1. Avantage des connexions partagées

- III-C-2. Création et Publication du classeur

- III-D. Remarque sur les connexions externes

- III-E. Visualisation des classeurs

- III-D-1. Utilisation du webpart Excel Web Access

- III-D-2. En forcant la bibliothèque à ouvrir les classeurs en mode Excel Services

- IV. Les fonctions personnelles

- IV-A. Présentation du projet

- IV-B. Création du projet

- IV-C. Le code

- IV-D. Le déploiement

- IV-E. L'utilisation

- V. Le service web

- VI. Limitations

- VII. Conclusion

I - Introduction

I-A - Matières abordées dans le tutoriel

Dans ce tutoriel, nous allons aborder les points suivants:

- Qu'est-ce que Excel Services et à quoi ça sert?

- Comment créer un fichier Excel et le publier vers Excel Services?

- Comment créer un fichier Excel contenant une connexion embarquée vers une base de données SQL Server et le publier vers Excel Services?

- Comment créer un fichier Excel contenant une connexion partagée vers une base de données SQL Server et le publier vers Excel Services?

- Comment exploiter les classeurs Excel via le service web proposé par Sharepoint

- Comment développer ses propres fonctions et les exploiter au travers de Excel Services ?

Excel Services est vaste, nous tenterons d'aborder les grands points génériques au travers de plusieurs exemples.

I-B - Excel Services en deux mots

Excel Services est un service disponible dans MOSS 2007 Enterprise et travaille en combinaison avec certaines versions d'Excel 2007 pour la publication. Un des aspects de cette fonctionnalité est de permettre la publication de fichiers Excel vers un serveur Sharepoint et de les mettre à disposition des clients sans pour autant que ceux-ci disposent d'Excel sur leur machine. En gros, c'est le service qui se charge de proposer la puissance d'Excel de manière centralisée sur le serveur. Les clients doivent uniquement disposer d'un navigateur.

On va pouvoir partager au sein de Sharepoint des classeurs Excel pour effectuer du reporting, du calcul, des tables pivots etc. de manière contrôlée et centralisée.

D'autre part, on va pouvoir développer certaines fonctionnalités en se basant sur la puissance d'Excel.

I-C - Par où commencer?

Un bon moyen d'aborder Excel Services est d'utiliser le modèle de site "Report Center" délivré en standard avec MOSS. Celui-ci contient quelques exemples de Business Intelligence car il propose un Dashboard(1) avec des KPI(2) et un classeur Excel publié vers Excel Services. Notez que lorsque vous créez un centre de rapports, vous devez immédiatement "truster" la librairie de rapports pour ne pas avoir de problème. Reportez-vous aux sections suivantes pour savoir comment faire.

Pour éviter tout problème lors de la création d'un Report Center, veillez à activer l'Infrastructure de Publication Office SharePoint Server au sein de votre collection. En effet, le Report Center tente d'activer cette fonctionnalité dès sa création. Etant donné qu'il y a une dépendance au niveau de cette fonctionnalité, vous devez préalablement l'activer au niveau de votre collection.

Vous bénéficierez ensuite d'exemples tels qu'illustrés ci-dessous. Je vous engage à explorer ce modèle afin de comprendre l'utilité d'Excel Services

II - Configuration

Tout d'abord, vous devez disposer d'un MOSS enterprise et au moins d'une version d'Excel 2007 pour pouvoir publier les documents.

II-A - Le service

Pour pouvoir bénéficier de l'infrastructure d'Excel Services, la première chose à vérifier est que le service soit bien démarré. Pour cela, allez dans la centrale d'administration

Démarrez le service s'il est arrêté. Si vous ne voyez pas ce service, vérifiez que vous avez bien activé la license Enterprise

II-B - Le SSP

Allez dans votre Shared Service Provider pour accéder aux autres interfaces de configuration d'Excel Services. Lorsque vous y êtes, vous devriez voir une section dédicacée à Excel Services.

Voici maintenant une explication de chaque catégorie

Excel Services Settings

Permet de paramétrer des aspects génériques tels que la gestion de la mémoire, la mise en cache, la manière d'accéder aux fichiers, paramètres d'authentification

Trusted file locations

Permet de définir des espaces que l'on considère comme sûrs, soit trusted. Ces espaces peuvent être des URL vers des bibliothèques ou des sites. On peut également définir certaines options telles que permettre l'utilisation de fonctions personnelles, définir la méthode d'accès aux données externes.

Trusted data connexion libraries

Permet de spécifier des URLs pointant vers des bibliothèques de connexions que l'on considère comme sûres soit trusted

Trusted data providers

Permet de spécifier des fournisseurs d'accès aux données. Les principaux fournisseurs sont déjà définis dans MOSS

User-defined function assemblies

Permet de référencer des DLL contenant des fonctions personnelles pouvant être utilisées dans nos documents publiés vers Excel Services

Nous reviendrons en détail sur chacune de ces catégories dans la section suivante.

III - Exemples pratiques

III-A - Création d'un fichier Excel simple avec un paramètre

Dans cet exemple, nous allons créer une mini (vraiment mini) calculatrice, le but étant de voir comment publier un document Excel vers Excel Services et comment spécifier des paramètres que l'utilisateur final pourra exploiter.

Veuillez disposer d'une bibliothèque de documents avant de passer à la suite.

Ouvrez Excel 2007 et créez un nouveau document que vous nommez Calculatrice. Utilisez ensuite la première ligne.
La cellule A1 contient simplement le mot Addition, les cellules B1 et C1 seront des paramètres fournis par l'utilisateur et la cellule D1 sera le résultat.

Positionnez le curseur sur B1 et ensuite cliquez sur Define Name (entouré en rouge dans l'image ci-dessus). Nommez la cellule Addition1 comme illustré ci-dessous

Positionnez le curseur sur C1 et nommez-le Addition2. Positionnez ensuite le curseur sur D1 et tapez la formule suivante =Addition1+Addition2. Ni plus ni moins que la somme de nos deux paramètres.

III-A-1 - Publication vers Excel Services

Maintenant que l'on a créé le document, il reste à le publier. Cliquez sur le bouton Office et procédez comme illustré ci-dessous

Dans la zone filename, saisissez l'URL de la bibliothèque de documents vers laquelle vous souhaitez publier le document et donnez un nom à celui-ci. Cliquez ensuite sur Excel Services Options

Allez dans l'onglet Parameters, ensuite Add et cochez les deux paramètres comme ci-dessous

Cliquez ensuite sur Save. Le document doit s'ouvrir en mode Excel Services et là, normalement, vous aurez une belle erreur

Ceci est dû au fait que nous n'avons pas référencé cette bibliothèque comme trusted. Nous allons tout de suite le faire. Allez dans Trusted file locations comme expliqué en section II-B. Cliquez ensuite sur Add Trusted File Location et procédez comme illustré

Saisissez bien sûr l'URL de votre bibliothèque. L'option Children Trusted spécifie si on fait aussi confiance aux éléments enfants, on peut également référencer des sites comme trusted location. Restons-en là pour l'instant, nous parlerons des connexions dans un instant.

Maintenant que vous avez "trusté" la bibliothèque, ouvrez celle-ci et cliquez sur le document Excel.

Cela devrait à présent fonctionner et vous devez obtenir ceci

Soit une partie centrale avec les données et la partie de droite permettant à l'utilisateur d'entrer les différents paramètres.

Note: lorsque vous publiez un document vers Excel Services, vous pouvez décider de ne publier qu'une feuille ou un élément spécifique du classeur. Ceci permet d'avoir une partie "publique" et une partie "privée" par exemple.

III-B - Création d'un fichier Excel avec connexion embarquée

Dans cet exemple nous allons créer un fichier Excel avec une connexion vers AdventureWorks(3). Il faut donc disposer de SQL Server et de AdventureWorks.

Que ce soit pour une connexion embarquée ou une connexion partagée, il faut autoriser l'utilisation des connexions au niveau de la Trusted Location correspondante. Je vais donc montrer comment autoriser les connexions à la fois embarquées et partagées

Allez dans la section Excel Services de votre SSP. Vous avez déjà dû définir la Trusted Location dans l'exemple précédent. Cliquez dessus pour l'éditer. Lorsque vous êtes en mode édition, localisez la section External Data comme illustrée ci-dessous

Cochez l'option Trusted data connection libraries and embedded. Ceci autorise l'ouverture de classeurs ayant des connexions embarquées et/ou partagées (issues d'une bibliothèque de connexions)

Les autres paramètres permettent de définir un intervalle de raffraîchissement automatique, de spécifier si on souhaite avertir l'utilisation qu'un raffraîchissement de données va se faire, de définir le temps de mise en cache etc...

III-B-1 - Création et Publication du classeur

Ouvrez Excel 2007 et créez un nouveau document, on l'appellera ConnexionEmbarquee. Cliquez sur l'onglet Data puis sur From Other Sources et enfin From SQL Server

Dans la zone Server Name, saisissez ".". Le point représente le serveur courant. Etant donné que nos exemples sont tous créés sur un stand-alone, le . convient très bien. Adaptez bien sûr en fonction de votre environnement.

Ensuite, cliquez sur Next et choisissez la base AdventureWorks et ensuite la vue vEmployee

Terminez enfin en donnant un nom à votre fichier et un friendly name

Choisissez Pivot Table Report (tableau croisé dynamique) et cliquez sur Ok. Ensuite choisissez n'importe quel colonne dans la liste des champs à droite.

A ce stade, vous devez obtenir un listing des données.

Publiez ensuite vers Excel Services comme pour l'exemple 1 de ce tutoriel sans aller dans les options car ce n'est pas nécessaire. Le classeur devrait ensuite s'ouvrir en mode Excel Services.

Pour être certain que votre connexion fonctionne correctement, effectuez un raffraîchissement

Note: si cela ne fonctionne pas, ceci peut-être dû à :

- Vous avez oublié d'autoriser la trusted location à exécuter des connexions embarquées

- Vous ne vous êtes pas authentifié au niveau Sharepoint, vous êtes donc en mode anonyme

- Vous n'avez pas trusté la bibliothèque dans laquelle vous avez publié le classeur

III-C - Création d'un fichier Excel avec connexion provenant d'une bibliothèque

III-C-1 - Avantage des connexions partagées

L'avantage d'utiliser des connexions partagées se résume en ces quelques points

- Réduction de la maintenance. En effet, si une connexion partagée par 5 classeurs doit être modifiée, on effectuera une seule modification plutôt que de modifier les 5 classeurs les uns après les autres

- Possibilité d'utiliser les droits (ACL) sur les connexions puisqu'elles sont des éléments d'une bibliothèque

- Centralisation des connexions. Tout est sous contrôle et même versionné au besoin.

Comme pour l'exemple précédent, il faut avoir autorisé les connexions externes pour la trusted location correspondante. Il faut par contre créer une bibliothèque de connexions et créer la connexion partagée que l'on utilisera dans notre classeur. Pour créer une bibliothèque de connexions, vous devez afficher tout le contenu de votre site et ensuite, cliquez sur Créer puis sur Bibliothèque de connexion (connection library). En somme, ce type de bibliothèque se crée comme n'importe quelle autre bibliothèque.

Lorsque la bibliothèque est créée, vous devez la référencer comme sûre, soit Trusted. Allez dans les paramètres Excel Services de votre SSP, cliquez sur Trusted data connection libraries et ensuite sur Add Trusted Data Connection Library. Saisissez ensuite l'URL de votre bibliothèque de connexions comme illustré ci-dessous.

Il reste maintenant à créer le classeur et à le publier

III-C-2 - Création et Publication du classeur

Pour simplifier, nous allons réutiliser la connexion créée dans l'exemple 2. Excel 2007 stocke par défaut les connexions (ODC => Office Data Connection) dans le répertoire My Data Sources

Lorsque vous avez localisé votre fichier de connexion, retournez dans la bibliothèque de connexions que vous avez créée. Ajoutez-y un nouveau fichier .ODC

Cliquez sur Browse (Parcourir) et allez rechercher le fichier .odc stocké sur votre disque dur. Cliquez sur Ok pour valider l'upload. Vous devez ensuite approuver le fichier

Cette connexion est maintenant utilisable dans les classeurs Excel.

Créez un nouveau fichier Excel 2007 que vous nommerez ConnexionPartagee, cliquez sur l'onglet Data et ensuite sur Connections

Ensuite cliquez sur Add puis sur Browse for more et saisissez l'URL de votre bibliothèque dans la zone File name

Cliquez sur Open. La connexion est à présent référencée par votre classeur. Toujours dans l'onglet Data, cliquez sur Existing Connections et sélectionnez la connexion fraîchement ajoutée. Ensuite, créez une Pivot Table Report (tableau croisé dynamique) comme dans l'exemple 2.

Publiez le classeur de la même manière que pour l'exemple 2. Le classeur s'ouvre en mode Excel Services.

III-D - Remarque sur les connexions externes

En fonction de votre configuration, les connexions externes se feront sous l'identité de l'utilisateur ayant ouvert le classeur ou non. Si vous travaillez sur plusieurs serveurs (cas de figure fréquent), vous devrez éventuellement utiliser le protocole Kerberos comme mode d'authentification pour vos applications et/ou implémenter le single sign on.

Tous les exemples démontrés dans ce tutoriel sont réalisés sur un stand-alone, c'est à dire une seule machine avec tous les composants installés dessus (SQL, Sharepoint etc...). Vous ne retrouverez probablement jamais ce type de configuration dans le monde réel.

III-E - Visualisation des classeurs

III-D-1 - Utilisation du webpart Excel Web Access

Si vous souhaitez afficher un classeur Excel au sein d'une page, vous pouvez utiliser le webpart prévu pour cela. Il fait partie des webparts appartenant au module Business Intelligence de MOSS. Il faut donc que cette fonctionnalité soit activée.

En éditant une page, et en cliquant sur Add WebPart dans une zone, vous devriez pouvoir localiser le webpart Excel Web Access

Voici par exemple comment intégrer notre classeur Calculatrice.xlsx dans ce webpart. Choissisez le bon webpart dans la galerie

Vous obtenez le webpart dans votre page, allez dans ses propriétés

Cliquez sur le bouton (entouré en rouge) ou tapez directement l'URL

Quoi qu'il en soit, au final vous devez lier le webpart à votre classeur.

Et voici le résulat au sein de votre page, votre classeur est encapsulé dans celle-ci

III-D-2 - En forcant la bibliothèque à ouvrir les classeurs en mode Excel Services

Par défaut, si vous disposez d'Excel sur votre machine (client ou serveur), un classeur même publié vers Excel Services s'ouvrira dans Excel. Vous pouvez cependant modifier ce comportement en forcant Sharepoint à ouvrir le classeur en tant que page Web.

En allant dans les paramètres de la bibliothèque hébergeant vos classeurs Excel, vous pouvez forcer l'ouverture d'un document en tant que page web.

Ceci est également le cas pour les formulaires Infopath déployés vers Forms Services

IV - Les fonctions personnelles

Les fonctions personnelles, en anglais user-defined function assemblies nous permettent de développer des assemblages à exploiter dans nos classeurs publiés vers Excel Services. Ceci offre une grande flexibilité et nous permet d'ajouter la couche métier qui s'impose dans certains cas.

IV-A - Présentation du projet

Nous allons créer un projet permettant de calculer les indemnités kilométriques pour les employés. Pour faire simple, nous aurons uniquement le montant d'une indemnité kilométrique stocké dans une liste Sharepoint. Le système demandera à l'utilisateur d'entrer le nombre de KM et ira rechercher le taux applicable pour fournir le résultat final, à savoir le montant total devant être remboursé à l'employé.

Créez donc une liste personnelle que vous appelerez ParametresGlobaux avec une colonne Taux de type numérique. Créez ensuite un élément de liste et entrez par exemple la valeur 0.2 qui correspondra à l' en Euro par kilomètre.

Pour bien comprendre ce qui suit, vous devez être familiarisé avec dotnet et visual studio

IV-B - Création du projet

- Créez un projet de type Class Library

- Ajoutez les références vers les DLL Microsoft.Office.Excel.Server.Udf et Microsoft.SharePoint

- Ajoutez les directives using Microsoft.SharePoint; et using Microsoft.Office.Excel.Server.Udf;

- Renommez class1.cs en Calcul.cs

IV-C - Le code

Pour simplifier, je code "en dur" tous les paramètres qui devraient dans un contexte réel être bien sûr issus de fichiers de configuration et je n'ajoute pas de gestion d'erreur.

using System;
using System.Collections.Generic;
using System.Text;
using Microsoft.Office.Excel.Server.Udf;
using Microsoft.SharePoint;

namespace Indemnite
{
[UdfClass]
public class Calcul
{
[UdfMethod]
public Double ValeurIndemniteKm(double d)
{
double Taux = 0;
SPSecurity.RunWithElevatedPrivileges(delegate()
{
using (SPSite Site = new SPSite("http://sey-pc/sites/dev/"))
{
using (SPWeb Web = Site.OpenWeb())
{
SPListItem Itm = Web.Lists["ParametresGlobaux"].GetItemById(1);
Taux = Convert.ToDouble(Itm["Taux"].ToString());
}
}
});

return d * Taux;
}
}
}

Que faut-il retenir de ce code?

- La classe est marquée par l'attribut UdfClass. En effet, nous pourrions avoir plusieurs classes au sein de cet assemblage. Seules les classes marquées de cet attribut sont connues par Excel Services

- La méthode est marquée par l'attribut UdfMethod pour la même raison que précédemment.

- L'accès aux données contenues dans la liste Sharepoint se fait via un délégué impersonated.

L'attribut UdfMethod peut prendre optionnellement deux paramètres, IsVolatile qui détermine si la méthode est volatile ou non et ReturnsPersonalInformation qui spécifie si oui ou non l'identité de l'utilisateur ayant ouvert le classeur doit être cachée ou non.

IV-D - Le déploiement

Le déploiement peut se faire de 3 manières différentes

- Via une solution : certainement la meilleure manière de procéder. Une solution déploiera la DLL sur tous les frontaux automatiquement. Pour savoir comment déployer une UDF via une solution, vous pouvez consulter ce lien

- Via un assemblage signé placé en GAC et référencé dans la configuration Excel Services

- Via un simple référencement vers le chemin physique de la DLL sur le serveur.

Bien que la première option soit la meilleure, je vais plutôt explorer la troisième.

Allez dans la configuration Excel Services comme indiqué en section II-B et cliquez sur User-defined function assemblies. Vous devriez obtenir ceci

Cliquez ensuite sur Add User-defined Function Assembly et saisissez les informations comme illustré sur l'image ci-dessous

Soit le chemin physique de l'emplacement de votre DLL. Spécifiez qu'il s'agit d'un File path et qu'il est activé via la case à cocher.

Si vous choisissez Global Assembly Cache, vous devrez renseigner la signature de l'assemblage dans la zone Assembly.

Enfin, quelle que soit la technique choisie, il faudra que les DLL soient présentes sur tous vos frontaux si vous en avez plus d'un. Si vous optez pour la spécification d'un File path, vous pouvez envisager une ressource partagée sur le réseau comme illustré ci-dessous

Lorsque la DLL sera "enregistrée" dans Sharepoint, les fonctions utilisées dans les classeurs seront automatiquement reconnues. Vous devrez cependant être certain d'avoir coché User-defined functions allowed au niveau de la trusted location dans laquelle se trouve le(s) classeur(s).

IV-E - L'utilisation

Lorsque vous aurez procédé à toutes les étapes décrites précédemment, vous pourrez ouvrir votre fichier publié et vous devriez obtenir ceci

Comme vous pouvez le constater dans cet exemple, le calcul est bien de (100 * 0.2) + 100+50+25 => 295

V - Le service web

Le service web ExcelService.asmx proposé par Sharepoint et disponible via l'url relative /_vti_bin/ de chaque site peut être utilisé par des applications tierces pour manipuler des documents Excel publiés ou non vers Excel Services. Le pré-requis pour pouvoir manipuler des fichiers Excel est d'avoir trusté la bibliothèque contenant les documents comme expliqué en section III-A-1

A titre d'exemple, j'ai développé une petite application console qui attaque notre fichier Calculatrice.xlsx, définit les paramètres Addition1 et Addition2 et obtient le résultat (D1) calculé par le classeur.

En créant un projet console et en référencant le web service comme illustré ci-dessous

Ensuite, avec ce code:

using System;
using System.Collections.Generic;
using System.Text;
using System.Web.Services.Protocols;
using ConsoleAppViaWebService.ExcelSrv;

namespace ConsoleAppViaWebService
{
class Program
{
static void Main(string[] args)
{
ExcelService ServiceExcel = new ExcelService();
Status[] StatutSortie;
string Feuille = "Sheet1";
string NumeroSession = "";
ServiceExcel.Credentials =
System.Net.CredentialCache.DefaultCredentials;

try
{
//On ouvre le classeur
NumeroSession = ServiceExcel.OpenWorkbook(
"http://sey-pc/sites/dev/UDF/Calculatrice.xlsx", "en-US", "en-US", out StatutSortie);
//on définit la valeur du paramètre Addition1
ServiceExcel.SetCellA1(NumeroSession, Feuille, "Addition1", 2);
//on définit la valeur du paramètre Addition2
ServiceExcel.SetCellA1(NumeroSession, Feuille, "Addition2", 2);
//on récupère le résultat
object[] Sum = ServiceExcel.GetRangeA1(
NumeroSession, Feuille, "D1", false, out StatutSortie);
//On affiche le résultat
Console.Write("Somme : {0}",((object[])Sum[0])[0]);

}
catch (SoapException SoapEx)
{
//On traite une exception renvoyée par le service
Console.WriteLine(SoapEx.Message);
}

catch (Exception e)
{
//On traite toute autre exception
Console.WriteLine(e.Message);
}
finally
{
//On ferme le workbook
if(NumeroSession != "") ServiceExcel.CloseWorkbook(NumeroSession);
}
Console.ReadLine();

}
}
}

vous obtenez le résultat suivant, à savoir la somme calculée par le classeur

Cet exemple simpliste montre comment on peut facilement interagir avec des classeurs Excel via ce service. Il dispose d'un bon nombre de méthodes permettant de manipuler en lecture/écriture les différentes cellules d'un document.

VI - Limitations

Actuellement, certaines limitations sont à observer au niveau d'Excel Services. Elles sont catégorisées de la manière suivante:

- Les fonctionnalités qui empêchent un classeur Excel de se charger

- Les fonctionnalités qui ne sont pas affichées

- Les fonctionnalités partiellement supportées

Voici une liste non exhaustive des fonctionnalités pas du tout supportées par Excel Services

- Protection IRM

- Contrôles ActiveX

- Smart Tags embarqués

- Certains types de tables pivots

- Références vers d'autres classeurs

- Certaines fonctionnalités XML

- Protection de feuille

- Validation de données

- Images embarquées/clip art

- Liens DDE

- Certains graphiques

VII - Conclusion

Nous aurons appris grâce à ce tour d'horizon d'Excel Services que celui-ci permet d'exploiter la puissance d'Excel de manière centralisée sur Sharepoint sans imposer aux clients de disposer d'un quelconque logiciel excepté un navigateur. La possibilité d'ajouter des fonctions personnelles offre de grandes perspectives pour gérer notamment les aspects métiers.

(1)DashBoard = Tableau de bord. Ils font office de rapports et sont souvent destinés aux décideurs qui, en un rapide coup d'oeil ont image claire de la situation

(2)KPI = Key Performance Indicator. Les KPI sont utilisés pour obtenir des chiffres clés, souvent le résultat d'aggréation de données

(3)Adventureworks = Base de données de test fournie par Microsoft pour SQL Server.