Partager via


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

Dernière modification : jeudi 21 janvier 2010

S’applique à : SharePoint Server 2010

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() + "\"";
}
<UdfMethod> _
Public Function ToDegreeNotation(ByVal angle As Double) As String
    Dim deg As Integer = CInt(Fix(angle))
    Dim minutesAndSeconds As Double = Math.Abs(angle - deg) * 60
    Dim minutes As Integer = CInt(Fix(minutesAndSeconds))
    Dim seconds As Integer = CInt(Fix(Math.Abs(minutesAndSeconds - minutes) * 60))

    Return deg.ToString() & "°" & minutes.ToString() & "'" & seconds.ToString() & """"
End Function

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);
        }
Namespace ZipCodeUdfSample
    <UdfClass> _
    Public Class ZipCodeUdfs
        Private distanceService As DistanceService = Nothing

        Public Sub New()
            Me.distanceService = New DistanceService()
            'this.distanceService.Proxy = new WebProxy("http://myproxy:80", true);
        End Sub

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() + "\"";
        }
    }
}
Imports System
Imports System.Collections.Generic
Imports System.Text
Imports System.Net
Imports Microsoft.Office.Excel.Server.Udf
Imports ZipCodes.com.imacination.webservices

Namespace ZipCodeUdfSample
    <UdfClass> _
    Public Class ZipCodeUdfs
        Private distanceService As DistanceService = Nothing

        Public Sub New()
            Me.distanceService = New DistanceService()
            'this.distanceService.Proxy = new WebProxy("http://myproxy:80", true);
        End Sub

        <UdfMethod> _
        Public Function GetDistanceBetweenTwoZipCodes(ByVal zip1 As Integer, ByVal zip2 As Integer) As Double
            Dim zip1String As String = Convert.ToString(zip1)
            Dim zip2String As String = Convert.ToString(zip2)

            Return (distanceService.getDistance(zip1String, zip2String))
        End Function

        <UdfMethod> _
        Public Function GetCityFromZip(ByVal zip As Integer) As String
            Dim zipString As String = Convert.ToString(zip)

            Return (distanceService.getCity(zipString))
        End Function

        <UdfMethod> _
        Public Function GetStateFromZip(ByVal zip As Integer) As String
            Dim zipString As String = Convert.ToString(zip)

            Return (distanceService.getState(zipString))
        End Function

        <UdfMethod> _
        Public Function GetLocationFromZip(ByVal zip As Integer) As String
            Dim zipString As String = Convert.ToString(zip)

            Return (distanceService.getLocation(zipString))
        End Function

        <UdfMethod> _
        Public Function GetLatitudeFromZip(ByVal zip As Integer) As Double
            Dim zipString As String = Convert.ToString(zip)

            Return (distanceService.getLatitude(zipString))
        End Function

        <UdfMethod> _
        Public Function GetLongitudeFromZip(ByVal zip As Integer) As Double
            Dim zipString As String = Convert.ToString(zip)

            Return (distanceService.getLongitude(zipString))
        End Function

        <UdfMethod> _
        Public Function ToDegreeNotation(ByVal angle As Double) As String
            Dim deg As Integer = CInt(Fix(angle))
            Dim minutesAndSeconds As Double = Math.Abs(angle - deg) * 60
            Dim minutes As Integer = CInt(Fix(minutesAndSeconds))
            Dim seconds As Integer = CInt(Fix(Math.Abs(minutesAndSeconds - minutes) * 60))

            Return deg.ToString() & "°" & minutes.ToString() & "'" & seconds.ToString() & """"
        End Function
    End Class
End Namespace

Voir aussi

Tâches

É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

Concepts

Accès à l'API SOAP