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

    ---------------------------------------------------------------

    aspnetxBI笔记系列索引:

    使用SQL Server Analysis Services数据挖掘的关联规则实现商品推荐功能

    一起玩转SQL Server 2012 下的分析服务

    使用SQL Server分析服务定位目标用户

    ---------------------------------------------------------------

    来自博客园aspnetx宋卫东

  • 相关阅读:
    Python 面向对象编程
    snmp获取交换机端口和对应ip
    python IPy
    Django F()与Q()函数
    装饰器使用
    log日志信息查看
    shell简单入门
    gunicorn开启、关闭和重启
    CF1453B
    ACWing845 八数码(BFS,全排列hash)
  • 原文地址:https://www.cnblogs.com/aspnetx/p/472758.html
Copyright © 2011-2022 走看看