Category: 编程、软件、技术

  • 开发Interop的另一种方法

    笔者曾经有若干篇文章介绍了在BDS 2006下开发Interop程序的一般步骤。有兴趣的读者可以参考这些文章的汇总:http://www.go4pro.org/cate_list.asp?cate=20

    上面提到的开发方法,是建立一个程序,然后创建Excel的应用对象(Application),再获得相应接口(如Workbook,Worksheet,Cells)的引用并对其进行进一步的操作。调用方式是通过由外(自己开发的程序)到内(Excel)。

    今天我要介绍一种新的利用.NET开发Interop应用的方法。这种方法与上述方法最大的不同就在于它是由内(Excel)到外(自己开发的程序)进行的。

    一、开发工具和准备工作:

    这次我使用的是免费的C#开发工具:SharpDeveloper。大家可以免费下载,免费使用。操作系统是Vista Business,但是XP平台应该一样可用。Office平台是2003. 同样的,要使用Office的Interop PIA,必须在安装时(或在安装后)选择各个Office应用(Word/Excel/…)的.NET编程支持,详细的步骤见前文描述,这里不再重复。

    二、建立Excel加载项

    启动#Developer后,选择File|New|Solution,在弹出窗口中选择C#模板中的Class Library。设置项目的位置、名称后单击“Create”,即可。

    00017_01.jpg

    Developer会自动创建程序的项目文件,这时界面如下:

    00017_02.jpg

    我们首先要在左侧的Solution Explorer中的References节点下加入对Excel PIA的引用。右击References节点,并选择Add Reference,在弹出窗口中选择GAC中的Microsoft.Office.Interop.Excel如下:

    00017_03.jpg

    注意,必须使用GAC中的类!而不是COM中的类!

    我们对IDE自动生成的MyClass.cs文件要做一些修改,增加两行代码(以粗体标出):

    using System;
    using System.Collections.Generic; 
    
    using Excel=Microsoft.Office.Interop.Excel;
    [assembly: System.ComponentModel.DescriptionAttribute(OfficeStartupClass, Version=1.0, Class=TestOLE.MyClass)]

    其中的using子句是常规的。而特别重要的,而且是必须要加的是[assembly: …]这一行。用户可能需要修改的是Class=TestOLE.MyClass。在我的应用中,我创建的DLL的namespace是 TestOLE,而其中的类是MyClass。

    在MyClass类中,需要创建两个Excel调用的特定函数:_Startup/_Shutdown。

    代码如下:

    public void _Startup(object thisApp, object thisWorkbook) {
      this.MyApp=thisApp as Excel.Application;
      this.MyWorkBook=thisWorkbook as Excel.Workbook;
      this.MyWorksheet=MyWorkBook.Worksheets[1] as Excel.Worksheet;
      MyWorksheet.Cells[1,1]='The add-on starts!'; 
    }
    
    public void _Shutdown() {
      MyApp=null;
      MyWorkBook=null;
      MyWorksheet=null;
    }

    其中的MyApp/MyWorkBook/MyWorksheet是一些自己定义的变量。此时我们可以编译该程序,生成MyClass.dll了。

    三、安全因素

    值得注意的是,即使我们是在.NET 2.0/3.0下开发我们的DLL,但是这个DLL的安全性需要在.NET 1.x下进行配置。有关.NET 1.x的安全性配置,可以参考其它文档,这里不再赘述。

    四、与Excel的工作簿链接

    现在我们的程序虽然已经编译完毕,但是还没有和一个Excel工作簿关联。要做到这一步,需要创建(或者打开)一个工作簿,对该工作簿做一些修改。

    在菜单中选择“文件|属性”,在弹出的对话框中选择“自定义”:

    00017_04.jpg

    我们需要加入两个自定义属性:_AssemblyLocation0和_AssemblyName0。第一个属性设置为我们的DLL所在的位置,在我的应用中是D:\Go4Pro\Programs\0017\Bin\Debug,而第二个属性是我们的DLL的名称,我的是TestOLE。

    保存这个文件,然后重新打开,可以看到在A1这个单元格中显示:“The add-on starts!”字样。这证明我们编写的DLL已经被该工作簿加载并执行。

    五、交互

    只有这样的功能显然不是我们想要的。我们需要加入一个交互的过程,让用户最终控制工作簿的行为。在这里我选择修改工作簿的标题作为演示。

    首先我们在MyClass.cs中创建两个方法,一个消息响应:

    private Excel.WorkbookEvents_SheetFollowHyperlinkEventHandler followHyperlinksEvent;
    public void _Startup(object thisApp, object thisWorkbook) {
      this.MyApp=thisApp as Excel.Application;
      this.MyWorkBook=thisWorkbook as Excel.Workbook;
      this.MyWorksheet=MyWorkBook.Worksheets[1] as Excel.Worksheet;
      MyWorksheet.Cells[1,1]='The add-on starts!';
    
      followHyperlinksEvent=new Excel.WorkbookEvents_SheetFollowHyperlinkEventHandler (ThisWorkbook_SheetFollowHyperlink);
      MyWorkBook.SheetFollowHyperlink+=followHyperlinksEvent;
    }
    
    protected void ThisWorkbook_SheetFollowHyperlink(System.Object s, Excel.Hyperlink l) {
      switch (l.SubAddress) {
        case ChangeTitle: ChangeTitle(); break;
        default: break;
        }
    }
    
    public void ChangeTitle() {
      MyApp.Caption='Invoked from Excel (supported by C#)';
    }

    在ThisWorkbook_SheetFollowHyperlink中,我们可以看到我们采用的是超链接的方式来激活相应的方法。这就还需要我们在Excel工作簿中进行一些工作。

    在我们刚才的工作簿中,随便选择一个单元格,输入一些内容,诸如“Click here to change the title!”。然后将该单元格命名为ChangeTitle(这个名字必须和上面代码中case段的内容一致)。然后在该单元格选中的情况下,选择菜单 “插入|超链接”:

    00017_05.jpg

    选择“本文档中的位置”中的“定义的名称”中的ChangeTitle即可。保存Excel文件并再次打开,点击“Click here to change the title!”单元格,我们可以看到工作簿的名称得以改变:

    00017_06.jpg

    六、与以前方法的比较

    显然,这个方法比以前的方法更加灵活而友好,因为用户将在一个界面中进行操作,而不用在两个界面中进行切换。而且只要关闭工作簿就可以结束DLL,不用再关闭另一个主程序。

    但是,这个方法需要我们开启.NET 1.x的安全性,需要一些额外的设置,并不一定是每个终端用户都能胜任的。

    孰优孰劣,留待开发者和用户进行判断。

  • WordPress上传问题解决

    将系统升级到Vista后,WP的上传功能一直没有解决。老是提示:Failed to upload之类的狗*信息。

    今天一个偶然的机会,下载了PHPEd 5.0的试用版,在修改php.ini文件时偶然注意到这一行:

    file_uploads = On
    upload_tmp_dir = XXXX
    upload_max_filesize = 20M

    会不会是没有设置上传临时目录的原因?在Vista下用命令行观察系统缺省分配的临时目录,发现是类似 TEMP=C:\Users\AppData\Local\Temp;TMP=C:\Users\AppData\Local\Temp这样的目录。于是将upload_tmp_dir设置为一个“任何用户”都有完全控制的目录,问题解决!

  • 现在我用脱兔

    以前一直用迅雷 and/or Web迅雷,即使是在VISTA下。

    昨天被WEB迅雷友情提醒了一把,有更新的版本可用,而且“必须升级后方可使用WEB迅雷”。这样的“要求”我当然是无法拒绝的了。于是升级…… 但是升级后的WEB迅雷(包括我后来改装了迅雷)都无法在Vista下运行,我不知道是不是我的RP太差的原因。

    于是我只好改用脱兔了,在Vista下运行正常:

    脱兔

  • 搜狗拼音在VISTA下的诡异表现

    装了Vista(正版),装了最新的搜狗拼音。

    在Outlook 2003中,发现一个很诡异的现象:如果选择使用Word 2003作为邮件编写器,那么在搜狗拼音下,无法输入汉字。切换到Windows自带的输入法正常;如果选择使用Word 2003作为邮件编写器,那就可以用搜狗输入汉字。在其它应用程序中,还有IE7似乎有同样的问题。

    截图如下:

    Word

  • Drive C is full?

    How can I NOT admire Microsoft and Vista?

    Today I am installing some important patches from Microsoft site, majorly catered for my Office 2003 & Vistual Studio installation. And I suddently noticed that the color indicator of my C drive is now turning to RED, while there is still over 1G free space.

    Drive

    Humm, I know the space may be reclaimed after the patches are all made, but does MS need to be that Gan-Jiong and Kia-Su? After all, 1G is not a SMALL space anyway!

    Gan-Jiong: a Singapore slang, meaning nervous, uncomfortable or 紧张。

    Kia-Su: another Singapore slang, meaning afraid to lose, or 怕输。

  • Vista下安装Helvetica字体

    根据网络上的说辞,Arial字体是被滥用了的字体,真正的无衬线字体应该是Helvetica。所以,今天我就尝试了一下在Vista下安装Helvetica字体。我下载的字体包一共有34个文件,都是Helvetica字体家族的。

    安装比较顺利,就不多说了。 看看效果(特别是和Arial比较的效果):

    字体对比

    从图中可以看出,在字号比较小的时候,Helvetica的效果其实并不如Arial,个别字母出现了压挤的现象,而此时的Arial字体比较宽松,不影响阅读。

    但是在12点以上时,Arial字体显然过分粗重,而Helvetica更加纤细,更符合阅读习惯。我这里是1024X768的屏幕分辨率,Word 2003中的“缩放”选择“页宽”。所以如果你的电脑的分辨率或缩放比例不同的话,可能会有不同的视觉体验。

  • 我的系统CPU使用率

    Content: 我的系统CPU使用率一直维持在200%(因为是双CPU):

    突然想到,会不会是BOINC的问题,于是就将其暂停,果然是它的问题:

    通过这个调整,我终于知道:

    1. 我系统的CPU使用率维持在200%是因为BOINC,不是别的什么病毒;
    2. BOINC是很浪费CPU的——当然和BOINC设置也有关系。 呵呵。
  • Vista下的谷歌拼音

    装了Vista,自然我是绝对不会使用Windows的输入法的,所以就下载了一个Google拼音。使用了两天,我不得不卸载它:因为我实在不清楚它为什么会和Vista这么不兼容。详情看下面的截图:

    开始的时候,我并不是很在乎这个问题,因为我还能输入文字。但是,今天这个问题差点让Vista认为我的Vista版本不是正版!这就太过分了。

    卸载了谷歌拼音,继续。

    下载了搜狗拼音,继续。

  • 对Palm和NetGear的要求和其它

    装机到现在,基本上没有什么大的问题。但是有两个程序让我觉得这个世界上还是有不少公司Not Vista Ready。

    第一个是Palm。我使用Treo 600也已经很长时间了。以前在XP下,装Office 2003,于是Treo 600可以直接和我的Outlook同步。现在在Vista下,我并没有装Office 200x,而是装了OOO。同时,Vista提供了Windows Mail/Windows Contact/Windows Calendar。因此,虽然Palm Desktop可以运行于Vista下,我当然希望我的Treo 600能够直接和这后两个内置的程序直接同步。这样,我可以只维护一份数据即可。

    第二个是NetGear。问题在前一个帖子有所提及。不过NG公司还算厚道,确定将在2007年上半年放出Vista下SC101的驱动。我就耐心等了。

    另外,装了不少程序,总的来说,兼容性还是不错的。

  • 安装Vista完毕

    今天花了900大洋买了个正版的Vista Business,安装完毕了。

    结果是我的BLOG数据库全部泡汤。只好重新开始。 安装完毕后进行这么一些软件的安装:

    • 所有的IM软件:Google Talk,MSN。安装顺利。
    • 输入法:Google拼音。安装顺利。
    • 防病毒软件:avast!。安装顺利。
    • BLOG:安装了PHP/MYSQL支持。基本顺利。在PHP调试中,由于没有设置Windows的PATH变量中调入PHP的路径,所以在调用扩展时出了些问题。还没有安装InterBase,需要尽快安装。
    • Netgear SC101:由于我的很多文件都集中在我的SC101上,所以必须安装驱动。但是不成功。安装完毕后启动SCM时,提示操作系统平台有问题。即使设置兼容模式都不行。网上有解决方案,但是比较BT:需要通过虚拟机中安装XP,然后在该虚拟XP中运行SCM才可以。不想这么搞了。还是先把我的BLOG建立起 来再说。
    • 打印机:从HP官方网站下载了Vista的驱动。没有问题。

    …… 暂时就安装了这么些东西。