千家信息网

如何简单实现C# form中嵌入并操作excel表

发表于:2024-11-17 作者:千家信息网编辑
千家信息网最后更新 2024年11月17日,如何简单实现C# form中嵌入并操作excel表,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。当我们实现from功能的时候需要把e
千家信息网最后更新 2024年11月17日如何简单实现C# form中嵌入并操作excel表

如何简单实现C# form中嵌入并操作excel表,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

当我们实现from功能的时候需要把excel表嵌入到自己程序的C# form中,给客户一个不用切换窗口的简单的操作界面,下面笔者就为你讲讲在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用户界面嵌入到自己的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。

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专有的操作。

  1. //下面这句可以将excel本身的工具调添加进来

  2. 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的C# 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所在的C# form关闭掉,或者直接调用axWebBrowser1.Dispose

关于如何简单实现C# form中嵌入并操作excel表问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注行业资讯频道了解更多相关知识。

C# 进程 工具 文件 控件 方法 程序 问题 支持 功能 对象 工具箱 时候 帮助 选择 不同 上文 内容 变量 工具栏 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 2018年国家网络安全宣传周活动的主题是什么 未成年人网络安全手抄报模板 xp开机后显示数据库 网络安全协会股票 一个软件开发的支付系统 沈阳软件开发公司那个好 丛台区网络安全线上线下 adhoc网络安全机制 华库安全数据库管理系统 数据库系统自动开发 网络安全工程师所从事的领域 如何登录虚拟机的数据库 软件开发属于应税服务吗 华三服务器网卡的管理地址 计算机网络技术专业介绍白话 安徽精英网络技术开发机构 智能终端软件开发课题 软件开发ui比例 网络技术是it 绘网络安全 画饭圈乱象文字 看视频学习网络安全的软件 网络安全教育板报弊端 几NF是数据库规范要求 网络安全事件应急指挥 aws 数据库入门教程 腾讯云服务器有什么限制么 什么是网络技术转让材料 理想学堂服务器连接失败怎么回事 湖南省学计算机软件开发月薪 数据库中关系运算的用法
0