网上比较多讲述如何操作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表格相关推荐

  1. 如何在 Vue 中导出数据至 Excel 表格 - 卡拉云

    本文首发:<如何在 Vue 中导出数据至 Excel 表格 - 卡拉云> 我们经常需要在 Vue 搭建的后台管理系统里导出数据到 Excel / CSV ,方便我们将数据共享给其他同学或在 ...

  2. python操作xls_python操作excel表格的方法

    这篇文章我们来讲一下在网站建设中,python操作excel表格的方法.本文对大家进行网站开发设计工作或者学习都有一定帮助,下面让我们进入正文. 说明:由于公司oa暂缺,人事妹子在做考勤的时候,需要通 ...

  3. 用NPOI、C#操作Excel表格生成班级成绩单

    在C#中利用NPOI操作Excel表格非常方便,几乎上支持所有的Excel表格本身所有的功能,如字体设置.颜色设置.单元格合并.数值计算.页眉页脚等等. 这里准备使用NPOI生成一个班级成绩单Exce ...

  4. 如何在Panel中嵌入子窗体

    文章目录 1 如何在Panel中嵌入子窗体 1.1 在Panel中嵌入子窗体的方法 1 如何在Panel中嵌入子窗体 1.1 在Panel中嵌入子窗体的方法 首先看嵌入前的效果: 点击按钮" ...

  5. html中看到php代码_如何在HTML中嵌入PHP代码

    如何在HTML中嵌入PHP代码 对于一个有经验的 PHP Web 开发者,在HTML中嵌入PHP代码是一件非常容易的事情.但是对于刚开始接触 PHP 编程语言的新手这就是一个问题.下面是小编为大家带来 ...

  6. 如何在C++中嵌入JAVA程序

    如何在C++中嵌入JAVA程序呢?现在的程序员,不再像以前一样,掌握一种编程语言就可以混得有模有样了,这里为大家讲的,就是C++与Java混合编程.局域网聊天软件举几个简单的例子,一个软件为了快速开发 ...

  7. 如何在PPT中嵌入交互式图表?LightningChart助力炫酷展示

    我们在PPT演示文稿中嵌入图表很容易,但嵌入交互式图表似乎就没听说过了,接下来我们就一起来看看通过交互式图表在PPT中展示病人心跳的效果: PPT中展示病人心跳 下方是一个实时地图在PPT中的展现实例 ...

  8. python模块xlwt怎么用不了_python中使用 xlwt 操作excel的常见方法与问题

    前言 python可以操作excel的模块不止一种,我习惯使用的写入模块是xlwt(一般都是读写模块分开的) python中使用xlwt操作excel非常方,和Java使用调框架apache poi相 ...

  9. python 编辑excel需要什么包_Python 中操作EXCEL表格的包

    今天,马云爸爸又来贡献金句了,比王健林公公一亿一个小目标还高,"一个月挣一二十个亿很难受!!!",作为在传统企业主要为电商部门提供数据分析的数据分析师,体验太深刻了. 双11前后, ...

最新文章

  1. Android JNI入门第五篇——Android.mk分析
  2. matlab从图表中提取数据
  3. 什么是python中子类父类_零基础入门:python中子类继承父类的__init__方法实例
  4. Ubuntu 12.04下安装GTK 2.24.10
  5. 原 Ubuntu使用VNC运行基于Docker的桌面系统
  6. [转载]Tomcat 6.0 安装配置
  7. MegaCli命令总结
  8. 莫烦python简历_Matplotlib画图教程
  9. SpringBoot 如何测试打包部署
  10. splay区间翻转(bzoj 3223: Tyvj 1729 文艺平衡树)
  11. 关于vue脚手架cli3.0版本的一篇有关配置的文章,可以借鉴
  12. Android直接回复通知
  13. 读书笔记:《Scrum 敏捷软件开发》
  14. 2021程序员笔记本电脑推荐
  15. 树莓派教程 - 1.5 树莓派GPIO库wiringPi 使用硬件串口ttyAMA0与ttyS0
  16. 星环科技TDS 2.4.0 发布: 数据开发、数据治理、数据运营套件能力再次升级
  17. 信息与通信工程——重要国际学术会议和国际顶级期刊(仅供参考)
  18. 20230221 git设置upstream
  19. Linux下安装配置MySQL5.7
  20. 苹果m1 ruby linner问题

热门文章

  1. Linux软件包增量升级,Linux增量更新jar包内容
  2. mysql服务器端的参数有很多_但是对于大多数初学者来说_mysql优化的重要参数 key_buffer_size table_cache...
  3. ios android安全性分析,Android与iOS的对比分析及Android安全技术的设计与实现
  4. mac 思科 链路聚合_TCP/IP协议栈-之-数据链路层分析
  5. 如何在OpenCV中为InRange阈值选择颜色的最佳HSV值
  6. LabVIEW设计自定义滚动条
  7. 力扣(LeetCode)刷题,简单题(第4期)
  8. NetworkManagementService介绍
  9. xk3190串口通讯JAVA开发包_常用品牌plc通讯协议汇总学习
  10. AR SDK引擎技术选型和使用实现方案