当我们实现from功能的时候需要把excel表嵌入到自己程序的C# form中,给客户一个不用切换窗口的简单的操作界面,下面笔者就为你讲讲在c#中如何实现。
当咱们完结from功用的时分需求把excel表嵌入到自己程序的C# form中,给客户一个不必切换窗口的简略的操作界面,下面笔者就为你讲讲在C#中怎么完结。
一、先要增加对Excel的引证。挑选项目-〉增加引证-〉COM-〉增加Microsoft Excel 9.0。(不同的office讲会有不同版别的dll文件)。
- usingExcel;
- usingSystem.Reflection;
- //发生一个Excel.Application的新进程
- Excel.Applicationapp=newExcel.Application();
- if(app==null)
- {
- statusBar1.Text="ERROR:EXCELcouldn'tbestarted!";
- return;
- }
- app.Visible=true;//假如只想用程序控制该excel而不想让用户操作时分,能够设置为false
- app.UserControl=true;
- Workbooksworkbooks=app.Workbooks;
- _Workbookworkbook=workbooks.Add(XlWBATemplate.xlWBATWorksheet);//依据模板发生新的workbook
- //_Workbookworkbook=workbooks.Add("c:\\a.xls");//或许依据绝对路径翻开作业簿文件a.xls
- Sheetssheets=workbook.Worksheets;
- _Worksheetworksheet=(_Worksheet)sheets.get_Item(1);
- if(worksheet==null)
- {
- statusBar1.Text="ERROR:worksheet==null";
- return;
- }
- //Thisparagraphputsthevalue5tothecellG1
- Rangerange1=worksheet.get_Range("A1",Missing.Value);
- if(range1==null)
- {
- statusBar1.Text="ERROR:range==null";
- return;
- }
- constintnCells=2345;
- range1.Value2=nCells;
二、将Excel用户界面嵌入到自己的C# form中
因为现在,C#和vb.net都不支撑OLE技能(拜见微软支撑中心Info:304562),,所以只需运用WebBrowser控件来完结此功用。(以下办法拜见微软支撑中心Howto:304662)
1、右击东西箱,挑选自定义东西箱,增加COM组件,挑选“Microsoft Web 阅读器”(对应文件是\winnt\system32\shdocvw.dll),确认。在东西箱中将会呈现文本为Explorer的WebBroser控件图标。
2、在C#form1中增加WebBrowser控件。(目标名却省是axWebBrowser1)
3、假定要翻开的excel文件是: c:\a.xls。
- stringstrFileName=@"c:\a.xls";
- Objectrefmissing=System.Reflection.Missing.Value;
- axWebBrowser1.Navigate(strFileName,refrefmissing,refrefmissing,refrefmissing,refrefmissing);
值得注意的是用WebBrowser控件不支撑菜单兼并,也便是说无法把Excel表的菜单带入到咱们的程序中。这是相对于OLE完结办法的一大缺陷。幸亏供给了能够把东西栏增加进来的功用,通过东西栏能够进行许多Excel专有的操作。
- //下面这句能够将excel自身的东西调增加进来
- axWebBrowser1.ExecWB(SHDocVw.OLECMDID.OLECMDID_HIDETOOLBARS,
SHDocVw.OLECMDEXECOPT.OLECMDEXECOPT_DONTPROMPTUSER,refrefmissing,refrefmissing);
三、回到本文提出的问题,怎么操作嵌入的Excel?
首要需求理解,用WebBrowser“装载”Excel"表,实际上依然是在新的进程空间中运转Excel.exe。能够用使命管理器调查。因而,只需咱们能够获取Excel.Application目标,就能像上文一中所说的那样操作Excel数据。
幸亏能够通过WebBrowser的办法NavigateComplete供给的事情参数e来访问Excel.Application。
- publicvoidaxWebBrowser1_NavigateComplete2(objectsender,AxSHDocVw.DWebBrowserEvents2_NavigateComplete2Evente)
- {
- Objecto=e.pDisp;
- ObjectoDocument=o.GetType().InvokeMember("Document",BindingFlags.GetProperty,null,o,null);
- ObjectoApplication=o.GetType().InvokeMember("Application",BindingFlags.GetProperty,null,oDocument,null);
- //ObjectoName=o.GetType().InvokeMember("Name",BindingFlags.GetProperty,null,oApplication,null);
- //因为翻开的是excel文件,所以这儿的oApplication其实便是Excel.Application
- Excel.ApplicationeApp=(Excel.Application)oApplication;//这样就能够象上文中所述来操作Excel了。
- }
四、包括该webbrowser的C# form退出时分,怎么确保excel进程也退出?(拜见microsoft协助中心kb317109)
因为WebBrowser只不过是对Excel表的阅读,而Excel在独自的进程中运转。所以要确保对该Excel目标eApp及其相应的一切成员变量都开释引证,才干确保在Form退出时excel进程跟着退出。这一点在一个程序需求屡次翻开封闭excel表时尤为重要。
- Excel.ApplicationoApp;
- Excel.WorkbooksoBooks;
- Excel.WorkbookoBook;
- Excel.WorksheetoSheet;
- ...........
- privatevoidExcelExit()
- {
- NAR(oSheet);
- oBook.Close(False);
- NAR(oBook);
- NAR(oBooks);
- oApp.Quit();
- NAR(oApp);
- Debug.WriteLine("Sleeping...");
- System.Threading.Thread.Sleep(5000);
- Debug.WriteLine("EndExcel");
- }
- privatevoidNAR(Objecto)
- {
- try{System.Runtime.InteropServices.Marshal.ReleaseComObject(o);}
- catch{}
- finally{o=null;}
- }
通过实验,我发现除了开释这些变量以外,有必要把该axWebBroswer1也销销毁,Excel进程才退出。不然的话,即便让axWebBroser1去Navigate空内容"about:blank", excel进程依然不会退出。因而应该将axWebBroser1地点的C# form封闭掉,或许直接调用axWebBrowser1.Dispose
【修改引荐】
- 浅析C# XmlSerializer概念及效果
- C# XmlSerializer完结序列化浅析
- 浅析C# Xml Serializer的安全隐患
- C# XML序列化实例学习诠释
- 浅析XML序列化的优缺陷