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 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