zoukankan      html  css  js  c++  java
  • C#如何在Form中嵌入并且操作Excel表格

    网上比较多讲述如何操作excel表的文章,但都是启动excel的窗口来打开excel数据文件。有时候需要把excel表嵌入到自己程序的form中,给客户一个不用切换窗口的操作界面,似乎更好。这在vc中用ole技术很容易实现,但是在c#中方法就不一样啦。下面将就此进行阐述。

     先要添加对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();

  • 相关阅读:
    POJ 3041 Asteroids 最小点覆盖 == 二分图的最大匹配
    POJ 3083 Children of the Candy Corn bfs和dfs
    POJ 2049 Finding Nemo bfs 建图很难。。
    POJ 2513 Colored Sticks 字典树、并查集、欧拉通路
    POJ 1013 Counterfeit Dollar 集合上的位运算
    POJ 2965 The Pilots Brothers' refrigerator 位运算枚举
    无聊拿socket写的100以内的加法考试。。。
    POJ 1753 Flip Game
    初学socket,c语言写的简单局域网聊天
    汇编语言 复习 第十一章 标志寄存器
  • 原文地址:https://www.cnblogs.com/zhiming/p/1278404.html
Copyright © 2011-2022 走看看