c#中的受管代碼和非受管代碼
在.net公用語言框架內運行的程序為受管代碼。受管代碼在程序中所有類型都受到嚴格檢查,沒有指針,對內存的管理完全由運行系統控制。 受 控狀態下,編寫程序更為容易,且更少出錯,我們可以花更多的時間在解決實際問題上而不是在計算機語言問題上。相對而言,那些在.net框架外運行的程序為 非受管代碼。比如:com組件、activex組件、win32 api函數、指針運算等。c#編程中在某些特定情況下,需要運用非受管代碼,例如,要利用一個成熟的com組件,或者調用一個api函數,或者用指針去編 寫實時/高效程序等。
visual c#中調用excel的com組件
一個.net組件事實上是一個.net下的dll,它包含的不僅是運行程序本身,更重要的是包含這個dll的描述信息(meta data,即元數據),而一個com組件是用其類庫(tlb)儲存其描述信息。這些com組件都是非受管代碼,要在visual c#中使用這些非受管代碼的com組件,就必須把他們轉換成受管代碼的.net組件。所以在用visual c#調用excel表格之前,必須完成從com組件的非受管代碼到受管代碼的類庫的轉換。
1、將excel的com組件轉換為.net組件
在項目中打開add reference對話框,選擇com欄,之后在com列表中找到"microsoft excel 9.0 object library"(office 2000),然后將其加入到項目的references中即可。visual c#.net會自動產生相應的.net組件文件,以后即可正常使用。
這個轉換形成.net組件不能單獨使用,它不過是以前的com組件的一個外層包裝,在.net中可以通過這個外層包裝去發現原來的com組件并調用其相應的界面函數。所以它必須與原來的com組件一起起作用。
2、visual c#打開excel表格
事實上,在c#中使用一個經轉換的com組件和使用任何一個其它.net組件完全一樣。可以用new關鍵字創建一個經轉換的com組件,然后再像使用任何一個其它c#對象一樣使用這個組件對象。
在轉換后的.net組件中定義了一個命名空間excel,在此命名空間中封裝了一個類application,這個類和啟動excel表格有非常重要的關系,在visual c#中,只需要下列三行代碼就可以完成打開excel表格的工作,具體如下:
excel.application excel = new excel.application ();//引用excel對象 excel.application.workbooks.add ( true );//引用excel工作簿 excel.visible = true ;//使excel可視 |
但此時的excel表格是一個空的表格,沒有任何內容,下面就來介紹如何往excel表格中輸入數據。
3、往excel表格中輸入數據
在命名空間"excel"中,還定義了一個類"cell",這個類所代表的就是excel表格中的一個單元格。通過給"cell"賦值,從而實現往excel表格中輸入相應的數據,下列代碼功能是打開excel表格,并且往表格輸入一些數據。
excel.application excel = new excel.application () ; excel.application.workbooks.add ( true ) ; excel.cells[ 1 , 1 ] = "first row first column" ; excel.cells[ 1 , 2 ] = "first row second column" ; excel.cells[ 2 , 1 ] = "second row first column" ; excel.cells[ 2 , 2 ] = "second row second column" ; excel.visible = true ; |
4、實例
下面實例在c#中連接oracle數據庫(name),從表(tablename)中讀取數據,并寫入excel。
string cnstring="provider=msdaora.1;data source=name; "; cnstring=cnstring+"user id=username;password=password"; try { oledbconnection cn=new oledbconnection (cnstring); cn.open (); try { string s="select * from name.tablename"; oledbcommand cmd=new oledbcommand (s,cn); oledbdatareader dr=cmd.executereader (); excel.application xlapp = new excel.application(); if(xlapp==null){messagebox.show ("can't open excel!");return;} xlapp.application .workbooks .add (true); int row=2,fieldcount; fieldcount=dr.fieldcount ; for(int col=0;col<fieldcount;col++) xlapp.cells [1,col+1]=dr.getname(col); while (dr.read ()) { for(int col=0;col<fieldcount;col++) xlapp.cells [row,col+1]=dr.getvalue(col).tostring(); row++; } xlapp.visible =true; xlapp=null; } catch(exception ex ){messagebox.show (ex.message );} finally {cn.close();} } catch(exception ex){messagebox.show (ex.message );} } } |
5、安裝一個使用com組件的.net程序
如果要將這樣的程序安裝運行在另一臺機器上,那么除了安裝運行程序外,還做三件事。
首先,是安裝.net運行系統。因為任何一個.net程序都不能離開.net運行系統去獨立運行。
其次,所調用的com組件必須要安裝在目標機器上。本例中大多數目標機器上都裝有microsoft office的excel,一般不會有這個問題。但如果是另一個用戶自定義的com組件,那么這個com組件在運行.net程序之前必須先安裝好。
最后,轉換后的.net組件dll文件要安裝在目標機器上。因為.net組件不需要在windows registry中注冊,所以最簡單的方法是將.net組件dll文件拷貝到運行程序目錄下。如果此.net組件被多個.net程序共享,可以將其安裝 在.net公用組件區中,從而可被任何一個.net組件使用。只有當一個.net組件參與了事務處理時,才需要將它注冊為一個com+組件。因為.net 仍然用傳統的com+機制來處理事務的提交、回滾等。
小結
通過以上討論,我們知道了在c#中,如何使用excel的com組件。需要注意的是,excel對象包含的許多內容我們沒有介紹,在使用過程中需要我們不斷學習。也使我們了解了在c#中如何使用com組件。