日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

C#如何在Form中嵌入并且操作Excel表格

發布時間:2023/11/27 生活经验 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C#如何在Form中嵌入并且操作Excel表格 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
網上比較多講述如何操作excel表的文章,但都是啟動excel的窗口來打開excel數據文件。有時候需要把excel表嵌入到自己程序的form中,給客戶一個不用切換窗口的操作界面,似乎更好。這在vc中用ole技術很容易實現,但是在c#中方法就不一樣啦。下面將就此進行闡述。

一、首先簡要回顧一下如何操作excel表

??先要添加對Excel的引用。選擇項目-〉添加引用-〉COM-〉添加Microsoft?Excel?9.0。(不同的office講會有不同版本的dll文件)。?


???using?Excel;
???using?System.Reflection;
???
???//產生一個Excel.Application的新進程
???Excel.Application?app?=?new?Excel.Application();
???if?(app?==?null)?
???{
????statusBar1.Text?=?"ERROR:?EXCEL?couldn't?be?started!";
????return?;
???}
???
???app.Visible?=?true;?//如果只想用程序控制該excel而不想讓用戶操作時候,可以設置為false
???app.UserControl?=?true;
???
???Workbooks?workbooks?=app.Workbooks;
??
???_Workbook?workbook?=?workbooks.Add(XlWBATemplate.xlWBATWorksheet);?//根據模板產生新的workbook
//??_Workbook?workbook?=?workbooks.Add("c://a.xls");?//或者根據絕對路徑打開工作簿文件a.xls?

?

???Sheets?sheets?=?workbook.Worksheets;
???_Worksheet?worksheet?=?(_Worksheet)?sheets.get_Item(1);
???if?(worksheet?==?null)?
???{
????statusBar1.Text?=??"ERROR:?worksheet?==?null";
????return;
???}

???//?This?paragraph?puts?the?value?5?to?the?cell?G1
???Range?range1?=?worksheet.get_Range("A1",?Missing.Value);
???if?(range1?==?null)?
???{
????statusBar1.Text?=??"ERROR:?range?==?null";
????return;
???}
???const?int?nCells?=?2345;
???range1.Value2?=?nCells;
??


二、將Excel用戶界面嵌入到自己的Windows?Form中?

?

??????由于目前,C#和vb.net都不支持OLE技術(參見微軟支持中心Info:304562),,所以只有使用WebBrowser控件來完成此功能。(以下方法參見微軟支持中心Howto:304662)
??????1、右擊工具箱,選擇自定義工具箱,添加COM組件,選擇“Microsoft?Web?瀏覽器”(對應文件是/winnt/system32/shdocvw.dll),確定。在工具箱中將會出現文本為Explorer的WebBroser控件圖標。
??????2、在Form1中添加WebBrowser控件。(對象名卻省是axWebBrowser1)
??????3、假定要打開的excel文件是:?c:/a.xls。
???????string?strFileName?=?@"c:/a.xls";
?????Object?refmissing?=?System.Reflection.Missing.Value;
?????axWebBrowser1.Navigate(strFileName,?ref?refmissing?,?ref?refmissing?,?ref?refmissing?,?ref?refmissing);
????值得注意的是用WebBrowser控件不支持菜單合并,也就是說無法把Excel表的菜單帶入到我們的程序中。這是相對于OLE實現方法的一大缺點。幸好提供了可以把工具欄添加進來的功能,通過工具欄可以進行許多Excel專有的操作。
?????//下面這句可以將excel本身的工具調添加進來
????axWebBrowser1.ExecWB(SHDocVw.OLECMDID.OLECMDID_HIDETOOLBARS,?SHDocVw.OLECMDEXECOPT.OLECMDEXECOPT_DONTPROMPTUSER,ref?refmissing?,?ref?refmissing);
????
三、回到本文提出的問題,如何操作嵌入的Excel?

???首先需要明白,用WebBrowser“裝載”Excel"表,實際上仍然是在新的進程空間中運行Excel.exe。可以用任務管理器觀察。因此,只要我們能夠獲取Excel.Application對象,就能像上文一中所說的那樣操作Excel數據。
???幸好可以通過WebBrowser的方法NavigateComplete提供的事件參數e來訪問Excel.Application。?


??public?void?axWebBrowser1_NavigateComplete2(object?sender,?AxSHDocVw.DWebBrowserEvents2_NavigateComplete2Event?e)
??{
???Object?o?=?e.pDisp;
???Object?oDocument?=?o.GetType().InvokeMember("Document",BindingFlags.GetProperty,null,o,null);
???Object?oApplication?=?o.GetType().InvokeMember("Application",BindingFlags.GetProperty,null,oDocument,null);
??????//Object?oName?=?o.GetType().InvokeMember("Name",BindingFlags.GetProperty?,null,oApplication,null);?

?

???//由于打開的是excel文件,所以這里的oApplication?其實就是Excel.Application
???Excel.Application?eApp?=(Excel.Application)oApplication;//這樣就可以象上文中所述來操作Excel了。
??}

四、包含該webbrowser的form退出時候,如何確保excel進程也退出?(參見microsoft幫助中心kb317109)

??由于WebBrowser只不過是對Excel表的瀏覽,而Excel在單獨的進程中運行。所以要保證對該Excel對象eApp及其相應的所有成員變量都釋放引用,才能保證在Form退出時excel進程跟著退出。這一點在一個程序需要多次打開關閉excel表時尤為重要。?


??????Excel.Application?oApp;
??????Excel.Workbooks?oBooks;
??????Excel.Workbook?oBook;
??????Excel.Worksheet?oSheet;
??????...........
????private?void?ExcelExit()
????{
???????NAR(oSheet);
???????oBook.Close(False);
???????NAR(oBook);
???????NAR(oBooks);
???????oApp.Quit();
???????NAR(oApp);?

?

???????Debug.WriteLine("Sleeping...");
???????System.Threading.Thread.Sleep(5000);
???????Debug.WriteLine("End?Excel");
????}
??private?void?NAR(Object?o)
??{
????????try{System.Runtime.InteropServices.Marshal.ReleaseComObject(o);}
????????catch{}
????????finally{o?=?null;}
????}
??

經過試驗,我發現除了釋放這些變量以外,必須把該axWebBroswer1也銷毀掉,Excel進程才退出。否則的話,即使讓axWebBroser1去Navigate空內容"about:blank",?excel進程仍然不會退出。因此應該將axWebBroser1所在的Form關閉掉,或者直接調用axWebBrowser1.Dispose();
??如果還是其它問題導致不能正常退出,就只有調用垃圾回收了。
??GC.Collect();
?

總結

以上是生活随笔為你收集整理的C#如何在Form中嵌入并且操作Excel表格的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。