一、首先简要回顾一下如何操作Excel表先要添加对Excel的引用。选择项目-〉添加引用-〉COM-〉添加MicrosoftExcel9.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而不想让用户操作时候,可以设置为falseapp.UserControl=true;Workbooksworkbooks=app.Workbooks;_Workbookworkbook=workbooks.Add(XlWBATemplate.xlWBATWorksheet);//根据模板产生新的workbook//_Workbookworkbook=workbooks.Add(c:\\a.xls);//或者根据绝对路径打开工作簿文件a.xlsSheetssheets=workbook.Worksheets;_Worksheetworksheet=(_Worksheet)sheets.get_Item(1);if(worksheet==null){statusBar1.Text=ERROR:worksheet==null;return;}=worksheet.get_Range(A1,Missing.Value);if(range1==null){statusBar1.Text=ERROR:range==null;return;}constintnCells=2345;range1.Value2=nCells;二、将Excel用户界面嵌入到自己的WindowsForm中软件开发网由于目前,C#和VB.net都不支持OLE技术(参见微软支持中心Info:304562),,所以只有使用WebBrowser控件来完成此功能。(以下方法参见微软支持中心Howto:304662)1、右击工具箱,选择自定义工具箱,添加COM组件,选择“MicrosoftWeb浏览器”(对应文件是\winnt\system32\shdocvw.dll),确定。在工具箱中将会出现文本为Explorer的WebBroser控件图标。2、在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.ApplicationExcel.ApplicationeApp=(Excel.Application)oApplication;//这样就可以象上文中所述来操作Excel了。}四、包含该WebBrowser的Form退出时候,如何确保Excel进程也退出?(参见Microsoft帮助中心KB317109)表的浏览,而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);(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所在的Form关闭掉,或者直接调用axWebBrowser1.Dispose();如果还是其它问题导致不能正常退出,就只有调用垃圾回收了。GC.Collect();1Excel对象微软的Excel对象模型包括了128个不同的对象,从矩形,文本框等简单的对象到透视表,图表等复杂的对象.下面我们简单介绍一下其中最重要,也是用得最多的四个对象。(1)Application对象。Application对象处于Excel对象层次结构的顶层,表示Excel自身的运行环境。(2)Workbook对象。Workbook对象直接地处于Application对象的下层,表示一个Excel工作薄文件。(3)Worksheet对象。Worksheet对象包含于Workbook对象,表示一个Excel工作表。(4)Range对象。Range对象包含于Worksheet对象,表示Excel工作表中的一个或多个单元格。2C#中的受管代码和非受管代码在.NET公用语言框架内运行的程序为受管代码。受管代码在程序中所有类型都受到严格检查,没有指针,对内存的管理完全由运行系统控制。受控状态下,编写程序更为容易,且更少出错,我们可以花更多的时间在解决实际问题上而不是在计算机语言问题上。相对而言,那些在.NET框架外运行的程序为非受管代码。比如:COM组件、ActiveX组件、Win32API函数、指针运算等。C#编程中在某些特定情况下,需要运用非受管代码,例如,要利用一个成熟的COM组件,或者调用一个API函数,或者用指针去编写实时/高效程序等。3VisualC#中调用Excel的COM组件一个.NET组件事实上是一个.NET下的DLL,它包含的不仅是运行程序本身,更重要的是包含这个DLL的描述信息(MetaData,即元数据),而一个COM组件是用其类库(TLB)储存其描述信息。这些COM组件都是非受管代码,要在VisualC#中使用这些非受管代码的COM组件,就必须把他们转换成受管代码的.NET组件。所以在用VisualC#调用Excel表格之前,必须完成从COM组件的非受管代码到受管代码的类库的转换。3.1将Excel的COM组件转换为.NET组件在项目中打开AddReference对话框,选择COM栏,之后在COM列表中找到“MicrosoftExcel9.0ObjectLibrary”(Office2000),然后将其加入到项目的References中即可。VisualC#.NET会自动产生相应的.NET组件文件,以后即可正常使用。这个转换形成.NET组件不能单独使用,它不过是以前的COM组件的一个外层包装,在.NET中可以通过这个外层包装去发现原来的COM组件并调用其相应的界面函数。所以它必须与原来的COM组件一起起作用。3.2VisualC#打开Excel表格事实上,在C#中使用一个经转换的COM组件和使用任何一个其它.NET组件完全一样。可以用new关键字创建一个经转换的COM组件,然后再像使用任何一个其它C#对象一样使用这个组件对象。在转换后的.NET组件中定义了一个命名空间Excel,在此命名空间中封装了一个类Application,这个类和启动Excel表格有非常重要的关系,在VisualC#中,只需要下列三行代码就可以完成打开Excel表格的工作,具体如下:Excel.Applicationexcel=newExcel.Application();//引用Excel对象excel.Application.Workbooks.Add(true);//引用Excel工作簿excel.Visible=true;//使Excel可视但此时的Excel表格是一个空的表格,没有任何内容,下面就来介绍如何往Excel表格中输入数据。3.3往Excel表格中输入数据在命名空间Excel中,还定义了一个类Cell,这个类所代表的就是Excel表格中的一个单元格。通过给Cell赋值,从而实现往Excel表格中输入相应的数据,下列代码功能是打开Excel表格,并且往表格输入一些数据。Excel.Applicationexcel=newExcel.Application();excel.Application.Workbooks.Add(true);excel.Cells[1,1]=FirstRowFirstC