• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            統(tǒng)計

            • 隨筆 - 50
            • 文章 - 42
            • 評論 - 147
            • 引用 - 0

            留言簿(6)

            隨筆分類

            文章分類

            Link

            搜索

            •  

            積分與排名

            • 積分 - 165513
            • 排名 - 159

            最新評論

            閱讀排行榜

            評論排行榜

            關(guān)于在程序中調(diào)用office應(yīng)用中的VBA模塊
            由于工作關(guān)系需要操作ACCESS數(shù)據(jù)庫,發(fā)現(xiàn)有一個前人的VBA模塊,是用來將數(shù)據(jù)綜合生成報表的,要是可以直接調(diào)用就方便多了,以下是我個人摸索出的方法
            需要說明的是程序是用C#寫的,C++程序員使用的話需要打開CLI來調(diào)用(一些C++粉絲看到這句話可能又要拍磚了,呵呵,還是那句話,程序語言都只是工具而已,關(guān)鍵是要合理使用,達到目的)

            背景知識:
            Primary Interop Assemblies--PIA

            當用.NET調(diào)用已有的COM組件的時候,一般需要使用tlbimp導入COM組件的TypeLibrary信息,生成對應(yīng)的Interop Assembly。所謂PIA (Primary Interop Assembly),則是“官方”發(fā)布的對于某個COM組件的.NET DLL。比如微軟公司發(fā)布了Office 2003COM組件,可以用于操作COM,同時,微軟也發(fā)布了Office 2003所對應(yīng)的PIA,用于.NET。PIA和普通的Interop(又稱為AIA, Alternative Interop Assembly)的不同之處在于:

            1.     PIA是官方發(fā)布并經(jīng)過Sign,可以在不同程序中共享。而AIA如果被不同的公司Sign過,則一個公司SignAIA DLL所創(chuàng)建的對象和另外一個公司SignAIA DLL是不兼容的(不同的Key代表不同的Identity),這也是使用PIA的主要原因

            2.     PIA可能經(jīng)過某種改動使其比一般Tlbimp生成的Interop DLL要容易使用一些,比如提供一些封裝函數(shù)。修改方法通常有兩種:

            a.     可以從Tlbimp生成的DLL反匯編修改再生成新的DLL

            b.     可以自己用C#來編寫這個DLL(其實TlbimpTlbexp也是C#寫的)

            3.     Tlbimp生成PIA的時候需要指定/primary開關(guān)并聲明對應(yīng)的key,如果不使用tlbimp生成PIA,則需要將對應(yīng)的DLL加上PrimaryInteropAttributeGuidAttribute,這也正是Tlbimp所作的。

            4.     RegAsm注冊PIA的時候,RegAsm會在COM組件的TypeLibrary注冊項中加入注冊信息表明該PIA對應(yīng)這個COM組件

            5.     當用Visual StudioAdd Reference功能的時候,VS會自動去查找是否有符合條件的PIA(通過上面所說的注冊信息),如果存在,則直接使用這個DLL

            以上是官方解釋得PIA,說白了就是微軟提供的用于使用其產(chǎn)品特性的一些公共數(shù)據(jù)定義和方接口,這些特性中就包括VBA模塊,當然還有其他的特性,對于ACCESS有數(shù)據(jù)查詢,排序,等等,這里講的僅僅是應(yīng)用其中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個參數(shù),第一個參數(shù)是用來指定模塊函數(shù)名稱,其余30個參數(shù)則是用來傳遞所要調(diào)用的模塊的參數(shù),而此處使用反射機制只是想放程序看起來decent一些,不必寫出三十一個參數(shù)來,其余看注釋應(yīng)該就了解了
            當然這只是PIA一種應(yīng)用,實際上任何Office的功能都可以通過PIA直接調(diào)用實現(xiàn),歡迎大家交流討論

            posted on 2009-02-10 14:01 pear_li 閱讀(2090) 評論(0)  編輯 收藏 引用 所屬分類: C#/.net

            国产精品久久网| 丰满少妇人妻久久久久久| 国产精品久久波多野结衣| 色88久久久久高潮综合影院| AV狠狠色丁香婷婷综合久久| 午夜天堂精品久久久久| 热久久国产欧美一区二区精品| 亚洲午夜福利精品久久| 99精品久久久久久久婷婷| 99久久99久久精品国产片果冻| 国产精品久久毛片完整版| 久久AⅤ人妻少妇嫩草影院| 2021久久精品国产99国产精品| 婷婷久久综合九色综合98| 综合久久一区二区三区| 丰满少妇人妻久久久久久| 欧美亚洲国产精品久久久久| 9久久9久久精品| 亚洲国产高清精品线久久 | 日产精品99久久久久久| 国产91色综合久久免费| 久久伊人五月天论坛| 人人狠狠综合久久亚洲婷婷| 久久精品中文字幕大胸| 狠狠色伊人久久精品综合网| 99久久精品毛片免费播放| 久久青青草原亚洲av无码app| 超级97碰碰碰碰久久久久最新| 久久久久亚洲爆乳少妇无| 精品久久777| 亚洲伊人久久大香线蕉苏妲己| 99精品国产99久久久久久97| 人妻少妇精品久久| 色婷婷综合久久久久中文字幕 | 欧美日韩精品久久久免费观看| 久久精品国产亚洲av麻豆色欲 | 久久久久久久久66精品片| 久久国产三级无码一区二区| 色妞色综合久久夜夜| 亚洲国产视频久久| 中文字幕无码免费久久|