Web サービスを呼び出す UDF を作成する
この例では、ユーザー定義関数 (UDF) から外部 Web サービスを呼び出す方法を紹介します。 この例で使用する Web サービスは次のとおりです。
http://webservices.imacination.com/distance/Distance.jws?wsdl
この例を作成する場合は、Microsoft Visual Studio 2005 または同様の Microsoft .NET Framework 2.0 互換の開発ツールを使用する必要があります。
注:
コードをテストする前に、呼び出す Web サービスが利用可能になっていることを確認してください。 Web サービスのサーバーが停止していることや、Web サービスが中止されていることがあります。 Web サービスが利用できない場合は、コードからの Web サービスの呼び出しが失敗します。 > Web サービスが利用可能かどうかを確認するには、そのサイトにアクセスします。 この例では、URL は、 >http://webservices.imacination.com/distance/Distance.jws?wsdl
> Web サービスが使用可能な場合は、Web サービス記述言語 (WSDL) を表示できます。 利用できない場合は、通常の「Web ページが見つかりません」エラーが表示されます。
例
この例の WSDL を調べると、使用している Web サービスの詳細について知ることができます。
提供している 1 つのサービスは、地理的な座標を 10 進数形式で返すサービスです。 このサンプルでは、座標を ToDegreeNotation
度/分/秒に変換する方法を示す関数が追加されています。これは、座標の表示に適しています。
[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
Internet Explorer の LAN 設定でプロキシ サーバーを使用するように構成されている場合は、プロキシ サーバーを設定するための呼び出しをコードの中で明示的に実行しなければなりません。 そうしない場合、Web サービスの呼び出しは失敗します。 プロキシ サーバーの設定は、次のようにコンストラクターの中で実行できます。
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
セルから UDF をテストして呼び出す方法の詳細については、「 チュートリアル: Managed-Code UDF の開発」を参照してください。
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
関連項目
タスク
ステップ 1: プロジェクトを作成し、UDF への参照を追加する