统计

  • 随笔 - 50
  • 文章 - 42
  • 评论 - 147
  • 引用 - 0

留言簿(6)

随笔分类

文章分类

Link

搜索

  •  

积分与排名

  • 积分 - 162620
  • 排名 - 161

最新评论

阅读排行榜

评论排行榜

关于在程序中调用office应用中的VBA模块
由于工作关系需要操作ACCESS数据库,发现有一个前人的VBA模块,是用来将数据综合生成报表的,要是可以直接调用就方便多了,以下是我个人摸索出的方法
需要说明的是程序是用C#写的,C++程序员使用的话需要打开CLI来调用(一些C++粉丝看到这句话可能又要拍砖了,呵呵,还是那句话,程序语言都只是工具而已,关键是要合理使用,达到目的)

背景知识:
Primary Interop Assemblies--PIA

当用.NET调用已有的COM组件的时候,一般需要使用tlbimp导入COM组件的TypeLibrary信息,生成对应的Interop Assembly。所谓PIA (Primary Interop Assembly),则是“官方”发布的对于某个COM组件的.NET DLL。比如微软公司发布了Office 2003COM组件,可以用于操作COM,同时,微软也发布了Office 2003所对应的PIA,用于.NETPIA和普通的Interop(又称为AIA, Alternative Interop Assembly)的不同之处在于:

1.     PIA是官方发布并经过Sign,可以在不同程序中共享。而AIA如果被不同的公司Sign过,则一个公司SignAIA DLL所创建的对象和另外一个公司SignAIA DLL是不兼容的(不同的Key代表不同的Identity),这也是使用PIA的主要原因

2.     PIA可能经过某种改动使其比一般Tlbimp生成的Interop DLL要容易使用一些,比如提供一些封装函数。修改方法通常有两种:

a.     可以从Tlbimp生成的DLL反汇编修改再生成新的DLL

b.     可以自己用C#来编写这个DLL(其实TlbimpTlbexp也是C#写的)

3.     Tlbimp生成PIA的时候需要指定/primary开关并声明对应的key,如果不使用tlbimp生成PIA,则需要将对应的DLL加上PrimaryInteropAttributeGuidAttribute,这也正是Tlbimp所作的。

4.     RegAsm注册PIA的时候,RegAsm会在COM组件的TypeLibrary注册项中加入注册信息表明该PIA对应这个COM组件

5.     当用Visual StudioAdd Reference功能的时候,VS会自动去查找是否有符合条件的PIA(通过上面所说的注册信息),如果存在,则直接使用这个DLL

以上是官方解释得PIA,说白了就是微软提供的用于使用其产品特性的一些公共数据定义和方接口,这些特性中就包括VBA模块,当然还有其他的特性,对于ACCESS有数据查询,排序,等等,这里讲的仅仅是应用其中VBA模块特性的方法。
首先需要导入Microsoft.Office.Interop.Access程序集
主程序代码如下:

 1using Access=System.Office.Interop.Access
 2
 3///Create access operating object
 4Access.ApplicationClass oAccess=new Access.ApplicationClass();
 5///Create parameter object array 
 6object paraObjects=new object[2];
 7paraObjects[0]="modeul name";//modeul name
 8paraObjects[1]="parameter1";
 9oAccess.OpenCurrentDatabase(mdbfilePath,false,null);
10object objRtn;
11///use reflect mechanism to execute VBA moduel named in paraObjects[0]
12objRtn==oAccess.GetType().InvokeMember(
13"Run",///member function of ApplicationClass object
14System.Reflection.BindingFlags.Default|System.Reflection.BindingFlags.InvokeMethod.
15null,
16oAccess,
17paraObjects
18);
19oAccess.CloseCurrentDatabase();
20
程序中主要用到类为ApplicationClass ,成员方法run就是用来运行VBA模块的,该程序共有31个参数,第一个参数是用来指定模块函数名称,其余30个参数则是用来传递所要调用的模块的参数,而此处使用反射机制只是想放程序看起来decent一些,不必写出三十一个参数来,其余看注释应该就了解了
当然这只是PIA一种应用,实际上任何Office的功能都可以通过PIA直接调用实现,欢迎大家交流讨论

posted on 2009-02-10 14:01 pear_li 阅读(2064) 评论(0)  编辑 收藏 引用 所属分类: C#/.net


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理