• 在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宋卫东

  • 相关阅读:
    volley框架使用
    Insert Interval
    candy(贪心)
    Best Time to Buy and Sell Stock
    Best Time to Buy and Sell Stock III
    distinct subsequences
    edit distance(编辑距离,两个字符串之间相似性的问题)
    trapping rain water
    word break II(单词切分)
    sudoku solver(数独)
  • 原文地址:https://www.cnblogs.com/aspnetx/p/472758.html
Copyright © 2020-2023  润新知