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

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

在微软中文的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

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

public class MyUdfClass

{

public string ResolveHostName(string name)

{

}


}

我们看到在类中有一个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方法中,加入如下代码:

string st;

using (DnsLookup.DNSLookupService dns = new Blog_DNSUdf.DnsLookup.DNSLookupService())

{

st 
=  dns.GetDNSInfoByWebAddress(name).IPAddress[0].ToString();

}


return st;

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

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

using Microsoft.Office.Excel.Server.Udf;

 

[UdfClass]

public class MyUdfClass

{

[UdfMethod]

public string ResolveHostName(string name)

{

string st;

using (DnsLookup.DNSLookupService dns = new Blog_DNSUdf.DnsLookup.DNSLookupService())

{

st 
=  dns.GetDNSInfoByWebAddress(name).IPAddress[0].ToString();

}


return st;

}


}

编译这个项目,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的数据上第一页写着,微软为未来的十年做好了准备,你呢?这是第几个年头我觉得已经无所谓了,总之贯穿这一套产品体系,对于我们开发人员来说,面对的更多的是机遇和挑战。

posted @ 2006-08-10 00:48  哥本哈士奇(aspnetx)  阅读(3184)  评论(7编辑  收藏  举报