Web サービスを呼び出す UDF を作成するCreate a UDF that calls a web service

この例では、ユーザー定義関数 (UDF) から外部 Web サービスを呼び出す方法を紹介します。この例で使用する Web サービスは次のとおりです。This example shows how to call an external Web service from a user-defined function (UDF). The Web service used in this example is:

http://webservices.imacination.com/distance/Distance.jws?wsdl この例を作成する場合は、Microsoft Visual Studio 2005 または同様の Microsoft .NET Framework 2.0 互換の開発ツールを使用する必要があります。http://webservices.imacination.com/distance/Distance.jws?wsdl You must use Microsoft Visual Studio 2005 or a similar Microsoft .NET Framework 2.0-compatible development tool to create this sample.

注意

コードをテストする前に、呼び出す Web サービスが利用可能になっていることを確認してください。Before testing the code, make sure that the Web service you are calling is available. Web サービスのサーバーが停止していることや、Web サービスが中止されていることがあります。The Web service server could be down or the Web service discontinued. Web サービスが利用できない場合は、コードからの Web サービスの呼び出しが失敗します。If the Web service is unavailable, the calls you make to the Web service from your code will fail. Web サービスが利用できるかどうかは、そのサイトにアクセスすることで確認できます。> You can check if a Web service is available by visiting its site. この例の URL は次のとおりです。> http://webservices.imacination.com/distance/Distance.jws?wsdl> Web サービスが利用できる場合は、Web サービス記述言語 (WSDL) が表示されます。In this example, the URL is: > http://webservices.imacination.com/distance/Distance.jws?wsdl> If the Web service is available, you will be able to see the Web Services Description Language (WSDL). 利用できない場合は、通常の「Web ページが見つかりません」エラーが表示されます。If it is not available, you will get the usual "webpage not found" error.

Example

この例の WSDL を調べると、使用している Web サービスの詳細について知ることができます。You can learn more about the Web service used in this example by examining its WSDL.

提供している 1 つのサービスは、地理的な座標を 10 進数形式で返すサービスです。このサンプルでは、座標を、表示するのに適した度/分/秒に変換する方法を示す ToDegreeNotation 関数が追加されています。One service it provides is to return geographical coordinates in decimal form. In this sample, the ToDegreeNotation function has been added to show how you can convert coordinates to degrees/minutes/seconds, which is more appropriate for displaying coordinates.


[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() &amp; "°" &amp; minutes.ToString() &amp; "'" &amp; seconds.ToString() &amp; """"
End Function

Internet Explorer の LAN 設定でプロキシ サーバーを使用するように構成されている場合は、プロキシ サーバーを設定するための呼び出しをコードの中で明示的に実行しなければなりません。そうしない場合、Web サービスの呼び出しは失敗します。プロキシ サーバーの設定は、次のようにコンストラクターの中で実行できます。If your Internet Explorer LAN setting is configured to use a proxy server, your code must explicitly make a call to set the proxy server. Otherwise, your Web service calls will fail. You can set the proxy server in the constructor as follows:


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 のテストと呼び出しを行う方法の詳細については、「 チュートリアル: マネージ コード UDF を開発する」を参照してください。For more information about how to test and call UDFs from cells, see Walkthrough: Developing a 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() &amp; "°" &amp; minutes.ToString() &amp; "'" &amp; seconds.ToString() &amp; """"
        End Function
    End Class
End Namespace

関連項目See also

タスクTasks

ステップ 1: プロジェクトを作成し、UDF への参照を追加するStep 1: Creating a Project and Adding a UDF Reference

ステップ 2: マネージ コード UDF を作成するStep 2: Creating a Managed-Code UDF

ステップ 3: UDF を展開して有効にするStep 3: Deploying and Enabling UDFs

手順 4: セルから UDF のテストと呼び出しを行うStep 4: Testing and Calling UDFs from Cells

概念Concepts

SOAP API にアクセスするAccessing the SOAP API

その他のリソースOther resources

手順 2: Web 参照を追加するStep 2: Adding a Web Reference

手順 3: Web サービスへのアクセスStep 3: Accessing the Web Service

チュートリアル: Excel Web Services を使用してカスタム アプリケーションを開発するWalkthrough: Developing a Custom Application Using Excel Web Services