Call web service from excel

最近有个项目需要从Excel中调用Web Service, Google 了一翻果然可以,总结如下:
一、安装开发包。
      要从Excel中通过宏调用Web Service,需要安装Microsoft Office 2003 Web Services Toolkit 2.01,可从这里下载, 下载
二、调用Web Service
      安装好开发包以后,调用Web Service就变得很容易了,操作跟在VS 2003中差不多。切换到宏编辑器(Visual Basic Editor),从Tools菜单中点击“Web Service Reference”打开添加Web service引用的对话框。添加好引用后,开发包就会自动为你封装好一些用Soap调用Web Service的相关类。调用这些类中的相关方法就可以调用Web Service方法了。
三、读写SoapHeader内容
有些Web Service需要提供SoapHeader内容,比如通过SoapHeader提供帐号信息以供服务端验证客户身份。下面就是一个例子
服务端:
自定义SoapHeader类:
     public   class  ServiceHead : System.Web.Services.Protocols.SoapHeader
    
{
        
private string userName;
        
private string password;

        
public string UserName
        
{
            
get return userName; }
            
set { userName = value; }
        }

        
public string Password
        
{
            
get return password; }
            
set { password = value; }
        }

    }

Web Service方法:
[WebMethod(Description  =   " User name and password are reuired! " )]
[SoapHeader(
" accountHead " )]
public  MonthPriceCol GetPriceInfo( string  pSymbol, string  pBeginDate, string  pEndDate)
{
   .
   
if(!CheckUserIdentity(accountHead)) return null;
   .
}

客户端:
定义一个专门的类用于封装对SoapHeader的操作,类名为clsAccountHeader:

Option   Explicit
Implements  IHeaderHandler

Private   Const   Namespace As NameSpace As String = "http://tempuri.org/"
Private myUserName As String
Private myPassword As String

Public Property Let()Property Let UserName(ByVal name As String)
    myUserName 
= name
End Property


Public Property Get()Property Get UserName() As String
    UserName 
= myUserName
End Property


Public Property Let()Property Let Password(ByVal password1 As String)
    myPassword 
= password1
End Property


Public Property Get()Property Get Password() As String
    Password 
= myPassword
End Property



Private Function IHeaderHandler_ReadHeader()Function IHeaderHandler_ReadHeader( _
    
ByVal pReader As SoapReader30, _
    
ByVal pHeaderNode As MSXML2.IXMLDOMNode, _
    
ByVal pObject As Object) _
    
As Boolean
    
    IHeaderHandler_ReadHeader 
= False
End Function


Private Function IHeaderHandler_WillWriteHeaders()Function IHeaderHandler_WillWriteHeaders() As Boolean
    IHeaderHandler_WillWriteHeaders 
= True
End Function



'<ServiceHead xmlns="http://tempuri.org/">
'
      <UserName>string</UserName>
'
      <Password>string</Password>
'
</ServiceHead>
Private Sub IHeaderHandler_WriteHeaders()Sub IHeaderHandler_WriteHeaders(ByVal pSerializer As SoapSerializer30, ByVal pObject As Object)
    
    
'Dim doc As New MSXML2.DOMDocument40
    
    
'Create the string for UserInfoRouteHeader.
    Dim userDoc As String
    userDoc 
= "<ServiceHead xmlns=""" & Namespace &NameSpace & """>"
    
    
If myUserName <> "" Then
        userDoc 
= userDoc & "<UserName>" & myUserName & "</UserName>"
    
End If
    
    
If myPassword <> "" Then
        userDoc 
= userDoc & "<Password>" & myPassword & "</Password>"
    
End If
    
    userDoc 
= userDoc & "</ServiceHead>"
    
    pSerializer.WriteXml userDoc
End Sub


在调用Web Service方法时提供SoapHeader内容:
Private   Sub Class_Initialize() Sub Class_Initialize()
    
'*****************************************************************
    'This subroutine will be called each time the class is instantiated.
    'Creates sc_ComplexTypes as new SoapClient30, and then
    'initializes sc_ComplexTypes.mssoapinit2 with WSDL file found in
    'http://172.20.18.191/StockService/StockService.asmx?wsdl.
    '*****************************************************************

    
Dim myAccount As New clsAccountHeader
    
Dim str_WSML As String
    str_WSML 
= "<servicemapping>"
    str_WSML 
= str_WSML & "<service name='StockService'>"
    str_WSML 
= str_WSML & "<using PROGID='MSOSOAP.GenericCustomTypeMapper30' cachable='0' ID='GCTM'/>"
    str_WSML 
= str_WSML & "<types>"
    str_WSML 
= str_WSML & "<type name='StockMonthPrice' targetNamespace='http://tempuri.org/' uses='GCTM' targetClassName='struct_StockMonthPrice'/>"
    str_WSML 
= str_WSML & "</types>"
    str_WSML 
= str_WSML & "</service>"
    str_WSML 
= str_WSML & "</servicemapping>"

    
Set sc_StockService = New SoapClient30

    sc_StockService.MSSoapInit2 c_WSDL_URL, str_WSML, c_SERVICE, c_PORT, c_SERVICE_NAMESPACE
    
'Use the proxy server defined in Internet Explorer's LAN settings by
    'setting ProxyServer to <CURRENT_USER>
    sc_StockService.ConnectorProperty("ProxyServer"= "<CURRENT_USER>"
    
'Autodetect proxy settings if Internet Explorer is set to autodetect
    'by setting EnableAutoProxy to True
    sc_StockService.ConnectorProperty("EnableAutoProxy"= True

    
Set sheet = ActiveWorkbook.Sheets("Tickers")
    myAccount.UserName 
= sheet.txtEmail.Value
    myAccount.Password 
= sheet.txtPassword.Value
    
Set sc_StockService.HeaderHandler = myAccount
    
    
Set sc_StockService.ClientProperty("GCTMObjectFactory"= New clsof_Factory_StockService

End Sub

关于读SoapHeader的实现可参考婷篇文章:利用 SOAP 头保持 EJB 状态( http://www.ibm.com/developerworks/cn/webservices/ws-ejbsoap/index.html

转载于:https://www.cnblogs.com/zengdj/archive/2007/08/31/876558.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值