Partager via


Procédure : créer une UDF qui appelle un service Web

Cet exemple montre comment appeler un service Web externe à partir d'une fonction définie par l'utilisateur (UDF, User-Defined Function). Le service Web utilisé dans cet exemple est :

http://webservices.imacination.com/distance/Distance.jws?wsdl

Vous devez utiliser Microsoft Visual Studio 2005 ou un outil de développement similaire compatible avec Microsoft .NET Framework 2.0 pour créer cet exemple.

Notes

Avant de tester le code, assurez-vous que le service Web que vous appelez est disponible. Il est possible que le serveur du service Web soit en panne ou que le service Web soit interrompu. Si le service Web n'est pas disponible, les appels au service Web effectués à partir de votre code échoueront.

Vous pouvez vérifier si un service Web est disponible en visitant son site. Dans cet exemple, l'URL est :

http://webservices.imacination.com/distance/Distance.jws?wsdl

Si le service Web est disponible, vous pouvez voir s'afficher une page au format WSDL (Web Services Description Language). S'il n'est pas disponible, vous obtenez le message d'erreur classique indiquant que la page n'a pas été trouvée.

Exemple

Vous pouvez en savoir plus sur le service Web utilisé dans cet exemple en examinant son contenu WSDL.

Il fournit un service qui consiste à renvoyer des coordonnées géographiques au format décimal. Dans cet exemple, la fonction ToDegreeNotation a été ajoutée pour vous montrer comment convertir des coordonnées en degrés/minutes/secondes, ce qui est un format d'affichage plus approprié.

[UdfMethod]
public string ToDegreeNotation(double angle)
{
    int deg = (int)angle;
    double minutesAndSeconds = Math.Abs(angle - deg) * 60;
    int minutes = (int)minutesAndSeconds;
    int seconds = (int)(Math.Abs(minutesAndSeconds - minutes) * 60);

    return deg.ToString() + "°" + minutes.ToString() + "\'" + 
        seconds.ToString() + "\"";
}

Si vos paramètres de réseau local d'Internet Explorer sont configurés pour l'utilisation d'un serveur proxy, votre code doit explicitement effectuer un appel pour définir le serveur proxy. Sinon, vos appels au service Web échoueront. Vous pouvez définir le serveur proxy dans le constructeur en procédant comme suit :

namespace ZipCodeUdfSample
{
    [UdfClass]
    public class ZipCodeUdfs
    {
        DistanceService distanceService = null;
        public ZipCodeUdfs()
        {
            this.distanceService = new DistanceService();
            this.distanceService.Proxy = 
                new WebProxy("http://myproxy:80", true);
        }

Pour plus d'informations sur la procédure à suivre pour tester et appeler des fonctions définies par l'utilisateur à partir de cellules, voir Procédure pas à pas : développement d'une UDF avec code managé.

using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using Microsoft.Office.Excel.Server.Udf;
using ZipCodes.com.imacination.webservices;

namespace ZipCodeUdfSample
{
    [UdfClass]
    public class ZipCodeUdfs
    {
        DistanceService distanceService = null;

        public ZipCodeUdfs()
        {
            this.distanceService = new DistanceService();
            //this.distanceService.Proxy = new WebProxy("http://myproxy:80", true);
        }

        [UdfMethod]
        public double GetDistanceBetweenTwoZipCodes(int zip1, int zip2)
        {
            string zip1String = Convert.ToString(zip1);
            string zip2String = Convert.ToString(zip2);

            return (distanceService.getDistance(zip1String, zip2String));
        }

        [UdfMethod]
        public string GetCityFromZip(int zip)
        {
            string zipString = Convert.ToString(zip);

            return (distanceService.getCity(zipString));
        }

        [UdfMethod]
        public string GetStateFromZip(int zip)
        {
            string zipString = Convert.ToString(zip);

            return (distanceService.getState(zipString));
        }

        [UdfMethod]
        public string GetLocationFromZip(int zip)
        {
            string zipString = Convert.ToString(zip);

            return (distanceService.getLocation(zipString));
        }

        [UdfMethod]
        public double GetLatitudeFromZip(int zip)
        {
            string zipString = Convert.ToString(zip);

            return (distanceService.getLatitude(zipString));
        }

        [UdfMethod]
        public double GetLongitudeFromZip(int zip)
        {
            string zipString = Convert.ToString(zip);

            return (distanceService.getLongitude(zipString));
        }

        [UdfMethod]
        public string ToDegreeNotation(double angle)
        {
            int deg = (int)angle;
            double minutesAndSeconds = Math.Abs(angle - deg) * 60;
            int minutes = (int)minutesAndSeconds;
            int seconds = (int)(Math.Abs(minutesAndSeconds - minutes) * 60);

            return deg.ToString() + "°" + minutes.ToString() + "\'" + seconds.ToString() + "\"";
        }
    }
}

Voir aussi

Autres ressources

Étape 2 : ajout d'une référence Web
Étape 3: accès au service Web
Étape 1 : création d'un projet et ajout d'une référence du fichier UDF
Étape 2 : création d'une UDF de code managé
Étape 3 : déploiement et activation des fonctions définies par l'utilisateur (UDF)
Étape 4: test et appel des fonctions définies par l'utilisateur dans des cellules
Procédure pas à pas : développement d'une application personnalisée à l'aide des services Web Excel
Accès à l'API SOAP