在Excel Service中使用用户自定义函数(UDF)

上个月微软给公司送过来两张盘,Office2007DVD两张,英文版本。实际上我现在也没想明白做治安系统的公司是否会用到象WSS这样的东西,不过,老总让我熟悉这套系统,也就有了接触它们的机会,等到自己掌握以后再向老总汇报好让他做出决策。<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

在微软中文的webcast上,介绍了Excel Service的基本使用和配置方法,并且简单的给大家演示了如何在Visual Studio2005中调用Excel Service里的方法。不过其讲的我认为还是很浅的,并且这个质量嘛~~~~,虽然我在以前的post中发过关于webcast的牢骚,并且微软也做出了回复。但是毕竟Office2007正式版还没有发布,所以我觉得还是可以理解的,再说了,国外那么多优秀的站点和博客,也不一定非指望他们,哈哈。

关于Excel Service的细节问题,大家可以参考微软MSDN WebCastOffice2007相关的内容,里面有一个是具体介绍Excel这个产品的,刘敏老师讲的,地址是

http://www.microsoft.com/china/msdn/events/webcasts/shared/webcast/episode.aspx?newsID=1242569

里面详细演示了如何配置和相关的问题。

言归正传,本文所描述的是要实现这么一个简单的功能,这个功能是在Excel中的两列,在第一列中输入一个web地址,第二列就自动把这个地址的ip地址显示出来。我们知道,类似的方法我们可以通过Excel一直都有的“公式”来完成,但是很明显Excel没有现成这样的公式.。而以往做.net程序的时候我们在代码里很容易就能实现这个功能,那么如何才能把自己写的方法填加到Excel Service中去呢?

通过这个演示,将向大家介绍在Excel Service中如何使用自己定义的逻辑(个人理解就是传说中的UDF)。

首先,我们在Visual Studio 2005里新建一个“class library”项目,语言这里选择C#,在这个项目里我们需要引用一个dll,这个dll的大概位置如下,为什么这么做请大家往下接着看:

 

%windir%\assembly\GAC_MSIL\Microsoft.Office.Excel.Server.Udf\?12.0.0.0__71e9bce111e9429c\Microsoft.Office.Excel.Server.Udf.dll

此处修正一下: Microsoft.Office.Excel.Server.Udf.dll的位置默认安装下应该是:C:\Program Files\Common Files\Microsoft Shared\web server extensions\12\ISAPI

去掉现有类的定义,填加如下类的定义

None.gif public   class  MyUdfClass
None.gif
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif
InBlock.gif
public string ResolveHostName(string name)
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gif
ExpandedSubBlockEnd.gif}

InBlock.gif
ExpandedBlockEnd.gif}

None.gif

我们看到在类中有一个

ResolveHostName 的方法,有一个参数 name ,和一个返回值类型 string ,也就是说,这个方法是把输入过来的 web 地址以字符串的形式 return 回去的。

根据web地址求ip地址和cmd里的ping是一样的,本文就不具体描述在c#中这种功能具体怎样实现,因为其不是本文所阐述的核心,有兴趣的朋友可以参考MSDN

在这里我们直接调用如下的一个在Internet存在的WebService来实现:

http://www.atomic-x.com/xmlservices/dnslookupservice.asmx?wsdl

在刚才建的项目中填加这个web引用,然后命名为DnsLookup

然后,我们在项目里调用这个WebService,在刚才定义的ResolveHostName方法中,加入如下代码:

None.gif string  st;
None.gif
None.gif
using  (DnsLookup.DNSLookupService dns  =   new  Blog_DNSUdf.DnsLookup.DNSLookupService())
None.gif
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif
InBlock.gifst 
=  dns.GetDNSInfoByWebAddress(name).IPAddress[0].ToString();
InBlock.gif
ExpandedBlockEnd.gif}

None.gif
None.gif
return  st;
None.gif

最后一步,我们需要把这个类标记成是

UDF 类型的类,并且把里的方法标注成是是 UDF 方法,有朋友会问在 .net 类库下好象没有 [UdfClass] [UdfMethod] 吧,这里其实就是用到了我们上面引入的那个 dll 。并且在代码里我们把其 using 进来就可以了。

所有的这些步骤完成后,我们的代码会和下面的基本一致:

None.gif using  Microsoft.Office.Excel.Server.Udf;
None.gif
None.gif 
None.gif
None.gif[UdfClass]
None.gif
None.gif
public   class  MyUdfClass
None.gif
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif
InBlock.gif[UdfMethod]
InBlock.gif
InBlock.gif
public string ResolveHostName(string name)
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gif
InBlock.gif
string st;
InBlock.gif
InBlock.gif
using (DnsLookup.DNSLookupService dns = new Blog_DNSUdf.DnsLookup.DNSLookupService())
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gif
InBlock.gifst 
=  dns.GetDNSInfoByWebAddress(name).IPAddress[0].ToString();
InBlock.gif
ExpandedSubBlockEnd.gif}

InBlock.gif
InBlock.gif
return st;
InBlock.gif
ExpandedSubBlockEnd.gif}

InBlock.gif
ExpandedBlockEnd.gif}

None.gif

编译这个项目,

OK !请记住编译后的 dll 的位置!

我们都知道微软的这套东西一般都是有一定的安全限制的,不是随便拿来一个dll就能用,一般都需要配置或者告诉系统“它是安全的”。这里我们需要做两步工作:

首先,让其所在的服务器知道这个dll的存在,这似乎是微软设计的一贯套路。我们打开管理页,在地址栏里直接指向这一页的链接:

http://服务器名:端口号/ssp/admin/_layouts/ExcelServerUserDefinedFunctions.aspx

进到这一页后我们点击其上面的“Add User-Defined Function Assembly”,我们会看到如下的界面:

第一行是填写我们刚才编译后的那个dll所在的位置,还有下面的单选框要选择Local FileAssembly Enabled这个也选上。

到这里还没有完成,我们需要到管理页里把其配置成可信任的。这里我们找到Trusted Location configuration,点击后我们看最下面,有一个Allow User-Defined Functions,选中下面的那个选项。到这里配置完毕。

最后的一步,也就是建立一个Excel文件,一定要用Excel2007

A1列上我们输入“主机名”,A2列上输入“ip地址”,然后关键的一步是在B2列里,我们输入一个公式,就是比如计算总和或者计算平均数的那种,关于如何在Excel里输入公式,问一下公司的会计吧,他们基本基本上都知道,呵呵。

然后,我们需要把B1的那一格作为参数让Excel Service知道,具体的方法是选中这一个单元格后找工具栏上的“公式”-“命名单元格区域”,弹出界面点确定就可以了。

最后,我们把这个Excel文件发布到Excel Service上去就可以了,需要注意的是在发布对话框里的Excel Service选项里把那个B1的参数加上。

到这里有不成功的朋友请参考MSDN的那个WebCast,里面有讲如何配置ExcelService,这里就不重复说了。地址在

http://www.microsoft.com/china/msdn/events/webcasts/shared/webcast/episode.aspx?newsID=1242569

最后我们来看一下效果吧,如图:

我们在右面的框里输入一个网址,在B2那一列这个ip就自动显示在那里了。

总结:

希望这里能起到抛砖引玉的作用。

在最近的学习中我发现,微软的产品相互间的紧密程度越来越紧密了,每一个产品似乎都有关联,而VS2005贯穿着所有的产品。记得Microsoft Press的数据上第一页写着,微软为未来的十年做好了准备,你呢?这是第几个年头我觉得已经无所谓了,总之贯穿这一套产品体系,对于我们开发人员来说,面对的更多的是机遇和挑战。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值